我有一个巨大的新闻数据库,但每当我试图sqoop它,它写2-3个文件,而不是整个200。
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个文件有数据,其余的输出文件是空的。
我做错什么了?任何暗示都将不胜感激!
谢谢您
1条答案
按热度按时间nwwlzxa71#
你要分道扬镳了
AUTHOR_ID
最可能的原因-AUTHOR_ID
(正在拆分的)不是均匀分布的。在内部,sqoop正在获取用于拆分列的最小值和最大值。
假设上述查询的输出为:
现在基于这些值,它将进行如下范围查询:
(您可以在sqoop命令本身中观察到这一点。添加
--verbose
在sqoop命令中,以便查看扩展日志。)现在,如果数据分布不均匀,那么只有少数Map器将获取记录,而其他Map器是空的。
例如,如果在您的数据中我们有以下情况:
Map器#0将sqoop 1记录,Map器#199将sqoop 7记录。你可以用大量的记录推断这个案子。