在Hadoop中转换JSON文件

时间:2014-08-27 12:56:07

标签: python hadoop hadoop-streaming

我有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中创建一个mapper和reducer,并使用类似的方式执行它:

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"

现在让我知道我是否走在正确的轨道上:

因为我只需要将很多文件解析成另一种形式;我想我不需要任何减少步骤。我可以简单地写一个mapper:

  1. 从stdin
  2. 获取输入
  3. 逐行读取标准
  4. 根据我的规格转换每一行
  5. 输出到stdout
  6. 然后我可以使用mapper和0 redurs来运行hadoop。

    这种方法看起来是否正确?我是否会正确使用群集,或者这会像在单个主机上运行Python脚本一样糟糕吗?

1 个答案:

答案 0 :(得分:0)

你是对的,在这种情况下你不需要任何减速器,你的映射器的输出就是你想要的,所以你应该将减速器的数量设置为0.当你告诉Hadoop输入路径你的JSON数据是,它将自动为每个映射器提供随机数量的JSON行,映射器将处理这些行,您需要将其发送到上下文,以便将值存储在输出路径中。该方法是正确的,并且此任务是100%可并行化的,因此如果群集中有多台计算机且配置正确,则应充分利用群集,并且运行速度比在单个群集上运行速度快得多主机。