猪歪联合大表导致"拆分元数据大小超过10000000"

iha*_*nny 5 hadoop apache-pig skew

我们在一个小的(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]
Run Code Online (Sandbox Code Playgroud)

这在我们每次尝试时都是可重现的using skewed,并且在我们使用常规连接时不会发生.

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

这里发生了什么事?这是由分发样本创建的错误using skewed吗?为什么不帮助改变参数-1呢?

ale*_*pab 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';
Run Code Online (Sandbox Code Playgroud)

大表始终是语句中的第一个表。

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