【发布时间】:2013-01-15 08:38:45
【问题描述】:
我在 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 集群来加快速度。
按照我的思路:
- 将源 SegY 文件拆分到集群上(这样大文件的一小块可用于在每个节点上进行处理)
- 可能,使用 Hadoop Streaming,调用 SeismicUnix 命令来处理每个节点上的小块
- 将处理后的文件聚合成一个大的 SegY 文件作为输出
技术问题/挑战:
- 源 SegY 文件需要先加载到 HDFS 上,然后才能用于不同的节点进行处理。我该怎么做 - 创建一个 SequenceFile 或其他东西? SeismicUnix 读取 SegY 文件,将其转换为自定义格式,然后进行处理!
- 如第二个命令所示,不同的操作(命令)按照它们想要执行的顺序进行管道传输,例如 suhilb |苏克现在,这可以在一个映射器中发生吗,还是我需要为 suhilb 创建一个映射器并将其输出提供给 suaccor - 这里非常困惑
- 假设处理完成并且现在创建了每个节点 output.segy(这个假设是否正确???),我如何合并这些文件(这里完全没有头绪)?
我读过一些关于 Google 的 FlumeJava 的文章,认为它是一种解决方案,但我想坚持只使用 Hadoop,即目前没有库方法。
抱歉,如果我没有深入/简洁地询问我的问题 - 实际上,我无法清楚地了解设计/代码!
【问题讨论】:
-
建议阅读
Hadoop - The Definitive Guide书 - 你的困惑将被清除:) -
@Praveen 我正在阅读这本书,但我对自定义格式 + 流媒体的情况一无所知。
-
我很想知道您是否曾进一步解决这个问题?
-
@mortenbpost 不是真的!实际上,当我将 SegY 文件转换为 SequenceFile 时,SegY 格式被误导/损坏了,这是一个问题。
标签: hadoop mapreduce hadoop-streaming