2016-01-11 25 views

回答

2

您可以使用順序分區鹽,加入基於行鍵之前的哈希值一些前綴。例如。

Integer salt = rowKey.hashCode() % numberOfSalts; 
Put put = new Put(Bytes.toBytes(salt + "|" + rowKey)); 
//add some data to you put 
... 

numberOfSalts被視爲使用順序鍵進行批量寫入的區域數量。例如,如果10個區域可以處理您的寫入數量,則應在此公式中使用numberOfRegions等於10,如果將來您建議將寫入數量翻倍,則應該使用20。

之後,您可以使用下面的代碼來掃描基於範圍。

List<Scan> scans = new ArrayList<>(); 
for(int salt = 0; salt < numberOfSalts; salt++){ 
     Scan scan = new Scan(); 
     scan.setBatch(500); 
     scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, YOUR_TABLE_NAME); 
     String salt = StringUtils.leftPad(Integer.toString(i), 3, "0"); 
     scan.setStartRow(Bytes.toBytes(salt + "|" + scanStart)); 
     scan.setStartRow(Bytes.toBytes(salt + "|" + scanStop); 
     scans.add(scan); 
} 

TableMapReduceUtil.initTableMapperJob(
      scans, 
      YourMapper.class, 
      Text.class, 
      Text.class, 
      job); 
+0

非常感謝!你的答案非常有用 –