簡體   English   中英

使用mongo-hadoop連接器的Hadoop流失敗

[英]Hadoop streaming with mongo-hadoop connector fails

我創建了這個從HDFS讀取一堆JSON文件的作業,並嘗試將它們加載到MongoDB中。 它只是地圖腳本,因為我不需要在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}"

你猜怎么了? 它就像一個魅力!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM