Hbase JavaAPi介紹和使用示例(待更新)

Zero麒麟發表於2017-04-10

Hbase客戶端Api使用筆記

開發環境

系統 版本 下載地址
Idea 1.4 下載
hbase 1.1.0 下載

環境搭建

在這裡我用的是Maven建立專案

初步預覽

java類 HBase資料模型
HBaseAdmin 資料庫(DataBase)
HBaseConfiguration
HTable 表(Table)
HTableDescriptor 列族(Column Family)
Put 列修飾符(Column Qualifier)
Get
Scanner

HBaseConfiguration

關係:org.apache.hadoop.hbase.HBaseConfiguration

作用:對HBase進行配置

返回值 函式 描述
void addResource(Path file) 通過給定的路徑所指的檔案來新增資源
void clear() 清空所有已設定的屬性
string get(String name) 獲取屬性名對應的值
String getBoolean(String name, boolean defaultValue) 獲取為boolean型別的屬性值,如果其屬性值型別部位boolean,則返回預設屬性值
void set(String name, String value) 通過屬性名來設定值
void setBoolean(String name, boolean value) 設定boolean型別的屬性值

用法示例:

HBaseConfiguration hconfig = new HBaseConfiguration();
hconfig.set("hbase.zookeeper.property.clientPort","2181");

該方法設定了”hbase.zookeeper.property.clientPort”的埠號為2181。一般情況下,HBaseConfiguration會使用建構函式進行初始化,然後在使用其他方法。

HBaseAdmin

關係:org.apache.hadoop.hbase.client.HBaseAdmin

作用:提供了一個介面來管理HBase資料庫的表資訊。它提供的方法包括:建立表,刪除表,列出表項,使表有效或無效,以及新增或刪除表列族成員等。

返回值 函式 描述
void addColumn(String tableName, HColumnDescriptor column) 向一個已經存在的表新增咧
checkHBaseAvailable(HBaseConfiguration conf) 靜態函式,檢視HBase是否處於執行狀態
createTable(HTableDescriptor desc) 建立一個表,同步操作
deleteTable(byte[] tableName) 刪除一個已經存在的表
enableTable(byte[] tableName) 使表處於有效狀態
disableTable(byte[] tableName) 使表處於無效狀態
HTableDescriptor[] listTables() 列出所有使用者控制元件表項
void modifyTable(byte[] tableName, HTableDescriptor htd) 修改表的模式,是非同步的操作,可能需要花費一定的時間
boolean tableExists(String tableName) 檢查表是否存在

用法示例:

HBaseAdmin admin = new HBaseAdmin(config);
admin.disableTable("tablename")

HTableDescriptor

關係:org.apache.hadoop.hbase.HTableDescriptor

作用:包含了表的名字極其對應表的列族

返回值 函式 描述
void addFamily(HColumnDescriptor) 新增一個列族
HColumnDescriptor removeFamily(byte[] column) 移除一個列族
byte[] getName() 獲取表的名字
byte[] getValue(byte[] key) 獲取屬性的值
void setValue(String key, String value) 設定屬性的值

用法示例:

HTableDescriptor htd = new HTableDescriptor(table);
htd.addFamily(new HcolumnDescriptor("family"));

在上述例子中,通過一個HColumnDescriptor例項,為HTableDescriptor新增了一個列族:family

HColumnDescriptor

關係:org.apache.hadoop.hbase.HColumnDescriptor

作用:維護著關於列族的資訊,例如版本號,壓縮設定等。它通常在建立表或者為表新增列族的時候使用。列族被建立後不能直接修改,只能通過刪除然後重新建立的方式。列族被刪除的時候,列族裡面的資料也會同時被刪除。

返回值 |函式 |描述
byte[]| getName()| 獲取列族的名字
byte[] |getValue(byte[] key)| 獲取對應的屬性的值
void| setValue(String key, String value)| 設定對應屬性的值
用法示例:

HTableDescriptor htd = new HTableDescriptor(tablename);
HColumnDescriptor col = new HColumnDescriptor("content:");
htd.addFamily(col);

此例新增了一個content的列族

HTable

關係:org.apache.hadoop.hbase.client.HTable

作用:可以用來和HBase表直接通訊。此方法對於更新操作來說是非執行緒安全的。

返回值 函式 描述
void checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put 自動的檢查row/family/qualifier是否與給定的值匹配
void close() 釋放所有的資源或掛起內部緩衝區中的更新
Boolean exists(Get get) 檢查Get例項所指定的值是否存在於HTable的列中
Result get(Get get) 獲取指定行的某些單元格所對應的值
byte[][] getEndKeys() 獲取當前一開啟的表每個區域的結束鍵值
ResultScanner getScanner(byte[] family) 獲取當前給定列族的scanner例項
HTableDescriptor getTableDescriptor() 獲取當前表的HTableDescriptor例項
byte[] getTableName() 獲取表名
static boolean isTableEnabled(HBaseConfiguration conf, String tableName) 檢查表是否有效
void put(Put put) 向表中新增值

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
ResultScanner scanner =  table.getScanner(family);

Put

關係:org.apache.hadoop.hbase.client.Put

作用:用來對單個行執行新增操作

返回值 函式 描述
Put add(byte[] family, byte[] qualifier, byte[] value) 將指定的列和對應的值新增到Put例項中
Put add(byte[] family, byte[] qualifier, long ts, byte[] value) 將指定的列和對應的值及時間戳新增到Put例項中
byte[] getRow() 獲取Put例項的行
RowLock getRowLock() 獲取Put例項的行鎖
long getTimeStamp() 獲取Put例項的時間戳
boolean isEmpty() 檢查familyMap是否為空
Put setTimeStamp(long timeStamp) 設定Put例項的時間戳

用法示例:

HTable table = new HTable(conf,Bytes.toBytes(tablename));
Put p = new Put(brow);//為指定行建立一個Put操作
p.add(family,qualifier,value);
table.put(p);

Get

關係:org.apache.hadoop.hbase.client.Get

作用:用來獲取單個行的相關資訊

返回值 函式 描述
Get addColumn(byte[] family, byte[] qualifier) 獲取指定列族和列修飾符對應的列
Get addFamily(byte[] family) 通過指定的列族獲取其對應列的所有列
Get setTimeRange(long minStamp,long maxStamp) 獲取指定取件的列的版本號
Get setFilter(Filter filter) 當執行Get操作時設定伺服器端的過濾器

用法示例:

HTable table = new HTable(conf, Bytes.toBytes(tablename));
Get g = new Get(Bytes.toBytes(row));

Result

關係:org.apache.hadoop.hbase.client.Result

作用:儲存Get或者Scan操作後獲取表的單行值。使用此類提供的方法可以直接獲取值或者各種Map結構(key-value對)

返回值| 函式| 描述
boolean |containsColumn(byte[] family, byte[] qualifier) |檢查指定的列是否存在
NavigableMap

開發示例

public class HbaseTestApi {
    static Configuration conf = null;
    static Connection conn = null;
    static Random ra = new Random();

    static {
        Configuration conf = HBaseConfiguration.create();
        //配置訪問
        conf.set("hbase.zookeeper.quorum", "172.19.4.231,172.19.4.230,172.19.4.239");
        try {
            conn = ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 建立Hbase資料庫表
     * TableName 表名
     * colmnsName 列族名
     */
    @Test
    public void CreateHbaseTable() throws IOException {
        //表名
        TableName test = TableName.valueOf("test");
        Admin admin = conn.getAdmin();
        //判斷是否存在
        if (admin.tableExists(test)) {
            admin.disableTable(test);
            admin.deleteTable(test);
        }
        //表
        HTableDescriptor ht = new HTableDescriptor(test);
        //列族
        HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
        //設定最大版本
        hc.setMaxVersions(5);
        hc.setBlockCacheEnabled(true);
        //Block
        hc.setBlocksize(1800000);
        //將 列族新增到 表中
        ht.addFamily(hc);
        //請求建立
        admin.createTable(ht);
        //關閉
        admin.close();
    }

    /**
     * 插入
     */
    @Test
    public void insert() throws IOException {
        //獲取表
        Table table = conn.getTable(TableName.valueOf("test"));
        //建立一個 Put陣列,批量插入
        List<Put> putList = new ArrayList<Put>();
        for (int i = 0; i < 200; i++) {
            Put put = new Put(Bytes.toBytes(randomPhone()+"_"+System.currentTimeMillis()));
            put.addColumn("cf1".getBytes(), "name".getBytes(), randomUsername().getBytes());
            put.addColumn("cf1".getBytes(), "address".getBytes(), randomAddres().getBytes());
            put.addColumn("cf1".getBytes(), "phone".getBytes(), randomPhone().getBytes());
            put.addColumn("cf1".getBytes(), "type".getBytes(), randomType().getBytes());
            putList.add(put);
        }
        //寫入
        table.put(putList);
    }

    /**
     * 掃描
     */
    @Test
    public void ScanTable() throws IOException {
        Table table = conn.getTable(TableName.valueOf("test"));
        Scan scan = new Scan("0_one".getBytes());
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        while (iterator.hasNext()) {
            Result next = iterator.next();
            byte[] value = next.getValue("cf1".getBytes(), "name".getBytes());
            System.out.println(new String(value));
        }
    }

    /**
     * 模糊掃描
     */
    @Test
    public void findtype() throws IOException {
        Table table=conn.getTable(TableName.valueOf("test"));
        Scan scan=new Scan();
        FilterList filterlist=new FilterList(FilterList.Operator.MUST_PASS_ALL);
        PrefixFilter pf=new PrefixFilter("15".getBytes());
        SingleColumnValueFilter sf =new SingleColumnValueFilter("cf1".getBytes(),"address".getBytes(), CompareFilter.CompareOp.EQUAL,"湖南".getBytes());
        SingleColumnValueFilter sf1 =new SingleColumnValueFilter("cf1".getBytes(),"type".getBytes(), CompareFilter.CompareOp.EQUAL,"1".getBytes());
        filterlist.addFilter(pf);
        filterlist.addFilter(sf);
        filterlist.addFilter(sf1);
        scan.setFilter(filterlist);
        ResultScanner scanner = table.getScanner(scan);
        Iterator<Result> iterator = scanner.iterator();
        while(iterator.hasNext()){
            Result next = iterator.next();
            byte[] type = next.getValue("cf1".getBytes(), "type".getBytes());
            byte[] addres = next.getValue("cf1".getBytes(), "address".getBytes());
            byte[] name = next.getValue("cf1".getBytes(), "name".getBytes());
            byte[] phone = next.getValue("cf1".getBytes(), "phone".getBytes());

            System.out.println(new String(type,"utf8"));
            System.out.println(new String(addres,"utf8"));
            System.out.println(new String(phone,"utf8"));
//            System.out.println(new String(value,"utf8"));
        }
    }

    /**
     * @return 隨機名字
     */
    public static String randomUsername() {
        String name = "";
        for (int i = 0; i < 1; i++) {
            String[] firsname = {"趙", "錢", "孫", "李", "周", "吳", "鄭", "王", "馮", "陳",
                    "楮", "衛", "蔣", "沈", "韓", "楊", "朱", "秦", "尤", "許", "何", "呂",
                    "施", "張", "孔", "曹", "嚴", "華", "金", "魏", "陶", "姜", "戚", "謝",
                    "鄒", "喻", "柏", "水", "竇", "章", "雲", "蘇", "潘", "葛", "奚", "範",
                    "彭", "郎", "魯", "韋", "昌", "馬", "苗", "鳳", "花", "方", "俞", "任",
                    "袁", "柳", "酆", "鮑", "史", "唐", "費", "廉", "岑", "薛", "雷", "賀",
                    "倪", "湯", "滕", "殷", "羅", "畢", "郝", "鄔", "安", "常", "樂", "於",
                    "時", "傅", "皮", "卞", "齊", "康", "伍", "餘", "元", "卜", "顧", "孟",
                    "平", "黃", "和", "穆", "蕭", "尹", "姚", "邵", "湛", "汪", "祁", "毛",
                    "禹", "狄", "米", "貝", "明", "臧", "計", "伏", "成", "戴", "談", "宋",
                    "茅", "龐", "熊", "紀", "舒", "屈", "項", "祝", "董", "樑", "杜", "阮",
                    "藍", "閩", "席", "季", "麻", "強", "賈", "路", "婁", "危", "江", "童",
                    "顏", "郭", "梅", "盛", "林", "刁", "鍾", "徐", "丘", "駱", "高", "夏",
                    "蔡", "田", "樊", "胡", "凌", "霍", "虞", "萬", "支", "柯", "昝", "管",
                    "盧", "莫", "經", "房", "裘", "繆", "幹", "解", "應", "宗", "丁", "宣",
                    "賁", "鄧", "鬱", "單", "杭", "洪", "包", "諸", "左", "石", "崔", "吉",
                    "鈕", "龔", "程", "嵇", "邢", "滑", "裴", "陸", "榮", "翁", "荀", "羊",
                    "於", "惠", "甄", "麴", "家", "封", "芮", "羿", "儲", "靳", "汲", "邴",
                    "糜", "鬆", "井", "段", "富", "巫", "烏", "焦", "巴", "弓", "牧", "隗",
                    "山", "谷", "車", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲",
                    "伊", "宮", "寧", "仇", "欒", "暴", "甘", "斜", "厲", "戎", "祖", "武",
                    "符", "劉", "景", "詹", "束", "龍", "葉", "幸", "司", "韶", "郜", "黎",
                    "薊", "薄", "印", "宿", "白", "懷", "蒲", "邰", "從", "鄂", "索", "鹹",
                    "籍", "賴", "卓", "藺", "屠", "蒙", "池", "喬", "陰", "鬱", "胥", "能",
                    "蒼", "雙", "聞", "莘", "黨", "翟", "譚", "貢", "勞", "逄", "姬", "申",
                    "扶", "堵", "冉", "宰", "酈", "雍", "郤", "璩", "桑", "桂", "濮", "牛",
                    "壽", "通", "邊", "扈", "燕", "冀", "郟", "浦", "尚", "農", "溫", "別",
                    "莊", "晏", "柴", "瞿", "閻", "充", "慕", "連", "茹", "習", "宦", "艾",
                    "魚", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "終", "暨", "居",
                    "衡", "步", "都", "耿", "滿", "弘", "匡", "國", "文", "寇", "廣", "祿",
                    "闕", "東", "歐", "殳", "沃", "利", "蔚", "越", "夔", "隆", "師", "鞏",
                    "厙", "聶", "晁", "勾", "敖", "融", "冷", "訾", "辛", "闞", "那", "簡",
                    "饒", "空", "曾", "毋", "沙", "乜", "養", "鞠", "須", "豐", "巢", "關",
                    "蒯", "相", "查", "後", "荊", "紅", "遊", "竺", "權", "逑", "蓋", "益",
                    "桓", "公", "万俟", "司馬", "上官", "歐陽", "夏侯", "諸葛", "聞人", "東方", "赫連",
                    "皇甫", "尉遲", "公羊", "澹臺", "公冶", "宗政", "濮陽", "淳于", "單于", "太叔",
                    "申屠", "公孫", "仲孫", "軒轅", "令狐", "鍾離", "宇文", "長孫", "慕容", "鮮于",
                    "閭丘", "司徒", "司空", "丌官", "司寇", "仉", "督", "子車", "顓孫", "端木", "巫馬",
                    "公西", "漆雕", "樂正", "壤駟", "公良", "拓拔", "夾谷", "宰父", "穀梁", "晉", "楚",
                    "閻", "法", "汝", "鄢", "塗", "欽", "段幹", "百里", "東郭", "南門", "呼延",
                    "歸", "海", "羊舌", "微生", "嶽", "帥", "緱", "亢", "況", "後", "有", "琴",
                    "樑丘", "左丘", "東門", "西門", "商", "牟", "佘", "佴", "伯", "賞", "南宮",
                    "墨", "哈", "譙", "笪", "年", "愛", "陽", "佟"};
            String[] namelist = {"偉", "偉", "芳", "偉", "秀英", "秀英", "娜", "秀英", "偉",
                    "敏", "靜", "麗", "靜", "麗", "強", "靜", "敏", "敏", "磊", "軍", "洋",
                    "勇", "勇", "豔", "傑", "磊", "強", "軍", "傑", "娟", "豔", "濤", "濤",
                    "明", "豔", "超", "勇", "娟", "傑", "秀蘭", "霞", "敏", "軍", "麗", "強",
                    "平", "剛", "傑", "桂英", "芳", " 嘉懿", "煜城", "懿軒", "燁偉", "苑博", "偉澤",
                    "熠彤", "鴻煊", "博濤", "燁霖", "燁華", "煜祺", "智宸", "正豪", "昊然", "明傑",
                    "立誠", "立軒", "立輝", "峻熙", "弘文", "熠彤", "鴻煊", "燁霖", "哲瀚", "鑫鵬",
                    "致遠", "俊馳", "雨澤", "燁磊", "晟睿", "天佑", "文昊", "修潔", "黎昕", "遠航",
                    "旭堯", "鴻濤", "偉祺", "榮軒", "越澤", "浩宇", "瑾瑜", "皓軒", "擎蒼", "擎宇",
                    "志澤", "睿淵", "楷瑞", "子軒", "弘文", "哲瀚", "雨澤", "鑫磊", "修傑", "偉誠",
                    "建輝", "晉鵬", "天磊", "紹輝", "澤洋", "明軒", "健柏", "鵬煊", "昊強", "偉宸",
                    "博超", "君浩", "子騫", "明輝", "鵬濤", "炎彬", "鶴軒", "越彬", "風華", "靖琪",
                    "明誠", "高格", "光華", "國源", "冠宇", "晗昱", "涵潤", "翰飛", "翰海", "昊乾",
                    "浩博", "和安", "弘博", "巨集愷", "鴻朗", "華奧", "華燦", "嘉慕", "堅秉", "建明",
                    "金鑫", "錦程", "瑾瑜", "晉鵬", "經賦", "景同", "靖琪", "君昊", "俊明", "季同",
                    "開濟", "凱安", "康成", "樂語", "力勤", "良哲", "理群", "茂彥", "敏博", "明達",
                    "朋義", "彭澤", "鵬舉", "濮存", "溥心", "璞瑜", "浦澤", "奇邃", "祺祥", "榮軒",
                    "銳達", "睿慈", "紹祺", "聖傑", "晟睿", "思源", "斯年", "泰寧", "天佑", "同巍",
                    "奕偉", "祺溫", "文虹", "向笛", "心遠", "欣德", "新翰", "興言", "星闌", "修為",
                    "旭堯", "炫明", "學真", "雪風", "雅昶", "陽曦", "燁熠", "英韶", "永貞", "詠德",
                    "宇寰", "雨澤", "玉韻", "越彬", "蘊和", "哲彥", "振海", "正志", "子晉", "自怡",
                    "德赫", "君平"};
            int a = (int) Math.abs(firsname.length * Math.random());
            int b = (int) Math.abs(namelist.length * Math.random());
            name = firsname[a] + namelist[b];
        }
        return name;
    }

    /**
     * 返回手機號碼
     */
    public static String[] telFirst = "134,135,136,137,138,139,150,151,152,157,158,159,130,131,132,155,156,133,153".split(",");

    public static int getNum(int start, int end) {
        return (int) (Math.random() * (end - start + 1) + start);
    }

    public static String randomPhone() {
        int index = getNum(0, telFirst.length - 1);
        String first = telFirst[index];
        String second = String.valueOf(getNum(1, 888) + 10000).substring(1);
        String thrid = String.valueOf(getNum(1, 9100) + 10000).substring(1);
        return first + second + thrid;
    }


    /**
     * 地址
     */
    public static String randomAddres() {
        String[] address = {"北京", "上海", "湖南", "深圳"};
        String result = address[ra.nextInt(4)];
        return result;
    }


    /**
     * 型別
     */
    public static String randomType() {

        return ra.nextInt(2) == 1 ? "1" : "0";
    }

}

相關文章