2016-06-13 92 views
3

我创建了这个作业,它从HDFS读取一堆JSON文件并尝试将它们加载到MongoDB中。这只是地图脚本,因为我不需要任何额外的处理步骤。我正在尝试使用mongo-hadoop连接器。Hadoop使用mongo-hadoop连接器流式传输失败

该脚本使用Perl编写并配置给群集中的所有节点,并配置了所有其他依赖项。该脚本以二进制模式发出原始JSON文件的BSON序列化版本。

因为某些原因作业失败,出现以下错误:

Error: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to com.mongodb.hadoop.io.BSONWritable 
    at com.mongodb.hadoop.streaming.io.MongoInputWriter.writeValue(MongoInputWriter.java:10) 
    at org.apache.hadoop.streaming.PipeMapper.map(PipeMapper.java:106) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162) 

不仅如此,但我使用Python中的pymono-Hadoop的包创建一个版本相同的脚本。作业失败并出现相同的错误。

在日志中失败的任务挖一点点后,我发现,实际的错误是:

2016-06-13 16:13:11,778 INFO [Thread-12] com.mongodb.hadoop.io.BSONWritable: No Length Header available.java.io.EOFException 

的问题是,它静静地失败,我已经添加了一些记录在映射器,但从它看起来映射器甚至没有被调用。这就是我打电话给我的工作:

yarn jar /usr/hdp/2.4.0.0-169/hadoop-mapreduce/hadoop-streaming.jar \ 
    -libjars /opt/mongo-hadoop/mongo-hadoop-core-1.5.2.jar,/opt/mongo-hadoop/mongo-hadoop-streaming-1.5.2.jar,/opt/mongo-hadoop/mongodb-driver-3.2.2.jar \ 
    -D mongo.output.uri="${MONGODB}" \ 
    -outputformat com.mongodb.hadoop.mapred.MongoOutputFormat \ 
    -jobconf stream.io.identifier.resolver.class=com.mongodb.hadoop.streaming.io.MongoIdentifierResolver \ 
    -io mongodb \ 
    -input "${INPUT_PATH}" \ 
    -output "${OUTPUT_PATH}" \ 
    -mapper "/opt/mongo/mongo_mapper.py" 

我在做什么错?似乎没有其他方式来获得进入HDFS数据的MongoDB ...

+0

您应该添加更新并回答问题的答案。如果有人在搜索中发现你的问题,他们将会有更轻松的时间。 – grochmal

+0

谢谢。完成! –

回答

1

我不知道我为什么不试试这个摆在首位:

OUTPUT_PATH=`mktemp -d` 

yarn jar /usr/hdp/2.4.0.0-169/hadoop-mapreduce/hadoop-streaming.jar \ 
    -D mapred.job.name="${BUILD_TAG}" \ 
    -D mapred.job.queue.name="sr" \ 
    -input "${INPUT_PATH}" \ 
    -output "${OUTPUT_PATH}" \ 
    -mapper "/usr/bin/mongoimport -h ${MONGODB_HOST} -d ${MONGODB_DATABASE} -c ${MONGODB_COLLECTION}" 

你猜怎么着?它像一个魅力!