hadoop執行分布式Process

openkk 12年前發布 | 23K 次閱讀 分布式/云計算/大數據 Hadoop

要把N個超級大表導入HBase,N是按月來分的,表:億+的行數,100+的字段。測試過sqoop,JDBC,性能都不滿意,對任務失敗重做也很麻煩,HBase的批量導出還靠譜點,但這樣導入HBase有幾個麻煩的地方:

1.所以的表都是沒主鍵的,HBase的rowkey就要了親命了,只能在導出的時候用SQL拼個了。

2.HBase的importtsv只支持用符號分割的文本方式導入。

3.預先的region切分

以文本方式導出,sqluldr2是我用過最有效率的工具(感謝Fangxin Lou)。問題sqluldr2是底層工具,能不能相互結合提高性能呢?其實是可以的。

1.java API 里有個Process類,它可以去調用sqluldr2。

2.hadoop的map-reduce可以讓每個節點都去運行sqluldr2,然后轉化成HBase格式進行put,參考Hbase的importtsv。

要注意的:

1.map的運行是依賴于input,比如你想要3map-task,但你的input在第一個task的時候就被讀完了,那抱歉剩下的2個task 除了寫日志什么都不會做(然后還會告訴你運行的相當成功...>_<)。

2.sqluldr2不導出重復數據,用SQL分割數據,可以先查下count,但map是不同機器的JVM運行的,我的解決辦法是在 map-reduce 執行前,通過其他程序預先在HDFS寫好分割文件,然后通過實現InputFormat,InputSplit每一行對應一個 task。

3.使用合適的hadoop調度器保證map-task平均分攤到每個節點。

4.Process是用InputStream來交互的。

5.mapred.task.timeout,默認是10分鐘,建議設置大點,mapred.map.tasks.speculative.execution最好設置為false。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!