需求描述
將數據記錄持久化存儲在HBase中,需要支持如下功能:
- 支持高吞吐量讀寫操作,實時采集10,000條/秒;
- 支持動態添加字段;
- 支持服務端過濾;
- 支持部分字段修改。
設計方案
按列存儲
優點
- 擴展性好,支持動態添加新列;
- 支持服務端按列過濾;
- 可讀性好,方便調試;
- 獲取少量列數據時,讀取數據少,節約網絡帶寬資源;
- 方便修改部分列值。
缺點
- 占用磁盤空間較多;
- 數據采集性能差。
列合並為JSON格式存儲
優點
- 相對方案1,減少數據列,節約磁盤空間;
- 相對方案1,數據讀、寫性能較好;
- 擴展性好,支持動態添加新列;
- 相對方案3數據可讀性好,方便調試;
缺點
- 不便於服務端按列過濾;
- 數據只能整體獲取,當獲取少量列時也需要將整個json對象獲取,對磁盤和網絡資源造成浪費;
- 不便於修改部分列值,需要整體反序列化替換修改值后再重新序列化后寫入。
列合並為PB格式存儲
優點
- 相對方案1,減少數據列,並通過PB格式對數據壓縮,節約磁盤空間;
- 數據讀、寫性能好。
缺點
- 擴展性差,添加新列時需要修改PB對象;
- 不支持服務端按列過濾;
- 數據可讀性差,不方便調試;
- 數據只能整體獲取,當獲取少量列時也需要將整個PB對象獲取,對磁盤和網絡資源造成浪費;
- 不便於修改部分列值,需要整體反序列化替換修改值后再重新序列化后寫入。
批量寫入性能對比
單線程連續批量發送100萬條過車記錄(每條記錄37個字段,每批10000條記錄),三種方案完成數據采集總耗時對比結果如下:
批量讀取性能對比
單線程批量讀取100萬條過車記錄(每條記錄37個字段,每批10000條記錄),分別從非壓縮表和Snappy壓縮表讀取記錄並執行反序列化操作(按列存儲格式的讀取性能表示從result中獲取屬性值的時間消耗),記錄每種存儲格式的總耗時與反序列化耗時情況,圖4_1對應非壓縮表的測試結果,圖4_2對應Snappy壓縮表的測試結果:
注:
- 讀取部分列測試只獲取tfs_id,plate_image_path,image_path三列;
- 按列存儲的測試數據中紅色部分表示從result中獲取字段的時間消耗。
存儲空間占用對比
單線程連續批量發送100萬條過車記錄(37個字段),三種方案存儲空間占用對比結果如下(下圖數據表示一份數據的空間占用情況,不包括副本大小):




