为啥我的 avro 输出文件在我的猪工作中如此之小又如此之多?
Posted
技术标签:
【中文标题】为啥我的 avro 输出文件在我的猪工作中如此之小又如此之多?【英文标题】:Why are my avro output files so small and so numerous in my pig job?为什么我的 avro 输出文件在我的猪工作中如此之小又如此之多? 【发布时间】:2014-08-12 02:44:11 【问题描述】:我正在运行一个猪脚本,该脚本执行一系列连接并使用 AvroStorage() 编写
一切运行良好,我得到了我想要的数据……但它被写入 845 个 avro 文件(每个约 30kb)。这似乎根本不对……但我似乎找不到任何设置,我可能已经更改为从之前的 1 个大型 avro 输出到 845 个小型 avro(添加另一个数据源除外)。
这会改变什么吗?我怎样才能把它恢复到一两个文件?
谢谢!
【问题讨论】:
【参考方案1】:一种可能是改变你的块大小。如果你想回到更少的文件,你也可以尝试使用 parquet。通过 pig 脚本转换您的 .avro 文件并将其存储为 .parquet 文件,这会将您的 845 文件减少到更少。
但除了性能优势之外,没有必要恢复到更少的文件。
【讨论】:
【参考方案2】:MR 作业写入的文件数由运行的 reducer 数定义。您可以在 Pig 脚本中使用 PARALLEL 来控制 reducer 的数量。
如果您确定最终数据足够小(与您的块大小相比),您可以将 PARALLEL 1 添加到您的 JOIN 语句中,以确保将 JOIN 转换为 1 个 reducer,从而仅将输出写入 1 个文件中。
【讨论】:
【参考方案3】:我用SET pig.maxCombinedSplitSize 134217728;
解决了这个问题
SET default_parallel 10;
可能仍会输出许多小文件,具体取决于 PIG 作业。
【讨论】:
以上是关于为啥我的 avro 输出文件在我的猪工作中如此之小又如此之多?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在我的 c 程序中,当我使用 double 时它只输出 0,但是当我使用 float 时它可以工作? [复制]