无法序列化 class org.apache.hadoop.io.DoubleWritable - MongoDB Hadoop Connector + Spark + Python
Can't serialize class org.apache.hadoop.io.DoubleWritable - MongoDB Hadoop Connector + Spark + Python
关注这个好东西blog post I found the github repo of his code and I cloned,让它更容易为其他人所用。
我创建了一个 script 到:
- 下载并构建 spark。
- 下载、应用补丁并构建 mongodb hadoop connector。
- 下载 mongodb java driver v3.1.1 jar.
- 将最少的必要罐子放在一起
- 下载sample file
- 将其导入 mongodb 集合
- 安装一个必要的python库pytz
一切准备就绪运行。
python script基本上是这样的:
config = {"mongo.input.uri": "mongodb://localhost:27017/marketdata.minbars"}
inputFormatClassName = "com.mongodb.hadoop.MongoInputFormat"
keyClassName = "org.apache.hadoop.io.Text"
valueClassName = "org.apache.hadoop.io.MapWritable"
minBarRawRDD = sc.newAPIHadoopRDD(inputFormatClassName, keyClassName, valueClassName, None, None, config)
minBarRDD = minBarRawRDD.values()
import calendar, time, math
dateFormatString = '%Y-%m-%d %H:%M'
groupedBars = minBarRDD.sortBy(lambda doc: str(doc["Timestamp"])).groupBy(lambda doc:
(doc["Symbol"], math.floor(calendar.timegm(time.strptime(doc["Timestamp"], dateFormatString)) / (5*60))))
def ohlc(grouping):
# some
config["mongo.output.uri"] = "mongodb://localhost:27017/marketdata.fiveminutebars"
outputFormatClassName = "com.mongodb.hadoop.MongoOutputFormat"
# resultRDD.saveAsNewAPIHadoopFile("file:///placeholder", outputFormatClassName, None, None, None, None, config)
最后一行评论了当我 运行 spark-ohlcbars-example.submit.sh 脚本时一切都完美无误。
但是一旦我取消注释 onder 中的最后一行以尝试将数据保存回 mongodb,就会引发异常
Can't serialize class org.apache.hadoop.io.DoubleWritable
我猜想从 Python > Java > MongoDB 格式转换的过程在尝试序列化时会丢失并且不起作用。
你可以看到 issue in the git repository
希望社区有办法解决这个问题。你们知道如何克服这个问题吗?
通过在提交哈希 affad1b7.
上使用 pymongo_spark 解决了该特定问题
我将文件复制到我的项目中,并在主 python 脚本中添加了 3 行代码:
import pymongo_spark
pymongo_spark.activate()
...
# at the end of the script
resultRDD.saveToMongoDB(config["mongo.output.uri"])
您可以在 github commit
上看到完整的差异
关注这个好东西blog post I found the github repo of his code and I cloned,让它更容易为其他人所用。
我创建了一个 script 到:
- 下载并构建 spark。
- 下载、应用补丁并构建 mongodb hadoop connector。
- 下载 mongodb java driver v3.1.1 jar.
- 将最少的必要罐子放在一起
- 下载sample file
- 将其导入 mongodb 集合
- 安装一个必要的python库pytz
一切准备就绪运行。
python script基本上是这样的:
config = {"mongo.input.uri": "mongodb://localhost:27017/marketdata.minbars"}
inputFormatClassName = "com.mongodb.hadoop.MongoInputFormat"
keyClassName = "org.apache.hadoop.io.Text"
valueClassName = "org.apache.hadoop.io.MapWritable"
minBarRawRDD = sc.newAPIHadoopRDD(inputFormatClassName, keyClassName, valueClassName, None, None, config)
minBarRDD = minBarRawRDD.values()
import calendar, time, math
dateFormatString = '%Y-%m-%d %H:%M'
groupedBars = minBarRDD.sortBy(lambda doc: str(doc["Timestamp"])).groupBy(lambda doc:
(doc["Symbol"], math.floor(calendar.timegm(time.strptime(doc["Timestamp"], dateFormatString)) / (5*60))))
def ohlc(grouping):
# some
config["mongo.output.uri"] = "mongodb://localhost:27017/marketdata.fiveminutebars"
outputFormatClassName = "com.mongodb.hadoop.MongoOutputFormat"
# resultRDD.saveAsNewAPIHadoopFile("file:///placeholder", outputFormatClassName, None, None, None, None, config)
最后一行评论了当我 运行 spark-ohlcbars-example.submit.sh 脚本时一切都完美无误。
但是一旦我取消注释 onder 中的最后一行以尝试将数据保存回 mongodb,就会引发异常
Can't serialize class org.apache.hadoop.io.DoubleWritable
我猜想从 Python > Java > MongoDB 格式转换的过程在尝试序列化时会丢失并且不起作用。
你可以看到 issue in the git repository
希望社区有办法解决这个问题。你们知道如何克服这个问题吗?
通过在提交哈希 affad1b7.
上使用 pymongo_spark 解决了该特定问题我将文件复制到我的项目中,并在主 python 脚本中添加了 3 行代码:
import pymongo_spark
pymongo_spark.activate()
...
# at the end of the script
resultRDD.saveToMongoDB(config["mongo.output.uri"])
您可以在 github commit
上看到完整的差异