2017-02-08 63 views
0

我有一个庞大的新闻数据库,但每当我试图sqoop它,把它写到文件2-3,而不是整个200SQOOP不均匀输出文件大小

sqoop import -D mapred.map.max.attempts=4 \ 
    -D dfs.blocksize=1073741824 \ 
    -D oraoop.block.allocation=RANDOM \ 
    -D mapred.job.queue.name=default \ 
    -m 200 \ 
    --split-by AUTHOR_ID \ 
    --connect jdbc:oracle:thin:@$127.0.0.1:1521:SRDB \ 
    --username abc \ 
    --password 1234 \ 
    --table L.ARTICLE \ 
    --null-string '' \ 
    --null-non-string '' \ 
    --target-dir /data/output1.0 
    --outdir /tmp/output 

但是,当我跑了,我得到了202个文件,而不是200个。其中只有3个文件有数据,剩余的输出文件都是空的。

我在做什么错?任何提示将不胜感激!

谢谢

回答

3

要拆分的AUTHOR_ID

最可能的原因 -

AUTHOR_ID(您是分裂)不是均匀分布。

内部sqoop获取分割列的最小值和最大值。

SELECT MIN(AUTHOR_ID) and MAX(AUTHOR_ID) FROM L.ARTICLE 
上述查询的

说输出为:

1,20000 

现在基于这些值就会使范围查询,如:

SELECT * FROM L.ARTICLE WHERE AUTHOR_ID>=1 AND AUTHOR_ID<100 
SELECT * FROM L.ARTICLE WHERE AUTHOR_ID>=100 AND AUTHOR_ID<200 
SELECT * FROM L.ARTICLE WHERE AUTHOR_ID>=200 AND AUTHOR_ID<300 
. 
. 
. 
SELECT * FROM L.ARTICLE WHERE AUTHOR_ID>=19900 AND AUTHOR_ID<20000 

(您可以在sqoop命令本身观察此。在您的sqoop命令中添加--verbose,以便您可以看到扩展日志。)

现在,如果数据不是均匀分布的,那么只有少数映射器会获取记录,而其他映射器则是空的。

比方说,例如,如果在你的数据,我们有下面的情况:

author_id record 
1 record1 
19900 record19900 
19901 record19901 
19902 record19902 
19903 record19903 
19904 record19904 
19905 record19905 
19906 record19906 

映射器#0将sqoop 1个记录和映射器#199将sqoop 7条记录。你可以用大量的记录来推断这个案例。

+0

非常感谢!写得很好。 – Gon

+0

在这种情况下,我如何确保相同的AUTHOR_ID不会跨越多个文件? – Gon

+0

@恩我没有明白。每个文件都由AUTHOR_ID上的一些范围查询创建,每个查询都不同,因此不同文件中会有不同的AUTHOR_ID。 –