2013-07-12 23 views
1

我有几十个全天空地图,二进制格式(FITS)每个大约有600MB。在全天空地图上处理源处理hadoop

对于每张天空地图,我已经有了几千个来源的位置目录,即恒星,星系,无线电源。

对于每个源,我想:

  • 打开整个天空地图
  • 提取相关的部分,通常是20MB以下
  • 对它们运行的​​一些统计数据
  • 聚集输出到目录

我想运行hadoop,可能使用python通过接口streaming进行并行处理。

我觉得输入到映射器应该是目录中的每个记录, 那么python映射器可以打开全天空图,做加工和打印输出到stdout

  1. 这是一个合理的方法吗?
  2. 如果是这样,我需要能够配置hadoop,以便将完整天空图本地复制到正在处理其来源之一的节点。我怎样才能做到这一点?
  3. 此外,将输入数据提供给hadoop的最佳方法是什么?对于每个源我有一个参考全天空地图,经度和纬度

回答

2

虽然听起来不像几十个天空地图是一个非常大的数据集,我已经成功地使用Hadoop作为一种编写分布式应用程序/脚本的简单方法。

对于您所描述的问题,我会尝试使用Pydoop实施解决方案,具体为Pydoop Script(完整免责声明:我是Pydoop开发人员之一)。

您可以设置一个作业,输入想要处理的天空地图的部分列表,以某种文本格式序列化,每行一个记录。每个地图任务都应该处理其中的一个;您可以使用标准的NLineInputFormat轻松实现分割。

只要地图任务可以访问存储该地图的文件系统,您就不需要将天空地图本地复制到所有节点。使用pydoop.hdfs模块,地图功能可以读取需要处理的天空地图部分(给定它作为输入接收的坐标),然后按照您所说的发出统计数据,以便它们可以汇总在减速器中。 pydoop.hdfs可以从“标准”安装的文件系统和HDFS中读取。

虽然问题域是完全无关的,这个应用程序可以作为一个例子:

https://github.com/ilveroluca/seal/blob/master/seal/dist_bcl2qseq.py#L145 

它采用了同样的策略,准备“坐标”的列表中进行处理,它们序列化到一个文件,然后启动一个简单的pydoop作业,将该文件作为输入。

希望有帮助!