我在Apache Hadoop 0.2中编写了一些MapReduce程序。x版本-简单来说,我是初学者。
我正在尝试使用一个名为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集群来加快速度。
按照我的思维过程:
- 将源SegY文件分割到集群上(以便大文件的一小块可用于每个节点上的处理)
- 可能,使用Hadoop Streaming,调用SeismicUnix命令在每个节点上处理小块
- 将处理过的文件聚合成一个大的SegY文件,这将是输出
技术查询/挑战:
- 源SegY文件需要首先加载到HDFS,然后才能被不同的节点处理。我该如何做到这一点-创建一个SequenceFile或其他东西?SeismicUnix读取一个SegY文件,将其转换为自定义格式,然后处理它!
- 如第二个命令所示,不同的操作(命令)按照他们想要执行的顺序被管道化,例如suhilb | suaccor。现在,这可以在一个映射器中发生吗?或者我需要为suhilb创建一个映射器并将其输出提供给suaccor -这里非常混乱
- 假设处理完成,每个节点现在输出。(这个假设是正确的吗??),我如何合并这些文件(这里完全没有头绪)?
我读了一些关于Google的FlumeJava的文章,认为它是一个解决方案,但我想坚持只使用hadoop,即目前没有库的方法。
抱歉,如果我没有深入/简洁地问我的问题——实际上,我不能得到一个清晰的设计/代码的想法!
回答你的问题,
-
如果你知道软件使用什么自定义格式来转换SegY文件,你可以使用相同的格式在
HDFS
上存储文件。要加载到HDFS
中,您应该查看开源工具,如Sqoop。 -
可以使用映射器按顺序执行各种操作。因此,不同的映射器将并行地对输入的不同块执行操作。
-
要合并输出文件,请尝试使用根据密钥排序
output.segy
的减速器。您使用的示例键可以是文件的名称。因此,各种输出文件的所有数据被路由到一个reducer,从而生成一个输出部分-r - 000文件。