如何让 Pig 将多个文件输入到一个映射器中

Posted

技术标签:

【中文标题】如何让 Pig 将多个文件输入到一个映射器中【英文标题】:How to have Pig feed multiple files into one mapper 【发布时间】:2013-07-09 18:15:56 【问题描述】:

是否可以让 Pig 使用一个映射器处理多个小文件(假设这样做会提高工作速度)。我们有一个问题,hdfs 中有数千个小文件,而 pig 创建了数百个映射器。 Pig 是否提供了一个简单的(全部或部分)解决方案来解决这个问题?

【问题讨论】:

【参考方案1】:

您可以利用这些属性将这些多个文件合并为一个文件,以便它们由单个地图处理:

pig.maxCombinedSplitSize – 指定单个映射要处理的数据的大小(以字节为单位)。较小的文件会被合并,直到达到这个大小。 pig.splitCombination – 打开或关闭合并拆分文件(默认设置为“true”)。

此功能适用于 PigStorage,无需编写任何自定义加载器。更多信息可以在here找到。

HTH

【讨论】:

我一直在尝试将此功能与 PigStorage 一起使用。使用 TextLoader 我可以运行作业。但是,对于 PigStorage,它会在将作业提交到集群之前挂起(最后一行日志是:org.apache.pig.backend.hadoop.executionengine.HExecutionEngine - 正在连接到 map-reduce 作业跟踪器...)。我不知道它在做什么。由于我是从集群外部运行 Pig 客户端,我希望它不会通过网络发送 HDFS 文件来组合它们?我很想知道这个组合功能是如何工作的,但我没有找到任何有用的信息。【参考方案2】:

Hadoop 中包含大量小文件的常见方法是将它们聚合成大型 Sequence 或 Avro 文件,然后使用各自的存储函数来读取它们。 对于 Pig 和 Avro,请查看 AvroStorage

【讨论】:

我们很快就会到达 :)

以上是关于如何让 Pig 将多个文件输入到一个映射器中的主要内容,如果未能解决你的问题,请参考以下文章

Pig:控制映射器的数量

在 DataStax Enterprise 中更改减速器/映射器的数量

如何将不同的数据集传递给同一作业的两个不同的映射器

如何让 Eclipse 使用 Gradle 生成 MapStruct 映射器

在猪中增加映射器

使用 MapReduce/Hadoop 对大数据进行排序