Почему куст не выбирает SerDe JAR во время операций соединения?
Версия hadoop: Hadoop 2.6.0-cdh5.12.2 версия куста: Hive 1.1.0-cdh5.12.2
Рассмотрите две таблицы: продукты - хранит идентификатор продукта и другие подробности о деятельности продукта - хранит идентификатор_пользователя, идентификатор_продукта, который сообщает, какой пользователь приобрел данный продукт, и другие детали транзакции.
перед созданием этих таблиц я добавил SerDe JAR, используя следующую команду: add jar /home/ManojKumarM_R/json-serde-1.3-jar-with-dependencies.jar;
CREATE EXTERNAL TABLE IF NOT EXISTS products (id string,name string,reseller
string,category string,price Double,discount Double,profit_percent Double)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location
"/user/ManojKumarM_R/ProductsMergeEnrichOut";
пример данных в / user / ManojKumarM_R / ProductsMergeEnrichOut
{"Id": "P101", "Name": "Round Tee", "Reseller": "Nike", "Category": "Top Wear", "Price": 2195.03, "Discount": 21.09, "Profit_percent": 23,47}
{"Id": "P102", "Name": "Half Shift", "Reseller": "Nike", "Category": "Top Wear", "Price": 1563.84, "Discount": 23.83, "Profit_percent": 17,12}
CREATE EXTERNAL TABLE IF NOT EXISTS activity (product_id string,user_id
string,cancellation boolean ,return boolean,cancellation_reason
string,return_reason string, order_date timestamp, shipment_date timestamp,
delivery_date timestamp , cancellation_date timestamp, return_date
timestamp) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location
"/user/ManojKumarM_R/ActivityMergeEnrichOut/";
пример данных в / user / ManojKumarM_R / ActivityMergeEnrichOut /
{"Product_id": "P117", "User_id": "U148", "Cancellation": "TRUE", "Return":"NA", "Cancellation_reason": "Duplicate Product", "Return_reason":"NA", "Order_date": "2016-02-12", "Shipment_date":"NA", "Delivery_date":"NA", "Cancellation_date": "2018-05-20", "Return_date":"NA"}
{"Product_id": null, "User_id": "U189", "Cancellation": "FALSE", "Return": "FALSE", "Cancellation_reason":"NA", "Return_reason":"NA", "Order_date": "2017-04-22", "Дата отгрузки":"2017-05-05", "Дата доставки":"2017-09-09", "Дата отмены":"NA", "Дата возврата":"NA"}
создание таблицы прошло успешно,
select * from products;
&
select * from activity;
запросы работают абсолютно нормально, что означает, что SerDe JAR выбирается во время запроса select.
Однако, когда я запускаю ниже запрос на соединение: я хочу объединить эти две таблицы в общем столбце, который является Product Id
SELECT a.user_id, p.category FROM activity a JOIN products p
ON(a.product_id = p.Id);
это терпит неудачу с сообщением ниже
Журнал выполнения по адресу: /tmp/ManojKumarM_R/ManojKumarM_R_20181010124747_690490ae-e59f-4e9d-9159-5c6a6e28b951.log 2018-10-10 12:47:43 Запуск запуска локальной задачи для обработки присоединения к карте; максимальный объем памяти = 2058354688 Ошибка выполнения с состоянием выхода: 2 Получение информации об ошибке
Задача не выполнена! Идентификатор задачи: Этап 5
Войти /tmp/ManojKumarM_R/ManojKumarM_R_20181010124747_690490ae-e59f-4e9d-9159-5c6a6e28b951.log
2018-10-10 12: 47: 43,984 ОШИБКА [main]: mr.MapredLocalTask (MapredLocalTask.java:executeInProcess(398)) - Ошибка времени выполнения куста: не удалось сопоставить локальную работу org.apache.hadoop.hive.ql.metadata.HiveException: Ошибка с исключением java.lang.ClassNotFoundException: org.openx.data.jsonserde.JsonSerDejava.lang.RuntimeException: java.lang.ClassNotFoundException: org.openx.data.jsonserde.JsonSerDe в org.pache.h.plan.TableDesc.getDeserializerClass(TableDesc.java:73)
это означает, что Hive не может найти JsonSerDe JAR, хотя я добавил JAR во время этой сессии Hive, и запросы selct работали нормально. Если кто-то решил подобную проблему, пожалуйста, дайте мне знать, я не уверен, что Hive просматривает разные каталоги для JAR-файлов во время операции JOIN.
1 ответ
Hive не вызывает задания MR для всех запросов "SELECT *". В вашем случае файл JAR не распространяется по кластерам при вызове фактического задания MR (запрос JOIN). Поэтому я бы порекомендовал вам повторно проверить разрешение на доступ к папке / файлу JAR или переместить файл в путь к библиотеке HIVE, а также обновить файл Hive-site.xml. Есть пара предыдущих постов о том, как добавить файл JAR HIVE, и вы также можете это проверить.
Предыдущий пост.