2017-02-08 106 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。 –