hadoop執行分布式Process
要把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。