1. 程式人生 > >HBase利用bulk load批量匯入資料

HBase利用bulk load批量匯入資料

OneCoder只是一個初學者,記錄的只是自己的一個過程。不足之處還望指導。

看網上說匯入大量資料,用bulk load的方式效率比較高。bulk load可以將固定格式的資料檔案轉換為HFile檔案匯入,當然也可以直接匯入HFile檔案。所以OneCoder最開始考慮的生成HFile檔案供HBase匯入,不過由於手太新,一直沒有搞定。參考了很多網上的程式碼也沒跑通。暫時擱淺。

後來OneCoder採用了,生成普通的資料格式檔案,然後用過imporsttsv命令匯入的方式成功。生成資料檔案程式碼如下:

private static final String PATH = "F:/data.txt"
; /** * @param args * @author lihzh * @alia OneCoder * @blog http://www.coderli.com * @throws IOException * @date 2012-11-14 下午4:51:22 */ public static void main(String[] args) throws IOException { long startTime = System.currentTimeMillis(); File dataFile = getFile(); FileWriter
writer = null; try { writer = new FileWriter(dataFile); int timeCount = 1; int resourceCount = 1; for (int j = 0; j < timeCount; j++) { long timeStamp = System.currentTimeMillis(); for (int i = 0; i < resourceCount; i++) { UUID uuid = UUID.randomUUID(); String
rowKey = uuid.toString() + "_" + timeStamp; Random random = new Random(); String cpuLoad = String.valueOf(random.nextDouble()) .substring(0, 4); String memory = String.valueOf(random.nextDouble()) .substring(0, 4); StringBuilder builder = new StringBuilder(); builder.append(rowKey).append("\t").append(cpuLoad) .append("\t").append(memory).append("\t").append(uuid.toString()).append("\t").append(timeStamp); writer.append(builder.toString()); if ((i + 1) * (j + 1) < timeCount * resourceCount) { writer.append("\r"); } } } long endTime = System.currentTimeMillis(); System.out.println("Cost Time: " + (endTime - startTime)); } catch (IOException e) { e.printStackTrace(); } finally { writer.close(); } } /** * 得到一個新檔案 * * @return * @author lihzh * @date 2012-11-14 下午4:53:31 */ private static File getFile() { File file = new File(PATH); if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return file; }

檔案格式大致如下:

29611690-69cb-4749-8bd5-be75793d6611_1352968490061 0.41 0.34 29611690-69cb-4749-8bd5-be75793d6611 1352968490061

然後將檔案上傳到HDFS中,

hadoop fs -put /home/admin/Desktop/data.txt /test<

轉換成HFile格式儲存

hadoop jar hbase-version.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY,c1,c2 -Dimporttsv.bulk.output=tmp hbase_table hdfs_file  

生成HFile檔案。其中c1,c2是列名,格式為:列族:列名

然後,匯入到HBase中:

hadoop jar hbase-version.jar completebulkload /user/hadoop/tmp/cf hbase_table

這裡的路徑都是hdfs的路徑。