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

bt1cpqcv  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(465)

我们在一个小的(16m行)独立表和一个大的(6b行)倾斜表之间有一个pig连接。常规连接在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文件中看到它,但它不会改变任何东西!
这里发生了什么?这是由创建的分发示例的bug吗 using skewed ? 为什么把参数改成 -1 ?

ars1skjm

ars1skjm1#

在较新版本的hadoop(>=2.4.0,但可能更早)中,您应该能够通过使用以下配置属性在作业级别设置最大拆分大小:
mapreduce.job.split.metainfo.maxsize=-1

syqv5f0l

syqv5f0l2#

1mb的小表足够小,可以放入内存,请尝试复制联接。复制连接是只Map的,不会像其他类型的连接那样引起reduce stage,因此不会受到连接键中的偏移的影响。应该很快。

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';

大table总是第一个在声明中。
更新1:如果原始形式的小表不适合内存,那么作为解决方案,您需要将小表划分为足够小的分区以适合内存,然后对大表应用相同的分区,希望您可以将相同的分区算法添加到创建大表的系统中,这样你就不会浪费时间重新划分了。分区之后,您可以使用复制连接,但是需要为每个分区分别运行pig脚本。

相关问题