HBase 相關API操練

      網友投稿 854 2022-05-29

      HBase 的 Shell 操作

      HBase 為用戶提供了一個非常方便的使用方式, 我們稱之為“HBase Shell”。

      HBase Shell 提供了大多數的 HBase 命令, 通過 HBase Shell 用戶可以方便地創建、刪除及修改表, 還可以向表中添加數據、列出表中的相關信息等。

      備注:寫錯 HBase Shell 命令時用鍵盤上的“Delete”進行刪除,“Backspace”不起作用。

      在啟動 HBase 之后,用戶可以通過下面的命令進入 HBase Shell 之中,命令如下所示:

      輸入 help 可以看到命令分組。

      Group Name Commands

      部分命令清單。

      下邊分組舉例 Shell 的各種操作。

      general操作

      查詢 HBase 服務器狀態 status:

      查詢hbase版本 version:

      ddl操作

      1、 創建一個表

      create 'table1', 'tab1_id', 'tab1_add', 'tab1_info'

      2、 列出所有的表

      3、 獲得表的描述

      describe "table1"

      4、 刪除一個列族 disable alter enable

      disable 'table1'

      alter 'table1', {NAME=>'tab1_add', METHOD=>'delete'}

      enable 'table1'

      5、 查看表是否存在

      exists 'table2'

      6、 判斷表是否為‘enable’

      is_enabled 'table1'

      7、 刪除一個表

      disable 'table1'

      drop 'table1'

      dml操作

      1、 插入幾條記錄

      put 'member', 'scutshuxue', 'info:age', '24'

      put 'member', 'scutshuxue', 'info:birthday', '1996-07-17'

      put 'member', 'scutshuxue', 'info:company', 'alibaba'

      put 'member', 'scutshuxue', 'address:contry', 'china'

      put 'member', 'scutshuxue', 'address:province', 'zhejiang'

      put 'member', 'scutshuxue', 'address:city', 'hangzhou'

      put命令比較簡單,只有這一種用法:

      hbase> put ‘t1′, ‘r1′, ‘c1′, ‘value', ts1

      t1指表名,r1指行鍵名,c1指列名,value指單元格值。ts1指時間戳,一般都省略掉了。

      2、 全表掃描 scan

      scan 'member'

      3、 獲得數據 get

      1) 獲得一行的所有數據

      get 'member', 'scutshuxue'

      2) 獲得某行,某列族的所有數據

      get 'member', 'scutshuxue', 'info'

      3) 獲得某行,某列族,某列的所有數據

      get 'member', 'scutshuxue', 'info:company'

      4、 更新一條記錄 put(把scutshuxue年齡改為99)

      put 'member', 'scutshuxue', 'info:age', 99

      5、 刪除 delete、 deleteall

      1) 刪除行'scutshuxue', 列族為‘info' 中age的值

      delete 'member', 'scutshuxue', 'info:age'

      2) 刪除整行

      deleteall 'member', 'scutshuxue'

      6、 查詢表中有多少行

      count 'member'

      7、 給‘xiaoming’這個id增加'info:age'字段,并使用counter實現遞增

      incr 'member',? 'xiaoming', 'info:age'

      8、 將整個表清空

      truncate 'member'

      可以看出,HBase 是通過先對表執行 disable,然后再執行 drop 操作后重建表來實現 truncate 的功能的。

      HBase 客戶端

      與 HBase 集群進行交互,有很多種不同的方式可以選擇,如 Java API、REST、Thrift 等。下面我們以Java API為例介紹它們的用法。

      Java API 交互

      HBase 與 Hadoop 一樣,都是用 java 編寫的,所以 HBase 對 java 支持是必需的,下面看看怎么使用java 語言對 HBase 進行操作。Java API 核心類介紹如下。

      1、 HBaseConfiguration 類

      HBaseConfiguration 是每一個 HBase Client 都會使用到的對象,它代表 HBase 配置信息。有兩種構造方式。

      public HBaseConfiguration()

      public HBaseConfiguration(final Configuration c)

      默認構造方式會嘗試從 hbase-default.xml 和 HBase-site.xml 文件中讀取配置。如果CLASSPATH 沒有這兩個文件,就需要自己配置。

      Configuration HBASE_CONFIG = new Configuration();

      HBASE_CONFIG.set("hbase.ZooKeeper.quorum","zkServer"); //hbase 服務地址

      HBASE_CONFIG.set("hbase.ZooKeeper.property.clientPort","2181"); //端口號

      HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG); //讀取配置文件

      2、 創建表

      創建表通過 HBaseAdmin 對象操作。HBaseAdmin 負責META 表信息的處理。HBaseAdmin 提供了 createTable 方法。

      public void createTable(HTableDescriptor desc)

      HTableDescriptor 表示表的 Schema,提供常用方法有以下兩個:

      1)setMaxFileSize:指定最大 Region 的大小。

      2)setMemStoreFlushSize:指定 MemStore Flush 到 HDFS 上的文件大小。

      3、 增加 Family

      使用 addFamily 方法實現 Family 的添加。

      public void addFamily(final HColumnDescriptor family)

      HColumnDescriptor 代表 Column 的 Schema,提供的常用方法有以下幾個:

      1、setTimeToLive:指定最大的 TTL(單位是 ms),過期數據會被自動刪除。

      2、setInMemory:指定是否放在內存中,對小表有用,可用于提高效率。默認關閉。

      3、setBloomFilter:指定是否使用 BloomFilter,可提高隨機查詢效率。默認關閉。

      4、setCompressionType:設定數據壓縮類型。默認無壓縮。

      5、setMaxVersions:指定數據最大保存的版本個數。默認為3。

      舉個簡單的例子,創建 4 個 Family 表,命令如下:

      HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

      HTableDescriptor table = new HTableDescriptor(tableName);

      table.addFamily(new HColumnDescriptor("f1"));

      table.addFamily(new HColumnDescriptor("f2"));

      table.addFamily(new HColumnDescriptor("f3"));

      table.addFamily(new HColumnDescriptor("f4"));

      hAdmin.createTable(table);

      4、 刪除表

      刪除表也是通過 HBaseAdmin 來操作,刪除表之前首先要 disable 表。這是一個非常耗時的操作,所以不建議頻繁刪除表。

      disableTable 和 deleteTable 分別用來執行 disable 和 delete 操作。使用方法如下:

      HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

      if(hAdmin.tableExists(tableName)){

      hAdmin.disableTable(tableName);

      hAdmin.deleteTable(tableName);

      }

      5、查詢數據

      查詢分為單條隨機查詢和批量查詢。單條查詢通過 Row Key 在Table 中查詢某一行的數據,HTable 提供了get 方法完成單條查詢。批量查詢通過制定一段 Row Key 的范圍來查詢,HTable 提供了 getScanner 方法完成批量查詢。

      public Result get(final Get get)

      public ResultScanner getScanner(final Scan scan)

      Get 對象包含一個 Get 查詢需要的信息,它的構造方法有兩種。

      public Get(byte [] row)

      public Get(byte [] row,RowLock rowLock)

      Row Lock 為了保證讀寫的原子性,可以傳遞一個已經存在 Row Lock,否則 HBase 會自動生成一個新的 Row Lock。

      Scan 對象提供了默認構造函數,一般使用默認構造函數。

      1) Get 和 Scan 的常用方法有以下幾個:

      addFamily/addColumn:指定需要的 Family 或者 Column,如果沒有調用任何 Family 或者 Column,會返回所有的 Column。

      setMaxVersions:指定最大的版本個數。如果不帶任何參數調用 setMaxVersions,表示取所有的版本。如果不調用 setMaxVersions,只會取到最新的版本。

      setTimeRange:指定最大的時間戳和最小的時間戳,只有在此范圍內的 Cell 才能被獲取。

      setTimeStamp:指定時間戳。

      setFilter:指定 Filter 過濾不需要的信息。

      2) Scan 特有的方法如下:

      setStartRow:指定開始的行。如果不調用,從表頭開始。

      setStopRow:指定結束的行(不含此行)。

      setBatch:指定最多返回的 Cell 數目。防止一行中有過多的數據,導致 OOM 錯誤。

      3) Result 代表是一行的數據。常用方法有以下幾個:

      getRow:返回 Row Key。

      raw:返回所有的 KeyValue 數組。

      getValue:按照 Column 來獲取 Cell 的值。

      ResultScanner 是 Result 的一個容器,每次調用ResultScanner 的next 方法會返回Result。

      public Result next() throws IOException;

      public Result [] next(int nbRows) throws IOException;

      示例代碼如下:

      6、 插入數據

      HTable 通過 put 方法插入數據,可以傳遞單個 put 對象 或 List put 對象分別實現單條插入和批量插入。

      public void put(final Put put) throws IOException

      HBase 相關API操練

      public void put(final List< Put> puts) throws IOException

      Put 提供3 種構造方式:

      public Put(byte [] row)

      public Put(byte [] row)

      public Put(byte [] row,RowLock rowLock)

      public Put(Put putToCopy)

      Put 常用的方法有以下幾個:

      1)add:增加一個 Cell。

      2)setTimeStamp:指定所有 Cell 默認的 timestamp,如果一個 Cell 沒有指定 timestamp,就會用到這個值。如果沒有調用,HBase 會將當前時間作為未指定 timestamp 的Cell 的 timestamp。

      3)setWriteToWAL:WAL 是 Write Ahead Log 的縮寫,指的是 HBase 在插入操作前是否寫 Log。默認是打開,關掉會提高性能,但是如果系統出現故障(負責插入的Region Server 掛掉),數據可能會丟失。

      另外 HTable 也有兩個方法會影響插入的性能。

      1)setAutoFlash:AutoFlush 指的是在每次調用 HBase 的 Put 操作,是否提交到 HBase Server。默認是 true,每次會提交。如果此時是單條插入,就會有更多的I/O,從而降低其性能。

      2)setWriteBufferSize:Write Buffer Size 在 AutoFlush 為false 的時候起作用,默認是 2MB,也就是插入數據超過 2MB,就會自動提交到 Server。

      示例代碼如下:

      7、 刪除數據

      HTable 通過 delete 方法刪除數據。

      public void delete(final Delete delete)

      Delete 構造方法如下:

      public Delete(byte [] row)

      public Delete(byte [] row, long timestamp, RowLock rowLock)

      public Delete(final Delete d)

      Delete 常用方法有 deleteFamily/deleteColumn,用來指定要刪除的 Family 或者 Column 的數據。 如果不調用任何這樣的方法,將會刪除整行。

      注意: 如果某個 Cell 的 timestamp 高于當前時間,這個 Cell 將不會被刪除,仍然可以查出來。

      示例代碼如下:

      HTable table = new HTable(hbaseConfig,"mytest");

      Delete d = new Delete("row1".getBytes());

      table.delete(d)

      8、 切分表

      HBaseAdmin 提供 split 方法將 table 進行切分。

      public void split(final String tableNameOrRegionName)

      如果提供的是 tableName,會將 table 所有 Region 進行切分;如果提供的是 RegionName,只會切分這個Region。Split 是一個異步操作,因此它并不能確切控制 Region 的個數。

      示例代碼如下:

      MapReduce 操作 HBase

      在 HBase 系統上運行批處理運算,最方便和實用的模型依然是 MapReduce,如下圖所示:

      HBase Table 和 Region 的關系類似 HDFS File 和 Block 的關系,HBase提供配套的 TableInputFormat 和 TableOutputFormat API,可以方便地將 HBase Table 作為 Hadoop MapReduce 的Source 和 Sink。對于 MapReduce Job 應用開發人員來說,基本不需要關注 HBase 系統本身的細節。

      org.apache.hadoop.hbase.mapreduce 包中的類和工具用來將 HBase 作為 MapReduce 作業的輸出

      1、 HBaseConfiguration 類

      org.apache.hadoop.hbase.HbaseConfiguration 繼承了 org.apache.hadoop.conf.Configuration 類, 創建一個 HBaseConfiguration 對象實例,會返回讀入 CLASSPATH 下 hbase-site.xml 文件和hbase-default.xml 文件中 HBase 配置信息的一個 Configuration,該Configuration 接下來會用于 創建 HBaseAdmin 和 HTable 實例。

      HBaseAdmin 和 HTable 兩個類在 org.apache.hadoop.hbase.client 包中,HBaseAdmin 用于管理 HBase 集群、添加和刪除表,HTable 用于訪問指定的表,Configuration 實例指向了執行這些代碼的集群上的這些類。

      2、 HtableDescriptor 類和 HColumnDescriptor 類

      HBase 中表結構由 HTableDescriptor 描述(包括 HColumnDescriptor),對表的新增、修改、刪除操作在接口 HMasterInterface 中定義,而該接口由 HMaster 實現。

      HTabledescriptor包含:

      1)表名、byte[] 和 String 格式。

      2)表的元信息,以Key-Value形式存儲。存儲信息包括文件最大的大小(默認256MB)、是否只讀、Flush 時內存占用大小(默認64MB)、是否 root 或 Meta Region、DEFERRED_LOG_FLUSH。

      3)表的各 Family 描述 HColumnDescriptor。

      HColumnDescriptor 描述 Column Family 的信息,包括:

      1)壓縮格式(不壓縮或僅壓縮 Value、壓縮 Block 中的一系列記錄)。

      2)數據的版本數量。

      3)Block 的大小。

      4)是否在內存中。

      5)是否 Cache Block。

      6)是否使用 bloomfilter。

      7)Cell 內容的存活時間。

      8)是否復制。

      當一個 Column Family 創建后,其參數不能修改,除非刪除該 Column Family 后新建一個, 但刪除 Column Family 也會刪除該 Column Family 下的數據。另外,HTableDescriptor 中包含 ROOT_TABLEDESC 和 META_TABLEDESC 兩個實例以描述-ROOT- 和 .META 表。

      1)ROOT_TABLEDESC 包含一個 info 的 Column Family。

      2)META_TABLEDESC 包含一個 info 和 historian,兩個 Column Family。

      3、 CreateTable 方法

      如果指定 Split Key 為該 Table 按指定鍵初始創建多個 Region,否則僅創建一個 Region,過程如下:

      1) 為 Table 創建 HRegionInfo

      2) 判斷是不是所有的 Meta Region 都 online(由 RegionManager 的 MetaScanner 掃描線程分配 Meta Region)。

      3) 判斷 ServerManager 是否有足夠 Region Server 來創建 table。

      從 RegionManager 的 online MetaRegion 查找該 HRegionInfo 應放入哪一個 MetaRegion 中,在 onlineMetaRegion 中查找僅比RegionName 小的 MetaRegion,而RegionName 由 tableName、起始 Key 和 regionId(root 為0,meta 為1,user 當前時間)組成,同時 Master 的 ServerConnection 獲取 HRegionInterface 代理連接到該 MetaRegion,并查找對應該 Table 為 Key 的記錄是否存在,若存在則報錯該表已經存在,由 RegionManager 根據 HRegionInfo 創建新的 user。Region 在 rootDir 目錄下 新建以 tableName 為名的目錄,在 tableName 目錄下新建一個 Region 的目錄(經編碼后的 RegionName),并新建一個 HRegion 對象。

      disable、enable 和 delete 等操作封裝在繼承自 TableOperation 的類中,該類先獲得要操作表的所有 MetaRegion,掃描這些 MetaRegion 中 所有該表的 user Region 信息并做相應處理,最后處理 MetaRegion。

      4、 TableInputFormat 類

      通過設置 conf.set(TableInputFormat.INPUT_TABLE,"tableName") 設定 HBase 的輸入表,tableName 為表名。

      設置 conf.set(TableInputFormat.SCAN,TableMRUtil.convertScanToString(scan)),設定對 HBase 輸入表的 scan 方式。

      setTable(new HTable(new Configuration(conf),tableName));

      通過 TableInputFormat.setConf(Configuration conf) 方法初始化 scan 對象;scan 對象是從 Job 中設置的對象,以字符串的形式傳給 TableInputFormat,在 TableInputFormat 內部將 scan 字符串轉換為 scan 對象,操作如下:

      scan = TableMapReduceUtil.convertStringtoScan(conf.get(SCAN))

      TableInputFormat 繼承 TableInputFormatBase 實現了 InputFormat 抽象類的兩個抽象方法 getSplits() 和 createRecordReader()。

      getSplits() 判定輸入對象的切分原則,原則是對于 TableInputFormatBase,會遍歷HBase 相應表的所有 HRegion,每一個 HRegion 都會被切分成一個 Split,所以切分的塊數與表中 HRegion 的數目是相同的,代碼如下:

      InputSplit split = new TableSplit(table.getTableName(),splitStart,splitStop,regionLocation);

      在 Split 中只會記載 HRegion 的起始 Row Key 和 結束Row Key,具體去讀取這片區域的數據是 createRecordReader() 實現的。

      對于一個 Map 任務,JobTracker 會考慮 TaskTracker 的網絡位置,并選取一個距離其輸入分片文件的最近的 TaskTracker。在理想情況下,任務是數據本地化的(data-local), 也就是任務運行在輸入分片所在的節點上。同樣,任務也可能是機器本地化的;任務和輸入分片在同一個機架,但不在同一個節點上。

      對于Reduce 任務,JobTracker 簡單地從待運行的 Reduce 任務列表中選取下一個來運行,用不著考慮數據段本地化。

      createRecordReader() 按照必然格式讀取響應數據,接受 Split 塊,返回讀取記錄的結果,操作代碼如下:

      tableRecorderReader.init() 返回的是這個分塊的起始 Row Key 的記錄;RecordReader 將一個 Split 解析成 < Key, Value> 的形式 提供給 map 函數,Key 就是Row Key,Value 就是對應的一行數據。

      RecorderReader 用于在劃分中讀取 < Key,Value> 對。RecorderReader 有5 個虛方法,下面分別進行介紹:

      1、initialize:初始化,輸入參數包括該 Reader 工作的數據劃分 InputSplit 和 Job 的上下文 context。

      2、nextKey:得到輸入的下一個 Key,如果數據劃分已經沒有新的記錄,返回空。

      3、nextValue:得到 Key 對應的 Value,必須在調用 nextKey 后調用。

      4、 getProgress:得到現在的進度。

      5、close:來自 java.io 的Closeable 接口,用于清理 RecorderReader。

      在 MapReduce 驅動中調用 TableInputFormat 的類:

      job.setInputFormatClass(TableInputFormat.class);

      使用以下方法就不需要再單獨定義。

      tableMapReduceUtil.initTableReducerJob("daily_result", DailyReduce.class, job);

      initTableReducerJob() 方法完成一系列操作。

      1) job.setOutputFormatClass(TableOutputFormat.class);設置輸出格式。

      2)conf.set(TableOutputFormat.OUTPUT_TABLE,table);設置輸出表。

      3) 初始化 partition。

      向 HBase 中寫入數據

      本節介紹利用 MapReduce 操作 HBase,首先介紹如何上傳數據,借助最熟悉的 WordCount 案例,將 WordCount 的結果存儲到 HBase 而不是 HDFS。

      輸入文件 test.txt 的內容為:

      hello hadoop

      hadoop is easy

      1) 編寫 Mapper 函數。

      2) 編寫 Reducer 類。

      3) 編寫驅動類。

      數據插入hbase數據庫后,查詢結果如下所示:

      讀取 HBase 中的數據

      下面介紹如何讀取 HBase 中的數據。讀取數據比較簡單,編寫 Mapper 函數,讀取 < Key,Value> 值,通過 Reducer 函數直接輸出得到的結果就行了。

      1) 編寫 Mapper 函數。

      2) 實現 Reducer 類。

      3) 編寫驅動類。

      從hbase讀取數據,輸出到hdfs的數據如下所示:

      easy 1

      hadoop 2

      hello 1

      is 1

      至此!

      Java API HBase

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

      上一篇:linux的systemd與init的區別
      下一篇:大數據平臺安裝部署系列——【3】Hadoop集群搭建
      相關文章
      亚洲精品视频在线免费| 亚洲色中文字幕在线播放| 亚洲精品天堂成人片AV在线播放 | 亚洲男人第一av网站| 久久青青草原亚洲av无码| 亚洲AV无码专区亚洲AV桃| 亚洲久热无码av中文字幕| 亚洲精华国产精华精华液好用| 亚洲欧美国产欧美色欲| 亚洲欧美日韩综合久久久久 | 中文有码亚洲制服av片| 亚洲熟女乱色一区二区三区| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲国产精品综合福利专区| 亚洲w码欧洲s码免费| 中文字幕亚洲综合小综合在线| 国产午夜亚洲精品| 蜜芽亚洲av无码一区二区三区| 欧美色欧美亚洲另类二区| mm1313亚洲国产精品无码试看| 深夜国产福利99亚洲视频| 亚洲综合色视频在线观看| 亚洲欧洲美洲无码精品VA| 亚洲av无码无在线观看红杏| 亚洲一卡2卡三卡4卡有限公司| 亚洲男人天堂影院| 亚洲中文字幕久久精品蜜桃| 含羞草国产亚洲精品岁国产精品 | 亚洲精品动漫人成3d在线| 亚洲中文字幕无码久久精品1| 亚洲国产精品无码久久一线| 亚洲最新视频在线观看| 亚洲人成网站日本片| 亚洲国产成人精品无码区花野真一 | 国产精一品亚洲二区在线播放| 亚洲欧洲日产国码久在线观看 | 国产成人亚洲综合无码| 亚洲AV综合色区无码一区爱AV| 亚洲色偷偷av男人的天堂| 亚洲看片无码在线视频| 国产综合成人亚洲区|