如何将大型xml文件解压缩到一个HDFS目录中

时间:2017-07-04 12:09:46

标签: hadoop apache-spark mapreduce hdfs yarn

我需要从HDFS目录加载Zip文件,将其解压缩并在包含所有解压缩文件的单个目录中写回HDFS。这些文件是XML,大小以GB为单位。

首先,我通过编写自定义InputFormat和Custom RecordReader来解压缩文件并将这些内容提供给mapper,然后每个映射器进程并使用MultiOutput Format写入HDFS,从而实现了Map-Reduce程序。地图减少了在YARN上运行的作业。

当输入大小以MB为单位时,这种方法可以正常工作并能够在HDFS中以解压缩格式获取文件,但是当输入大小为GB时,作业无法写入并最终出现以下错误。 / p>

17/06/16 03:49:44 INFO mapreduce.Job:  map 94% reduce 0%
17/06/16 03:49:53 INFO mapreduce.Job:  map 100% reduce 0%
17/06/16 03:51:03 INFO mapreduce.Job: Task Id : attempt_1497463655394_61930_m_000001_2, Status : FAILED
Container [pid=28993,containerID=container_e50_1497463655394_61930_01_000048] is running beyond physical memory limits. Current usage: 2.6 GB of 2.5 GB physical memory used; 5.6 GB of 12.5 GB virtual memory used. Killing container.

很明显,每个解压缩的文件都由一个mapper和yarn子容器运行,映射器无法将大文件保存在内存中。

另一方面,我想尝试使用Spark,解压缩文件并将解压缩的文件写入在YARN上运行的单个HDFS目录,我不知道还有spark,每个执行者都必须处理单个文件。 / p>

我正在寻找并行处理文件的解决方案,但最后将其写入单个目录。

请告诉我这可以在Spark中实现,并与我分享一些代码片段。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

  

实际上,任务本身并没有失败! YARN正在杀死   容器(内部地图任务正在运行),因为Yarn child使用更多   内存比YARN请求的内存。正如你打算这样做的   在Spark中,您可以简单地将内存增加到MapReduce任务。

我建议你

  • 在处理GB数据时,增加YARN子内存,一些关键属性

    • yarn.nodemanager.resource.memory-mb =>容器记忆
    • yarn.scheduler.maximum-allocation-mb =>容器内存最大值
    • mapreduce.map.memory.mb =>在运行时的任何一点时间映射任务内存(必须小于 yarn.scheduler.maximum-allocation-mb
  • 专注于此作业的数据处理(解压缩),调用另一个作业/命令来合并文件。