2016-07-28 20 views
3

我是Hbase的新手。將文本文件中的數據批量加載到Hbase時,我遇到了一個問題。假設我有一個下表:解決方案爲行鍵設置不同的值,但在hbase中設置相同的時間戳?

Key_id | f1:c1 | f2:c2 
row1  'a'  'b' 
row1  'x'  'y' 
  1. 當我解析2條,放入HBase的同時(相同的時間戳),那麼只有{row1 'x' 'y'}版本更新。這裏是解釋:

當你把數據放入HBase時,需要一個時間戳。時間戳可以由RegionServer自動生成,也可以由您提供。時間戳記必須在給定單元格的每個版本上都是唯一的,因爲時間戳記標識了版本。例如,要修改單元格的先前版本,您可以針對數據本身發出具有不同值的Put,但發佈時間戳相同。

我正在考慮指定的時間戳的想法,但我不知道如何來自動設置時間戳bulkloading和是否影響加載性能?我需要最快,最安全地導入大數據的過程。

  1. 我試着解析並將每條記錄放入表中,但速度非常慢......所以另一個問題是:數據中應該有多少記錄/放入hbase。 (我寫了一個簡單的java程序來放,這比使用imporrtsv工具的命令導入要慢很多,我不知道這個工具的批量大小究竟有多少)

很多thx爲你的提示!

回答

3

Q1:HBase的維護使用時間戳的版本。如果你不提供它將採取由hbase系統提供的默認。

在放入請求中,如果您有這樣的要求,您也可以更新自定義時間。它不會影響性能。問題2:你可以用兩種方法做到這一點。

  • 簡單的java客戶端與批處理技術如下所示。

  • 的MapReduce importtsv(批次客戶端)

例如:#1簡單的Java客戶端與配料技術。

我使用HBase的投入100000創紀錄的批次清單對象進行解析JSON(類似於您的獨立客戶端的CSV)

以下是通過我實現了這一代碼片斷。同樣的事情可以在分析其它格式也一樣)

可能是你需要調用此方法在兩個地方

1)100000個記錄批量進行。

2)爲您的批次記錄處理提醒小於100000

public void addRecord(final ArrayList<Put> puts, final String tableName) throws Exception { 
     try { 
      final HTable table = new HTable(HBaseConnection.getHBaseConfiguration(), getTable(tableName)); 
      table.put(puts); 
      LOG.info("INSERT record[s] " + puts.size() + " to table " + tableName + " OK."); 
     } catch (final Throwable e) { 
      e.printStackTrace(); 
     } finally { 
      LOG.info("Processed ---> " + puts.size()); 
      if (puts != null) { 
       puts.clear(); 
      } 
     } 
    } 

注:批量大小內部它是由hbase.client.write.buffer像下面在你的配置個XML之一控制

<property> 
     <name>hbase.client.write.buffer</name> 
     <value>20971520</value> // around 2 mb i guess 
</property> 

其默認值是2mb大小。一旦你的緩衝區被填滿,那麼它將沖洗所有的投入來實際插入到你的表中。

此外,無論是MapReduce的客戶端或站在批次 技術單獨的客戶端。配料由上述緩衝區屬性控制

+0

對我很有用!非常感謝!! –

0

如果您需要覆蓋記錄,可以將hbase表配置爲僅記住一個版本。

此頁解釋瞭如何最大可能的速度做批量加載到HBase的:

How to use hbase bulk loading and why

+0

Thx爲您的答覆。根據用戶密鑰的要求,我需要收集來自該用戶的所有信息。所以,我設計表格的行鍵是user_id。該列家族包含這個用戶的充值信息,所以它包含很多充值歷史 - >必須有很多版本。 我在獨立模式下設置Hadoop和Hbase,因爲我只有一臺服務器。我從本地系統加載數據文件... 因此,任何想法對我? –

+0

我還是不明白你需要什麼,你想更新現有的數據庫,初始化空數據庫?我有你的想法,它正在使用不同的技術進行此類設置。例如mysql。另一個想法是不使用hbase時間戳記來跟蹤歷史記錄,而是將時間戳記編碼到列名稱中,或將多個記錄組合到列上。 – miroB

相關問題