Hadoop 清管器与大表的倾斜连接导致;拆分元数据大小超过10000000“;

Hadoop 清管器与大表的倾斜连接导致;拆分元数据大小超过10000000“;,hadoop,apache-pig,skew,Hadoop,Apache Pig,Skew,我们在一个小的(16M行)独立表和一个大的(6B行)倾斜表之间有一个pig连接。 常规连接在2小时内完成(经过一些调整)。我们尝试使用歪斜的,并将性能提高到20分钟 但是,当我们尝试更大的倾斜表(19B行)时,我们从采样器作业中得到以下消息: Split metadata size exceeded 10000000. Aborting job job_201305151351_21573 [ScriptRunner] at org.apache.hadoop.mapreduce.split.S

我们在一个小的(16M行)独立表和一个大的(6B行)倾斜表之间有一个pig连接。 常规连接在2小时内完成(经过一些调整)。我们尝试使用歪斜的
,并将性能提高到20分钟

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

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]
每当我们尝试使用歪斜的
时,这是可重复的,并且在使用常规联接时不会发生

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


这里发生了什么事?这是由
使用歪斜
创建的分发示例的错误吗?为什么将参数更改为
-1

1MB的小表足够小,可以放入内存,请尝试复制联接。 复制连接是仅映射的,不会像其他类型的连接那样导致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: 如果原始形式的小表不适合内存,那么作为一种解决方案,您需要将小表划分为足够小的分区,以适合内存,然后将相同的分区应用于大表,希望您可以将相同的分区算法添加到创建大表的系统中,这样您就不会浪费时间重新划分它。
分区后,您可以使用复制联接,但需要分别为每个分区运行pig脚本。

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


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

这主意不错,但是这个小表不是1MB(已编辑的问题),无法放入hadoop缓存(尝试过)更新了答案。请参阅更新1。再次感谢,但我正在寻找原始问题的解释。这是一个很酷的解决方法,但在我了解传统Join的问题之前,我不会这么做。在这种情况下,我担心您需要下载Pig版本的源代码,搜索“超出拆分元数据大小”并分析代码。决定提交一个jira错误:,will updatewe发现更改mapreduce.jobtracker.split.metainfo.maxsize已知在作业级别不起作用,仅在jobtracker级别起作用,请参见此处:您是否找到此问题的解决方案?我们面临着类似的问题。@KennethJ,我不这么认为,而且漏洞似乎仍然存在。。