1. 程式人生 > >Hadoop學習筆記—15.HBase框架學習(基礎實踐篇)

Hadoop學習筆記—15.HBase框架學習(基礎實踐篇)

一、HBase的安裝配置

1.1 偽分佈模式安裝

  偽分佈模式安裝即在一臺計算機上部署HBase的各個角色,HMaster、HRegionServer以及ZooKeeper都在一臺計算機上來模擬。

  首先,準備好HBase的安裝包,我這裡使用的是HBase-0.94.7的版本,已經上傳至百度網盤之中(URL:http://pan.baidu.com/s/1pJ3HTY7

  (1)通過FTP將hbase的安裝包拷貝到虛擬機器hadoop-master中,並執行一系列操作:解壓縮、重新命名、設定環境變數

  ①解壓縮:tar -zvxf hbase-0.94.7-security.tar.gz

  ②重新命名:mv hbase-94.7-security hbase

  ③設定環境變數:vim /etc/profile,增加內容如下,修改後重新生效:source /etc/profile

export HBASE_HOME=/usr/local/hbase

export PATH=.:$HADOOP_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

  (2)進入hbase/conf目錄下,修改hbase-env.sh檔案:

export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=true #告訴HBase使用它自己的zookeeper例項,分散式模式下需要設定為false

  (3)在hbase/conf目錄下,繼續修改hbase-site.xml檔案:

<property>
  <name>hbase.rootdir</name>
  <value>hdfs://hadoop-master:9000/hbase</value>
</property>
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>hadoop-master</value>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>

  (4)【可選步湊】修改regionservers檔案,將localhost改為主機名:hadoop-master

  (5)啟動HBase:start-hbase.sh

PS:由上一篇可知,HBase是建立在Hadoop HDFS之上的,因此在啟動HBase之前要確保已經啟動了Hadoop,啟動Hadoop的命令是:start-all.sh

  (6)驗證是否啟動HBase:jps

  

  由上圖發現,多了三個java程序:HMaster、HRegionServer以及HQuorumPeer

  還可以通過訪問HBase的Web介面檢視:http://hadoop-master:60010

1.2 分散式模式安裝

  本次安裝在1.1節的偽分佈模式的基礎上進行修改搭建分散式模式,本次的叢集實驗環境結構如下圖所示:

  由上圖可知,HMaster角色是192.168.80.100(主機名:hadoop-master),而兩個HRegionServer角色則是兩臺192.168.80.101(主機名:hadoop-slave1)和192.168.80.102(主機名:hadoop-slave2)組成的。

  (1)修改hadoop-master伺服器上的的幾個關鍵配置檔案:

  ①修改hbase/conf/hbase-env.sh:將最後一行修改為如下內容

export HBASE_MANAGES_ZK=false  #不使用HBase自帶的zookeeper例項

  ②修改hbase/conf/regionservers:將原來的hadoop-master改為如下內容

hadoop-slave1

hadoop-slave2

  (2)將hadoop-master上的hbase資料夾與/etc/profile配置檔案整體複製到hadoop-slave1與hadoop-slave2中:

scp -r /usr/local/hbase hadoop-slave1:/usr/local/  

scp -r /usr/local/hbase hadoop-slave2:/usr/local/

scp /etc/profile hadoop-slave1:/etc/

scp /etc/profile hadoop-slave2:/etc/

  (3)在hadoop-slave1與hadoop-slave2中使配置檔案生效:

source /etc/profile

  (4)在hadoop-master中啟動Hadoop、Zookeeper與HBase:(注意先後順序)

start-all.sh

zkServer.sh start

start-hbase.sh

  (5)在HBase的Web介面中檢視Hbase叢集狀態:

二、HBase Shell基本命令

2.1 DDL:建立與刪除表

  (1)建立表:

>create 'users','user_id','address','info'

#這裡建立了一張表users,有三個列族user_id,address,info

  獲取表users的具體描述:

>describe 'users'

  (2)列出所有表:

>list

  

  (3)刪除表:在HBase中刪除表需要兩步,首先disable,其次drop

>disable 'users'

>drop 'users'

2.2 DML:增刪查改

  (1)增加記錄:put

>put 'users','xiaoming','info:age','24';

>put 'users','xiaoming','info:birthday','1987-06-17';

>put 'users','xiaoming','info:company','alibaba';

>put 'users','xiaoming','address:contry','china';

>put 'users','xiaoming','address:province','zhejiang';

>put 'users','xiaoming','address:city','hangzhou';

  (2)掃描users表的所有記錄:scan

>scan 'users'

  (3)獲取一條記錄

  ①取得一個id(row_key)的所有資料

>get 'users','xiaoming'

  ②獲取一個id的一個列族的所有資料

>get 'users','xiaoming','info'

  ③獲取一個id,一個列族中一個列的所有資料

>get 'users','xiaoming','info:age'

  (4)更新一條記錄:依然put

  例如:更新users表中小明的年齡為29

>put 'users','xiaoming','info:age' ,'29'

>get 'users','xiaoming','info:age

  (5)刪除記錄:delete與deleteall

  ①刪除xiaoming的值的'info:age'欄位

>delete 'users','xiaoming','info:age'

  ②刪除xiaoming的整行資訊

>deleteall 'users','xiaoming'

2.3 Other:其他幾個比較有用的命令

  (1)count:統計行數

>count 'users'

  (2)truncate:清空指定表

>truncate 'users'

三、HBase Java API操作

3.1 預備工作

  (1)匯入HBase的專案jar包

  (2)匯入HBase/lib下的所有依賴jar包

3.2 HBase Java開發必備:獲取配置

    /*
     * 獲取HBase配置
     */
    private static Configuration getConfiguration()
    {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.rootdir","hdfs://hadoop-master:9000/hbase");
        //使用eclipse時必須新增這個,否則無法定位
        conf.set("hbase.zookeeper.quorum","hadoop-master");
        
        return conf;
    }    

3.3 使用HBaseAdmin進行DDL操作

  (1)建立表

   /*
     * 建立表
     */
    private static void createTable()
            throws IOException {
        HBaseAdmin admin = new HBaseAdmin(getConfiguration());
        if (admin.tableExists(TABLE_NAME)) {
            System.out.println("The table is existed!");
        }else{
            HTableDescriptor tableDesc = new HTableDescriptor(TABLE_NAME);
            tableDesc.addFamily(new HColumnDescriptor(FAMILY_NAME));
            admin.createTable(tableDesc);
            System.out.println("Create table success!");
        }
    }

  (2)刪除表

    /*
     * 刪除表
     */
    private static void dropTable(String tableName)
            throws IOException {        
        HBaseAdmin admin = new HBaseAdmin(getConfiguration());
        if(admin.tableExists(tableName)){
            try {
              admin.disableTable(tableName);
              admin.deleteTable(tableName);
            } catch (IOException e) {
              e.printStackTrace();
              System.out.println("Delete "+tableName+" failed!");
            }
        }
        System.out.println("Delete "+tableName+" success!");
    }

3.4 使用HTable進行DML操作

  (1)新增記錄

    public static void putRecord(String tableName, String row, 
            String columnFamily, String column, String data) 
                    throws IOException{
        HTable table = new HTable(getConfiguration(), tableName);
        Put p1 = new Put(Bytes.toBytes(row));
        p1.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),     Bytes.toBytes(data));
        table.put(p1);
        System.out.println("put'"+row+"',"+columnFamily+":"+column+"','"+data+"'");
    }

  (2)讀取記錄

    public static void getRecord(String tableName, String row) throws IOException{
        HTable table = new HTable(getConfiguration(), tableName);
        Get get = new Get(Bytes.toBytes(row));
        Result result = table.get(get);
        System.out.println("Get: "+result);
    }

  (3)全表掃描

    public static void scan(String tableName) throws IOException{
      HTable table = new HTable(getConfiguration(), tableName);
      Scan scan = new Scan();
      ResultScanner scanner = table.getScanner(scan);
      for (Result result : scanner) {
          System.out.println("Scan: "+result);
      }
    }

3.5 API實戰:詳單入庫

   結合本筆記第五篇《自定義型別處理手機上網日誌》的手機上網日誌為背景,我們要做的就是將日誌通過MapReduce匯入到HBase中進行儲存。該日誌的資料結構定義如下圖所示:(該檔案的下載地址為:http://pan.baidu.com/s/1dDzqHWX

log

  (1)在HBase中通過Shell建立一張表:wlan_log

> create 'wlan_log','cf'

  這裡為了簡單定義,之定義了一個列族cf

  (2)在ecplise中新建一個類:BatchImportJob,該類的程式碼如下所示:

package hbase;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.mapreduce.TableOutputFormat;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

public class BatchImportJob {

    static class BatchImportMapper extends
            Mapper<LongWritable, Text, LongWritable, Text> {
        
        SimpleDateFormat dateformat1 = new SimpleDateFormat("yyyyMMddHHmmss");
        Text v2 = new Text();

        protected void map(LongWritable key, Text value, Context context)
                throws java.io.IOException, InterruptedException {
            final String[] splited = value.toString().split("\t");
            try {
                final Date date = new Date(Long.parseLong(splited[0].trim()));
                final String dateFormat = dateformat1.format(date);
                String rowKey = splited[1] + ":" + dateFormat;
                v2.set(rowKey + "\t" + value.toString());
                context.write(key, v2);
            } catch (NumberFormatException e) {
                final Counter counter = context.getCounter("BatchImportJob",
                        "ErrorFormat");
                counter.increment(1L);
                System.out.println("出錯了" + splited[0] + " " + e.getMessage());
            }
        };
    }

    static class BatchImportReducer extends
            TableReducer<LongWritable, Text, NullWritable> {
        protected void reduce(LongWritable key,
                java.lang.Iterable<Text> values, Context context)
                throws java.io.IOException, InterruptedException {
            for (Text text : values) {
                final String[] splited = text.toString().split("\t");

                final Put put = new Put(Bytes.toBytes(splited[0]));
                put.add(Bytes.toBytes("cf"), Bytes.toBytes("date"),
                        Bytes.toBytes(splited[1]));
                put.add(Bytes.toBytes("cf"), Bytes.toBytes("msisdn"),
                        Bytes.toBytes(splited[2]));
                // 省略其他欄位,呼叫put.add(....)即可
                context.write(NullWritable.get(), put);
            }
        };
    }

    public static void main(String[] args) throws Exception {
        final Configuration configuration = new Configuration();
        // 設定zookeeper
        configuration.set("hbase.zookeeper.quorum", "hadoop-master");
        // 設定hbase表名稱
        configuration.set(TableOutputFormat.OUTPUT_TABLE, "wlan_log");
        // 將該值改大,防止hbase超時退出
        configuration.set("dfs.socket.timeout", "180000");

        final Job job = new Job(configuration, "HBaseBatchImportJob");

        job.setMapperClass(BatchImportMapper.class);
        job.setReducerClass(BatchImportReducer.class);
        // 設定map的輸出,不設定reduce的輸出型別
        job.setMapOutputKeyClass(LongWritable.class);
        job.setMapOutputValueClass(Text.class);

        job.setInputFormatClass(TextInputFormat.class);
        // 不再設定輸出路徑,而是設定輸出格式型別
        job.setOutputFormatClass(TableOutputFormat.class);

        FileInputFormat.setInputPaths(job, "hdfs://hadoop-master:9000/testdir/input/HTTP_20130313143750.dat");

        boolean success = job.waitForCompletion(true);
        if (success) {
            System.out.println("Bath import to HBase success!");
            System.exit(0);
        } else {
            System.out.println("Batch import to HBase failed!");
            System.exit(1);
        }
    }

}
View Code

  通過執行後,在HBase中通過Shell命令(list)檢視匯入結果:

  (3)在eclipse中新建一個類:MobileLogQueryApp,對已經儲存的wlan_log進行查詢的Java開發,該類的程式碼如下所示:

package hbase;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;

public class MobileLogQueryApp {

    private static final String TABLE_NAME = "wlan_log";
    private static final String FAMILY_NAME = "cf";

    /**
     * HBase Java API基本使用示例
     * 
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        scan(TABLE_NAME,"13600217502");
        System.out.println();
        scanPeriod(TABLE_NAME, "136");
    }

    /*
     * 查詢手機13600217502的所有上網記錄
     */
    public static void scan(String tableName, String mobileNum)
            throws IOException {
        HTable table = new HTable(getConfiguration(), tableName);
        Scan scan = new Scan();
        scan.setStartRow(Bytes.toBytes(mobileNum + ":/"));
        scan.setStopRow(Bytes.toBytes(mobileNum + "::"));
        ResultScanner scanner = table.getScanner(scan);
        int i = 0;
        for (Result result : scanner) {
            System.out.println("Scan: " + i + " " + result);
            i++;
        }
    }

    /*
     * 查詢134號段的所有上網記錄
     */
    public static void scanPeriod(String tableName, String period)
            throws IOException {
        HTable table = new HTable(getConfiguration(), tableName);
        Scan scan = new Scan();
        scan.setStartRow(Bytes.toBytes(period + "/"));
        scan.setStopRow(Bytes.toBytes(period + ":"));
        scan.setMaxVersions(1);
        ResultScanner scanner = table.getScanner(scan);
        int i = 0;
        for (Result result : scanner) {
            System.out.println("Scan: " + i + " " + result);
            i++;
        }
    }

    /*
     * 獲取HBase配置
     */
    private static Configuration getConfiguration() {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.rootdir", "hdfs://hadoop-master:9000/hbase");
        // 使用eclipse時必須新增這個,否則無法定位
        conf.set("hbase.zookeeper.quorum", "hadoop-master");

        return conf;
    }

}
View Code

  這裡主要進行了兩個查詢操作:按指定手機號碼查詢 和 按指定手機號碼網段區間查詢,執行結果如下所示:

參考資料

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

Hadoop學習筆記15.HBase框架學習基礎知識篇

dfs hdfs keep 負載均衡 包含 兩個 列族 文件存儲 version HBase是Apache Hadoop的數據庫,能夠對大型數據提供隨機、實時的讀寫訪問。HBase的目標是存儲並處理大型的數據。HBase是一個開源的,分布式的,多版本的,面向列的存儲模型,它

Hadoop學習筆記15.HBase框架學習基礎實踐篇

一、HBase的安裝配置 1.1 偽分佈模式安裝   偽分佈模式安裝即在一臺計算機上部署HBase的各個角色,HMaster、HRegionServer以及ZooKeeper都在一臺計算機上來模擬。   首先,準備好HBase的安裝包,我這裡使用的是HBase-0.94.7的版本,已經上傳至百度網盤之中

Hadoop學習筆記—18.Sqoop框架學習

max lec sql數據庫 creat rec apt 成功 不同的 mysql數據庫 一、Sqoop基礎:連接關系型數據庫與Hadoop的橋梁 1.1 Sqoop的基本概念     Hadoop正成為企業用於大數據分析的最熱門選擇,但想將你的數據移植過去並不容易。Apa

Hadoop學習筆記—16.Pig框架學習

rar 開發人員 ava 大型 arr 壓縮包 上網 結構化數據 模式 一、關於Pig:別以為豬不能幹活 1.1 Pig的簡介   Pig是一個基於Hadoop的大規模數據分析平臺,它提供的SQL-LIKE語言叫Pig Latin,該語言的編譯器會把類SQL的數據分析請求

Hadoop學習筆記—19.Flume框架學習

暫存 ssh lin hadoop 兩個 move hdf 裝包 ons START:Flume是Cloudera提供的一個高可用的、高可靠的開源分布式海量日誌收集系統,日誌數據可以經過Flume流向需要存儲終端目的地。這裏的日誌是一個統稱,泛指文件、操作記錄等許多數據。

Framework7學習筆記之 搜索欄舊版

spa 結果 ... 視圖 nbsp str -i type bar 一:搜索欄 應用場景:一般用於在含有列表的頁面中進行內容檢索。 二:定義搜索欄 搜索欄應該放到“.page”內,“.page-content”前; 在page-conten

[吳恩達機器學習筆記]15非監督學習異常檢測7-8使用多元高斯分布進行異常檢測

進行 平均值 info 錯誤 blog 占用 ron 關系 http 15.異常檢測 Anomaly detection 覺得有用的話,歡迎一起討論相互學習~Follow Me 15.7-8 多變量高斯分布/使用多元高斯分布進行異常檢測 -Multivariate Gaus

CSS學習筆記:溢位文字省略text-overflow

在CSS3中,text-overflow屬性的基本語法如下: clip:表示不顯示省略文字,簡單的裁切。 ellipsis:表示物件文字溢位時顯示省略標記,省略標記插入的位置是最後一個字元。 ellipsis-word:表示當物件文字溢位時顯示省略標記,省略標記插入的

HTML學習筆記 AND 2018-11-1320:34

HTML學習筆記 2018-11-13(21:17) 一、圖形標籤 1.(img) img標籤:圖片標籤,用於頁面上引入圖片。 常用屬性: src: 設定要引入的圖片url(路徑) alt: 設定影象的替代文字,如果圖片找不到,或者不存在,替代文字才會出現。 width: 設定圖片的寬度。

Python學習筆記系列——高階函數map/reduce

from 類型 fun 轉換 浮點 color normal 整數 cto from functools import reduce #變量可以指向函數,函數的參數能接受變量,那麽一個函數就可以接受另一個函數作為參數,這種函數被稱之為高階函數 def add(x,y

前端學習筆記day03 水晶球製作盒子陰影

1. 水晶球 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Document</title> <st

【PHP學習筆記】Laravel動態路由自動路由

動態路由有利有弊, 利 方便,可不用配置路由 。。。。。。好像沒了 弊 寫了很多controller,不太方便檢視到底有多少對外暴露的介面。 不方便對不同介面設定不同規則 不方便自定義請求方式等 。。。。以及很多不方便的弊端

Django學習筆記010-學生管理系統Django實現

Django學習筆記-學生管理系統(Django實現)筆記中僅實現了對資料的全部查詢。 下面實現新增、刪除、修改,程式碼如下。 下面的程式碼沒有對輸入框內容進行限制,如果輸入不符合規則的內容,會出現錯誤。 本篇更新完畢後Django更新暫停一段,由於工作崗位是測試工程師,後面將重點關注測

Django學習筆記008-學生管理系統Django實現-查詢資料庫

資料庫配置: DATABASES = { 'default': { ##資料庫引擎 'ENGINE': 'django.db.backends.mysql', ##資料庫主機地址 'HOST': '127.0.0.1',

《Oracle PL/SQL例項精講》學習筆記18——本地動態SQL 第二部分

本章內容: 1. EXECUTE IMMEDIATE語句 2. OPEN-FOR、FETCH和CLOSE語句 程式碼如下: 2. OPEN-FOR、FETCH和CLOSE語句 SQL> DECLARE 2 TYPE zip_cur_type IS

Java改錯式學習筆記及其自我內功修養持續更新

 · 在JAVA中判斷字串是否為空行的方法不是String.equals("\n"),而是String.equals("");  · list .addAll(otherList)完全複製,否則直接list1 = list2;是指標指向同一記憶體  ·

《Java與模式》學習筆記之七―――建造模式Builder Pattern

問題: 當我們要建立的物件很複雜的時候(一般是由很多其它的物件組合而成),最好將物件的建立和表示分離開來,這樣做的好處就是通過一步步地進行復雜物件的建立而且每一步構造的過程引入不同的引數,使得相同的建立步驟可以得到不同的物件。 特別是一個物件的多個構造過程的順序一定時,如構造

【Android學習筆記】 點選穿透Click Through

問題:開發一個App,主介面用了Activity,子頁面用了Fragment。從Activity跳轉到Fragment後Fragment透明,並且點選擊穿到Axtivity。 分析:剛開始沒有注意到點選擊穿,就是把背景換成不透明的顏色,這時在點選Fragment空白處時才發

機器學習筆記8-支援向量機3/3

機器學習筆記8-支援向量機(3/3) scikit-learn中的SVM函式 機器學習庫scikit-learn中也集成了SVM的函式,可以方便的進行呼叫,可用來分類、迴歸和異常點檢測。 支援向量機的優點有: i)在高維空間效果很好 ii)當維度數大於樣本點數時,效果仍然不錯 i

《Python程式設計從入門到實踐》學習筆記詳解-專案篇下載資料

上兩篇文章分別介紹了《Python程式設計從入門到實踐》的語法篇和專案篇(資料視覺化),這篇文 #專案二 下載資料 #訪問並可視化csv和json這兩種常見格式儲存的資料 #csv #提取並讀取資料 import csv filename='filename.c