sqoop输出文件大小不均匀

oewdyzsn  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(360)

我有一个巨大的新闻数据库,但每当我试图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个文件有数据,其余的输出文件是空的。
我做错什么了?任何暗示都将不胜感激!
谢谢您

nwwlzxa7

nwwlzxa71#

你要分道扬镳了 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命令本身中观察到这一点。添加 --verbose 在sqoop命令中,以便查看扩展日志。)
现在,如果数据分布不均匀,那么只有少数Map器将获取记录,而其他Map器是空的。
例如,如果在您的数据中我们有以下情况:

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

Map器#0将sqoop 1记录,Map器#199将sqoop 7记录。你可以用大量的记录推断这个案子。

相关问题