SQOOP输出文件大小不均匀
SQOOP uneven output file size
我有一个庞大的新闻数据库,但每当我尝试对其进行 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:@7.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 个文件有数据,其余的输出文件是空的。
我做错了什么?任何提示将不胜感激!
谢谢
您正在 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
mapper#0 将 sqoop 1 条记录,mapper#199 将 sqoop 7 条记录。您可以用大量记录推断这种情况。
我有一个庞大的新闻数据库,但每当我尝试对其进行 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:@7.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 个文件有数据,其余的输出文件是空的。
我做错了什么?任何提示将不胜感激!
谢谢
您正在 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
mapper#0 将 sqoop 1 条记录,mapper#199 将 sqoop 7 条记录。您可以用大量记录推断这种情况。