pig 倾斜连接与大表导致“拆分元数据大小超过 10000000”

Posted

技术标签:

【中文标题】pig 倾斜连接与大表导致“拆分元数据大小超过 10000000”【英文标题】:pig skewed join with a big table causes "Split metadata size exceeded 10000000" 【发布时间】:2013-06-18 07:36:02 【问题描述】:

我们在一个小的(16M 行)不同的表和一个大的(6B 行)倾斜表之间有一个猪连接。 常规连接在 2 小时内完成(经过一些调整)。我们尝试了using skewed 并且能够将性能提高到 20 分钟。

但是,当我们尝试更大的倾斜表(19B 行)时,我们会从 SAMPLER 作业中收到以下消息:

Split metadata size exceeded 10000000. Aborting job job_201305151351_21573 [ScriptRunner]
at org.apache.hadoop.mapreduce.split.SplitMetaInfoReader.readSplitMetaInfo(SplitMetaInfoReader.java:48)
at org.apache.hadoop.mapred.JobInProgress.createSplits(JobInProgress.java:817) [ScriptRunner]

每次我们尝试using skewed 时都可以重现这种情况,并且在我们使用常规连接时不会发生这种情况。

我们尝试设置mapreduce.jobtracker.split.metainfo.maxsize=-1,我们可以在job.xml文件中看到它,但它并没有改变任何东西!

这里发生了什么?这是using skewed 创建的分发示例的错误吗?为什么将参数更改为-1 没有帮助?

【问题讨论】:

决定提交一个jira bug:issues.apache.org/jira/browse/PIG-3411,会更新 我们发现改变mapreduce.jobtracker.split.metainfo.maxsize已知在job级别不起作用,只在jobTracker级别起作用,见这里:groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/… 你有没有找到解决这个问题的方法?我们面临着类似的问题。 @KennethJ,我不这么认为,而且这个错误似乎仍然存在.. 【参考方案1】:

1MB 的小表足够小,可以放入内存,请尝试复制连接。 复制连接只是 Map,不会像其他类型的连接那样导致 Reduce 阶段,因此不受连接键中的倾斜的影响。应该很快。

big = LOAD 'big_data' AS (b1,b2,b3);
tiny = LOAD 'tiny_data' AS (t1,t2,t3);
mini = LOAD 'mini_data' AS (m1,m2,m3);
C = JOIN big BY b1, tiny BY t1, mini BY m1 USING 'replicated';

大表总是语句中的第一个。

更新 1: 如果原始形式的小表不适合内存,那么作为一种解决方法,您需要将小表分区为足够小以适合内存的分区,而不是将相同的分区应用于大表,希望您可以将相同的分区算法添加到创建大表的系统中,这样您就不会浪费时间对其进行重新分区。 分区后可以使用replicated join,但需要为每个分区单独运行pig脚本。

【讨论】:

好主意,但小表不是 1MB(已编辑问题)并且不适合 hadoop 缓存(尝试过) 更新了答案。请参阅更新 1。 再次感谢,但我正在寻找原始问题的解释。这是一个很酷的解决方法,但在我了解传统连接有什么问题之前,我不会这样做 在这种情况下,您需要下载您拥有的 Pig 版本的源代码,搜索“Split metadata size exceeded”并分析代码。【参考方案2】:

在较新版本的 Hadoop(>=2.4.0 但可能更早)中,您应该能够使用以下配置属性在作业级别设置最大拆分大小:

mapreduce.job.split.metainfo.maxsize=-1

【讨论】:

以上是关于pig 倾斜连接与大表导致“拆分元数据大小超过 10000000”的主要内容,如果未能解决你的问题,请参考以下文章

Spark调优大表join大表,少数key导致数据倾斜解决方案

在 Spark SQL 中将多个小表与大表连接的最佳方法

hive高级操作(优化,数据倾斜优化)

Hive数据倾斜和解决办法

hadoop是怎么存储大数据的

SET SYSTEM_VERSIONING = ON时超时与大表