我创建了这个作业,从hdfs读取一堆json文件,并尝试将它们加载到mongodb中。这只是map脚本,因为我不需要在reduce步骤上进行任何额外的处理。我正在尝试使用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)
不仅如此,我还使用pymono-hadoop包在python中创建了相同脚本的一个版本。作业失败并出现相同的错误。
在为失败的任务在日志中进一步挖掘之后,我发现实际的错误是:
2016-06-13 16:13:11,778 INFO [Thread-12] com.mongodb.hadoop.io.BSONWritable: No Length Header available.java.io.EOFException
问题是它会无声地失败,我在Map器中添加了一些日志记录,但从外观上看,Map器甚至没有被调用。我是这样称呼这份工作的:
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中。。。
1条答案
按热度按时间46scxncf1#
我想知道为什么我一开始不试试这个:
你猜怎么着?它就像一个魔咒!