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

Hadoop 如何将大型xml文件解压缩到一个HDFS目录中,hadoop,apache-spark,mapreduce,hdfs,yarn,Hadoop,Apache Spark,Mapreduce,Hdfs,Yarn,我需要从HDFS目录中加载Zip文件,解压并在一个目录中将所有解压文件写回HDFS。文件是XML,大小以GB为单位 首先,我实现了MapReduce程序,编写了一个自定义InputFormat和自定义RecordReader来解压文件并将这些内容提供给mapper,然后每个mapper处理并使用MultiOutput格式写入HDFS。地图减少了纱线上的作业 当输入大小以MB为单位时,此方法工作正常,能够以HDFS格式获取解压缩格式的文件,但当输入大小以GB为单位时,作业无法写入,并最终导致以下错

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

首先,我实现了MapReduce程序,编写了一个自定义InputFormat和自定义RecordReader来解压文件并将这些内容提供给mapper,然后每个mapper处理并使用MultiOutput格式写入HDFS。地图减少了纱线上的作业

当输入大小以MB为单位时,此方法工作正常,能够以HDFS格式获取解压缩格式的文件,但当输入大小以GB为单位时,作业无法写入,并最终导致以下错误

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.
很明显,每个解压缩的文件都由一个映射器处理,而运行映射器的子容器无法将大文件保存在内存中

另一方面,我想试试Spark,解压文件并将解压后的文件写入运行在Thread上的单个HDFS目录,我想知道Spark是否也可以,每个执行者都必须处理单个文件

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

请让我知道这可以在Spark中实现,并与我分享一些代码片段

谢谢你的帮助

实际上,任务本身并没有失败!纱线正在扼杀生命 容器(内部映射任务正在运行),因为该子容器使用更多 内存大于从纱线请求的内存。正如你计划做的那样 在Spark中,只需增加内存即可减少任务


我建议你去

  • 在处理GBs数据时增加子内存,包括一些关键属性

    • 纱线.节点管理器.资源.内存mb
      =>容器内存
    • warn.scheduler.maximum allocation mb
      =>容器内存最大值
    • mapreduce.map.memory.mb
      =>映射任务内存(在运行时任何一品脱时间的最大分配mb)
  • 只关注此作业的数据处理(解压缩),调用其他作业/命令合并文件


这可能是一个副本吗?