在Hadoop中转换JSON文件

-1 投票
1 回答
1271 浏览
提问于 2025-04-18 18:42

我有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"

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

因为我只需要把很多文件解析成另一种形式;我想我不需要任何归约步骤。我可以简单地写一个映射器,它:

  1. 从标准输入读取数据
  2. 逐行读取标准输入
  3. 根据我的要求转换每一行
  4. 输出到标准输出

然后我可以只用一个映射器和0个归约器来运行Hadoop。

这个方法看起来对吗?我真的能正确使用集群吗,还是说这样做就跟在单台主机上运行Python脚本一样糟糕?

1 个回答

0

你说得对,在这种情况下,你不需要任何 reducer,因为你的 mapper 输出的结果就是你想要的,所以你应该把 reducer 的数量设置为 0。当你告诉 Hadoop 你的 JSON 数据的输入路径时,它会自动给每个 mapper 分配随机数量的 JSON 行,mapper 会处理这些数据,然后你需要把结果发回上下文,这样它才能把值存储到输出路径中。这种方法是正确的,而且这个任务是完全可以并行处理的,所以如果你的集群里有不止一台机器,并且配置也正确,它就能充分利用集群的资源,运行速度会比在单台机器上快很多。

撰写回答