Сбой улья при предложении where

#mongodb #hadoop #hive #emr

#mongodb #hadoop #улей #эми

Вопрос:

Я пытаюсь заставить работать настройку hive-hadoop-mongo. Я импортировал данные в mongodb из файла json, затем я создал как внутренние, так и внешние таблицы в hive, которые подключаются к mongo:

 CREATE EXTERNAL TABLE reviews(
    user_id STRING, 
    review_id STRING, 
    stars INT, 
    date1 STRING,
    text STRING,
    type STRING,
    business_id STRING
     )
    STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
    WITH SERDEPROPERTIES('mongo.columns.mapping'='{"date1":"date"}')
    TBLPROPERTIES('mongo.uri'='mongodb://localhost:27017/test.reviews');
 

Эта часть работает нормально, потому что запрос select all ( select * from reviews ) выводит все, как и должно быть. Но когда я делаю что-то с предложением where ( select * from reviews where stars=4 например), улей выходит из строя.

У меня есть следующие банки, которые добавляются при запуске hive:

 add jar mongo-hadoop.jar;
add jar mongo-java-driver-3.3.0.jar;
add jar mongo-hadoop-hive-2.0.1.jar;
 

И если это имеет какое-либо отношение к делу, я использую для этого EMR-кластер Amazon, и я подключен через ssh.

Спасибо за всю помощь

Вот ошибка, которую выдает куст:

 Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.exec.Utilities.deserializeExpression(Ljava/lang/String;)Lorg/apache/hadoop/hive/ql/plan/ExprNodeGenericFuncDesc;
    at com.mongodb.hadoop.hive.input.HiveMongoInputFormat.getFilter(HiveMongoInputFormat.java:134)
    at com.mongodb.hadoop.hive.input.HiveMongoInputFormat.getRecordReader(HiveMongoInputFormat.java:103)
    at org.apache.hadoop.hive.ql.exec.FetchOperator$FetchInputFormatSplit.getRecordReader(FetchOperator.java:691)
    at org.apache.hadoop.hive.ql.exec.FetchOperator.getRecordReader(FetchOperator.java:329)
    at org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:455)
    at org.apache.hadoop.hive.ql.exec.FetchOperator.pushRow(FetchOperator.java:424)
    at org.apache.hadoop.hive.ql.exec.FetchTask.fetch(FetchTask.java:144)
    at org.apache.hadoop.hive.ql.Driver.getResults(Driver.java:1885)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:252)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:183)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:399)
    at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:776)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:714)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
 

Ответ №1:

Создайте таблицу, как показано ниже, и проверьте.

 CREATE [EXTERNAL] TABLE <tablename>
(<schema>)
ROW FORMAT SERDE 'com.mongodb.hadoop.hive.BSONSerDe'
[WITH SERDEPROPERTIES('mongo.columns.mapping'='<JSON mapping>')]
STORED AS INPUTFORMAT 'com.mongodb.hadoop.mapred.BSONFileInputFormat'
OUTPUTFORMAT 'com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat'
[LOCATION '<path to existing directory>'];
 

Вместо использования обработчика хранилища для чтения, сериализации, десериализации и вывода данных из объектов улья в объекты BSON, отдельные компоненты перечислены отдельно. Это связано с тем, что использование обработчика хранилища имеет слишком много негативных последствий при работе с собственной файловой системой HDFS

Комментарии:

1. Сейчас я получаю эту ошибку: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.io.IOException No FileSystem for scheme: mongodb)

2. В связи с этим, будет ли это означать, что hive будет считывать файлы дампа mongodb вместо прямого запроса mongo?

Ответ №2:

Я вижу

 WITH SERDEPROPERTIES('mongo.columns.mapping'='{"date1":"date"}')
 

и вы запрашиваете звезды столбцов, которые не сопоставлены.

Комментарии:

1. В документации говорится, что сопоставление является необязательным, но, чтобы быть уверенным, я все сопоставил. Я все еще получаю ту же ошибку.

Ответ №3:

Я встретил этот probelem в нашем кластере.

Версия кластерного улья выше, чем версия в mongo-hive (которая равна 1.2.1)

Старый класс org.apache.hadoop.hive.ql.exec.Utilities.deserializeExpression был переименован в org.apache.hadoop.hive.ql.exec.SerializationUtilities.deserializeExpression

Вам нужно перестроить jar самостоятельно.