在Hadoop中转换JSON文件
我有100GB的JSON文件,每一行看起来像这样:
{"field1":100, "field2":200, "field3":[{"in1":20, "in2":"abc"},{"in1":30, "in2":"xyz"}]}
(其实内容要复杂得多,但这就作为一个小示例吧。)
我想把它处理成每一行看起来像这样:
{"field1":100, "field2":200, "abc":20, "xyz":30}
我对Hadoop非常陌生,只想知道我是不是走在正确的路上:
参考这个链接:
http://www.glennklockwood.com/di/hadoop-streaming.php对于常规的应用,我会在Python中创建一个映射器和一个归约器,然后用类似这样的方式执行:
hadoop \
jar /opt/hadoop/contrib/streaming/hadoop-streaming-1.0.3.jar \
-mapper "python $PWD/mapper.py" \
-reducer "python $PWD/reducer.py" \
-input "wordcount/mobydick.txt" \
-output "wordcount/output"
现在让我知道我是不是在正确的轨道上:
因为我只需要把很多文件解析成另一种形式;我想我不需要任何归约步骤。我可以简单地写一个映射器,它:
- 从标准输入读取数据
- 逐行读取标准输入
- 根据我的要求转换每一行
- 输出到标准输出
然后我可以只用一个映射器和0个归约器来运行Hadoop。
这个方法看起来对吗?我真的能正确使用集群吗,还是说这样做就跟在单台主机上运行Python脚本一样糟糕?
1 个回答
0
你说得对,在这种情况下,你不需要任何 reducer,因为你的 mapper 输出的结果就是你想要的,所以你应该把 reducer 的数量设置为 0。当你告诉 Hadoop 你的 JSON 数据的输入路径时,它会自动给每个 mapper 分配随机数量的 JSON 行,mapper 会处理这些数据,然后你需要把结果发回上下文,这样它才能把值存储到输出路径中。这种方法是正确的,而且这个任务是完全可以并行处理的,所以如果你的集群里有不止一台机器,并且配置也正确,它就能充分利用集群的资源,运行速度会比在单台机器上快很多。