Hadoop - 需要基本+流媒体指导

时间:2013-01-15 08:38:45

标签: hadoop mapreduce hadoop-streaming

我在Apache Hadoop 0.2.x版本中编写了一些MapReduce程序 - 简单来说,我是初学者。

我正在尝试使用名为SegY

的软件在Linux机器上处理大型(超过10GB)SeismicUnix文件

列出了我在Linux机器上执行的基本命令:

//Read SegY file and convert to custom format (.su file)

segyread tape=input.sgy verbose=1 endian=0 | segyclean >input.su


//PIPE-SEPARATE the processing commands viz. suhilb and suaccor
suhilb | suaccor ntout=1001 sym=0 < Noise1_10.su > output.su


//Create headers for converting back to SegY format
segyhdrs < output.su bfile=binary hfile=header


//Create the final output file in SegY format
segywrite <output.su tape=output.segy buff=1 conv=1 bfile=binary hfile=header

这些步骤在一台机器上需要很长时间,因此,已经设置了一个Apache Hadoop集群来加快速度。

根据我的思考过程:

  1. 将源SegY文件拆分到群集上(以便大型文件的一小部分可用于在每个节点上进行处理)
  2. 可能使用Hadoop Streaming,调用SeismicUnix命令来处理每个节点上的小块
  3. 将处理过的文件聚合成一个大的SegY文件,该文件将作为输出
  4. 技术疑问/挑战:

    1. 源SegY文件需要首先加载到HDFS上,然后才能用于不同的节点进行处理。我该怎么做 - 创建一个SequenceFile或其他东西? SeismicUnix读取一个SegY文件,将其转换为自定义格式然后进行处理!
    2. 如第二个命令所示,不同的操作(命令)按照想要执行的顺序进行管道输送,例如suhilb | suaccor。现在,这可以在一个映射器中发生,还是我需要为suhilb创建一个映射器并将其输出提供给suaccor - 这里非常困惑
    3. 假设处理完成并且每个节点现在都是output.segy(这个假设是正确的???),我如何合并这些文件(这里完全无能为力)?
    4. 我读了一下Google的FlumeJava认为它作为一种解决方案,但我想坚持使用Hadoop,即现在没有库方法。

      道歉,如果我没有深入/简洁地询问我的问题 - 实际上,我无法清楚地了解设计/代码!

1 个答案:

答案 0 :(得分:0)

回答与您的查询相对应的分数,

  1. 如果您知道软件用于转换SegY文件的自定义格式,您可以使用相同的格式在HDFS上存储文件。要加载到HDFS,您应该查看像Sqoop这样的开源工具。

  2. 您可以使用映射器按顺序执行各种操作。因此,不同的映射器将并行地对输入的不同块执行操作。

  3. 要合并输出文件,请尝试使用reducer,它根据键对output.segy进行排序。您使用的示例键可以是文件的名称。因此,各种输出文件的所有数据都被路由到一个reducer,从而生成一个输出部分-r-000文件。