【问题标题】:How to unzip large xml files into one HDFS directory如何将大型 xml 文件解压缩到一个 HDFS 目录中
【发布时间】:2017-12-07 21:44:55
【问题描述】:

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

首先,我通过编写自定义 InputFormat 和 Custom RecordReader 来实现 Map-Reduce 程序来解压缩文件并将这些内容提供给映射器,然后每个映射器处理并使用 MultiOutput 格式写入 HDFS。在 YARN 上运行的 map reduce 作业。

当输入大小以 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,解压缩文件并将解压缩的文件写入 YARN 上运行的单个 HDFS 目录,我也想知道 spark,每个执行程序都必须处理单个文件。

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

请让我知道这可以在 Spark 中实现,并分享一些代码 sn-ps。

任何帮助表示赞赏。

【问题讨论】:

标签: hadoop apache-spark mapreduce hdfs hadoop-yarn


【解决方案1】:

实际上,任务本身并没有失败! YARN 正在扼杀 容器(内部地图任务正在运行)因为那个 Yarn 孩子使用更多 内存比从 YARN 请求的内存。正如你计划做的那样 在 Spark 中,您可以简单地增加 MapReduce 任务的内存。


我会推荐你​​

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

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

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多