mongodb - 使用 mongo-hadoop 连接器的 Hadoop 流式传输失败

标签 mongodb perl hadoop language-agnostic hadoop-streaming

我创建了这个作业,它从 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

问题是它无声地失败了,我已经在映射器中添加了一些日志记录,但从看起来映射器甚至没有被调用。这就是我对工作的称呼:

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 中......

最佳答案

我想知道我为什么不首先尝试这个:

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}"

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

关于mongodb - 使用 mongo-hadoop 连接器的 Hadoop 流式传输失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794896/

相关文章:

mongodb - HDFS 与 GridFS : When to use which?

hadoop - 从 Kafka 读取并写入 parquet 中的 hdfs

ruby - 使用 mongodb ruby​​ 驱动程序进行带参数的计数操作

perl - 是否有用于为给定列表创建 CDF 的 CPAN 模块?

perl - 如何在 perl cgi-bin 脚本中使用 utf-8?

perl - 在 Perl 中,如何使用专用子例程按其值对词法散列进行排序?

node.js - Mongoose create - 创建包含其他对象的对象

node.js - 更新 mongoDB 中嵌套文档中的值

mongodb - `$eq` 运算符是否适用于数组点表示法?

hadoop - HIVE/HiveQL 获取最大计数