0

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

我正在尝试使用名为SeismicUnix的软件在 Linux 机器上处理一个大(超过 10GB)的SegY文件

列出了我在 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 文件,该文件将作为输出

技术查询/挑战:

  1. 源 SegY 文件需要先加载到 HDFS 上,然后才能提供给不同的节点进行处理。我该怎么做 - 创建一个 SequenceFile 或其他东西?SeismicUnix 读取 SegY 文件,将其转换为自定义格式,然后对其进行处理!
  2. 如第二个命令所示,不同的操作(命令)按照它们想要执行的顺序进行管道传输,例如 suhilb | 苏克 现在,这可以在一个映射器中发生吗,还是我需要为 suhilb 创建一个映射器并将其输出提供给 suaccor - 这里非常困惑
  3. 假设处理完成并且现在创建了每个节点 output.segy(这个假设是否正确???),我如何合并这些文件(这里完全没有头绪)?

我读了一些关于谷歌的 FlumeJava 的文章,认为它是一种解决方案,但我想坚持只使用 Hadoop,即目前没有库方法。

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

4

1 回答 1

0

回答与您的查询相对应的点,

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

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

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

于 2013-01-15T10:18:26.073 回答