MRS HBase MOB特性介紹

      網友投稿 1279 2025-03-31

      在實際應用中,需要存儲大大小小的數據,比如圖像數據、文檔。小于10MB的數據一般都可以存儲在HBase上,對于小于100KB的數據,HBase的讀寫性能是最優的。如果存放在HBase的數據大于100KB甚至到10MB大小時,插入同樣個數的數據文件,但是總的數據量會很大,會導致頻繁的compaction和split,占用很多CPU,磁盤IO頻率很高,性能嚴重下降。

      通過將MOB(Medium-sized Objects)數據(即100KB到10MB大小的數據)直接以HFile的格式存儲在文件系統上(例如HDFS文件系統),通過expiredMobFileCleaner和Sweeper工具集中管理這些文件,然后把這些文件的地址信息及大小信息作為value存儲在普通HBase的store上。這樣就可以大大降低HBase的compation和split頻率,提升性能。

      HBase當前默認開啟MOB功能,相關配置項如表1所示。如果需要使用MOB功能,用戶需要在創建表或者修改表屬性時在指定的列族上指定使用mob方式存儲數據。

      為了開啟HBase MOB功能,用戶需要在創建表或者修改表屬性時在指定的列族上指定使用mob方式存儲數據。

      使用代碼聲明使用mob存儲的方式:

      HColumnDescriptor hcd = new HColumnDescriptor("f"); hcd.setMobEnabled(true);

      使用shell聲明使用mob的方式,MOB_THRESHOLD單位是字節:

      hbase(main):009:0> create 't3',{NAME => 'd', MOB_THRESHOLD => '102400', IS_MOB => 'true'} 0 row(s) in 0.3450 seconds => Hbase::Table - t3 hbase(main):010:0> describe 't3' Table t3 is ENABLED t3 COLUMN FAMILIES DESCRIPTION {NAME => 'd', MOB_THRESHOLD => '102400', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', IS_MOB => 'true', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'} 1 row(s) in 0.0170 seconds

      參數入口:

      在MRS Manager系統中,選擇“集群 > 待操作集群的名稱 > 服務 > HBase > 配置”,單擊“全部配置”。在搜索框中輸入參數名稱。

      表一參數描述

      參數

      緩存打開文件句柄的個數。如果該值設置的比較大,cache可以緩存更多的文件句柄,從而降低打開關閉文件的頻率。但是如果該值設置過大會導致打開的文件句柄數過多。默認值是:“1000”。此參數在服務端ResionServer上配置。

      mob cache回收緩存的mob文件的周期,默認是3600s。

      MRS HBase MOB特性介紹

      ExpiredMobFileCleanerChore的執行周期,以秒為單位。默認值是一天(86400秒)。

      說明:

      如果生存時間值過期了,即文件從創建起已經超過了24小時,則MOB文件將會被過期mob文件清理工具刪除。

      HBase MOB數據的寫入與普通HBase數據的寫入沒有什么區別,對客戶來說是透明的。為了使用HBase MOB功能需要在“hbase-site.xml”中添加HBase MOB相關的配置項,具體請參見《組件操作指南》中“配置MOB”章節,除此之外還需要在指定column family上開啟MOB功能,樣例代碼如下:

      以下代碼片段在com.huawei.bigdata.hbase.examples包的“HBaseSample”類的testCreateMOBTable方法中。

      public void testCreateMOBTable() { LOG.info("Entering testCreateMOBTable."); Admin admin = null; try { // Create Admin instance admin = conn.getAdmin(); HTableDescriptor tabDescriptor = new HTableDescriptor(tableName); HColumnDescriptor mob = new HColumnDescriptor("mobcf"); // Open mob function mob.setMobEnabled(true); // Set mob threshold mob.setMobThreshold(10L); tabDescriptor.addFamily(mob); admin.createTable(tabDescriptor); LOG.info("MOB Table is created successfully."); } catch (Exception e) { LOG.error("MOB Table is created failed " ,e); } finally { if (admin != null) { try { // Close the Admin object. admin.close(); } catch (IOException e) { LOG.error("Close admin failed " ,e); } } } LOG.info("Exiting testCreateMOBTable."); }

      樣例:用Put接口寫入MOB數據

      public void testMOBDataInsertion() { LOG.info("Entering testMOBDataInsertion."); Table table = null; try { // set row name to "row" Put p = new Put(Bytes.toBytes("row")); byte[] value = new byte[1000]; // set the column value of column family mobcf with the value of "cf1" p.addColumn(Bytes.toBytes("mobcf"), Bytes.toBytes("cf1"), value); // get the table object represent table tableName table = conn.getTable(tableName); // put data table.put(p); LOG.info("MOB data inserted successfully."); } catch (Exception e) { LOG.error("MOB data inserted failed " ,e); } finally { if(table != null){ try { table.close(); } catch (Exception e2) { LOG.error("Close table failed " ,e); } } } LOG.info("Exiting testMOBDataInsertion."); }

      不允許多個線程在同一時間共用同一個HTable實例。HTable是一個非線程安全類,因此,同一個HTable實例,不應該被多個線程同時使用,否則可能會帶來并發問題。

      HBase MOB數據讀出與普通HBase數據的讀出沒有什么區別,對客戶來說是透明的。為了使用HBase MOB功能需要在“hbase-site.xml”中添加HBase MOB相關的配置項,具體請參見《組件操作指南》中“配置MOB”章節,除此之外還需要在指定column family上開啟MOB功能。

      以下代碼片段在com.huawei.bigdata.hbase.examples包的“HBaseSample”類的testMOBDataRead方法中。

      public void testMOBDataRead() { LOG.info("Entering testMOBDataRead."); ResultScanner scanner = null; Table table = null; Admin admin = null; try { // get table object representing table tableName table = conn.getTable(tableName); admin = conn.getAdmin(); admin.flush(table.getName()); Scan scan = new Scan(); // get table scanner scanner = table.getScanner(scan); for (Result result : scanner) { byte[] value = result.getValue(Bytes.toBytes("mobcf"), Bytes.toBytes("cf1")); String string = Bytes.toString(value); LOG.info("value:" + string); } LOG.info("MOB data read successfully."); } catch (Exception e) { LOG.error("MOB data read failed " ,e); } finally { if(scanner != null){ scanner.close(); } if (table != null) { try { // Close table object table.close(); } catch (IOException e) { LOG.error("Close table failed " ,e); } } if (admin != null) { try { // Close the Admin object. admin.close(); } catch (IOException e) { LOG.error("Close admin failed " ,e); } } } LOG.info("Exiting testMOBDataRead."); }

      EI企業智能 MapReduce服務

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:MQTT 協議是個啥?這篇文章告訴你!
      下一篇:excel的打印預覽找不到了怎么辦(excel表格找不到打印預覽)
      相關文章
      亚洲电影国产一区| 亚洲国产综合无码一区| 九月丁香婷婷亚洲综合色| 亚洲色大成网站www尤物| 亚洲成无码人在线观看| 亚洲天堂中文字幕| 久久久久亚洲av无码专区 | 国产成人亚洲精品影院| 亚洲高清无码在线观看| 亚洲乱码国产一区网址| 中文文字幕文字幕亚洲色| 亚洲一区二区三区乱码在线欧洲| 亚洲va在线va天堂成人| 亚洲18在线天美| 亚洲综合色婷婷在线观看| 亚洲成a人无码亚洲成www牛牛 | 中文字幕中韩乱码亚洲大片 | 黑人大战亚洲人精品一区| 丝袜熟女国偷自产中文字幕亚洲| 国产成人精品久久亚洲高清不卡 | 亚洲精品麻豆av| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 亚洲综合精品伊人久久| 亚洲色大18成人网站WWW在线播放| 亚洲精品无码永久在线观看男男| 亚洲AV无码男人的天堂| 全亚洲最新黄色特级网站| 精品国产人成亚洲区| 亚洲人色婷婷成人网站在线观看 | 国产成人精品亚洲日本在线| 中文字幕无码亚洲欧洲日韩| 亚洲av无码一区二区三区四区 | 午夜在线亚洲男人午在线| 亚洲精品乱码久久久久久蜜桃| 中文亚洲AV片不卡在线观看| 国产AV无码专区亚洲A∨毛片| 7777久久亚洲中文字幕蜜桃| 亚洲一区在线观看视频| 亚洲狠狠婷婷综合久久| 亚洲成年人啊啊aa在线观看| 最新精品亚洲成a人在线观看|