大資料學習系列之三 ----- HBase Java Api 圖文詳解

來源:互聯網
上載者:User

標籤:介面   list   scan   時間   oid   static   mil   win   刪除   

引言

在上一篇中大資料學習系列之二 ----- HBase環境搭建(單機) 中,成功搭建了Hadoop+HBase的環境,本文則主要講述使用Java 對HBase的一些操作。

一、事前準備1.確認hadoop和hbase成功啟動

2.確認防火牆是否關閉3.maven所需要的依賴架包
<!--hadoop 相關架包 -->        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-common</artifactId>            <version>2.8.2</version>        </dependency>        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-client</artifactId>            <version>2.8.2</version>        </dependency>        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-hdfs</artifactId>            <version>2.8.2</version>        </dependency>        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-mapreduce-client-core</artifactId>            <version>2.8.2</version>        </dependency>        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-yarn-common</artifactId>            <version>2.8.2</version>        </dependency><!--HBase相關jar -->        <dependency>            <groupId>org.apache.hbase</groupId>            <artifactId>hbase-hadoop-compat</artifactId>            <version>1.3.1</version>        </dependency>        <dependency>            <groupId>org.apache.hbase</groupId>            <artifactId>hbase-server</artifactId>            <version>1.1.2</version>        </dependency><dependency>            <groupId>org.apache.hbase</groupId>            <artifactId>hbase-client</artifactId>            <version>1.1.2</version>        </dependency><dependency>            <groupId>org.apache.hbase</groupId>            <artifactId>hbase-common</artifactId>            <version>1.1.2</version>        </dependency>
4.修改hosts檔案(可選)

修改Windows C:\Windows\System32\drivers\etc 目錄下的hosts檔案,添加hbase的主機ip和主機名稱做關係映射。

192.168.238.128 master

注:如果不使用映射,那麼將代碼中的主機名稱改成IP即可。

5.HBase的原理

這篇文章介紹得很詳細:
http://blog.csdn.net/woshiwanxin102213/article/details/17584043

二、測試樣本1.建立表

建立兩張表 t_student、t_student_info 這兩張表,並添加兩個列族
建立成功之後可以在 hbase shell和16010介面中看到。

2.添加資料

成功建立表之後,在這兩張表中插入資料。
因為HBase是動態資料庫,所以列是可以新增的。
HBase的新增和修改是一個方法,資料相同的,後來的資料會將前面的覆蓋掉!

3.查詢資料

分別根據表名、行健、列族、列來查詢

4.刪除資料

刪除其中的一條資料

三、程式碼範例工具類
import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Delete;import org.apache.hadoop.hbase.client.Get;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.client.Table;import org.apache.hadoop.hbase.util.Bytes;import com.alibaba.fastjson.JSONObject;/** *  * Title: HBaseUtil * Description: HBase工具類  * Version:1.0.0 * @author pancm * @date 2017年12月6日 */public class HBaseUtil {    /** hadoop 串連 */    private static Configuration conf = null;    /** hbase 串連 */    private static Connection con = null;    /** 會話 */    private static Admin admin = null;    private static String ip ="master";    private static String port ="2181";    private static String port1 ="9001";   // 初始化串連   static {       // 獲得配製檔案對象       conf = HBaseConfiguration.create();        // 設定配置參數        conf.set("hbase.zookeeper.quorum", ip);        conf.set("hbase.zookeeper.property.clientPort", port);          //如果hbase是叢集,這個必須加上         //這個ip和連接埠是在hadoop/mapred-site.xml設定檔配置的        conf.set("hbase.master", ip+":"+port1);    }    /**     * 擷取串連     *      * @return     */    public synchronized static Connection getConnection() {        try {            if (null == con || con.isClosed()) {                // 獲得連線物件                con = ConnectionFactory.createConnection(conf);            }        } catch (IOException e) {            System.out.println("擷取串連失敗!");            e.printStackTrace();        }        return con;    }    /**     * 串連關閉     */    public static void close() {        try {            if (admin != null) {                admin.close();            }            if (con != null) {                con.close();            }        } catch (IOException e) {            System.out.println("串連關閉失敗!");            e.printStackTrace();        }    }    /**     * 建立表     *      * @param tableName     *            表名     * @param columnFamily     *            列族     */    public static void creatTable(String tableName, String[] columnFamily) {        if(null==tableName||tableName.length()==0){            return;        }        if(null==columnFamily||columnFamily.length==0){            return;        }        // 建立表名對象        TableName tn = TableName.valueOf(tableName);        // a.判斷資料庫是否存在        try {            // 擷取會話            admin = getConnection().getAdmin();            if (admin.tableExists(tn)) {                System.out.println(tableName + " 表存在,刪除表....");                // 先使表設定為不可編輯                admin.disableTable(tn);                // 刪除表                admin.deleteTable(tn);                System.out.println("表刪除成功.....");            }            // 建立表結構對象            HTableDescriptor htd = new HTableDescriptor(tn);            for (String str : columnFamily) {                // 建立列族結構對象                HColumnDescriptor hcd = new HColumnDescriptor(str);                htd.addFamily(hcd);            }            // 建立表            admin.createTable(htd);            System.out.println(tableName + " 表建立成功!");        } catch (IOException e) {            e.printStackTrace();        } finally {            close();        }    }    /**     * 資料單條插入或更新     *      * @param tableName     *            表名     * @param rowKey     *            行健 (主鍵)     * @param family     *            列族     * @param qualifier     *            列     * @param value     *            存入的值     * @return     */    public static void insert(String tableName, String rowKey, String family,            String qualifier, String value) {        Table t = null;        try {            t = getConnection().getTable(TableName.valueOf(tableName));            Put put = new Put(Bytes.toBytes(rowKey));            put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier),                    Bytes.toBytes(value));            t.put(put);            System.out.println(tableName + " 更新成功!");        } catch (IOException e) {            System.out.println(tableName + " 更新失敗!");            e.printStackTrace();        } finally {            close();        }    }    /**     * 資料批量插入或更新     *      * @param tableName     *            表名     * @param list     *            hbase的資料      * @return     */    public static void insertBatch(String tableName, List<?> list) {        if (null == tableName ||tableName.length()==0) {            return;        }        if( null == list || list.size() == 0){            return;        }        Table t = null;        Put put = null;        JSONObject json = null;        List<Put> puts = new ArrayList<Put>();        try {            t = getConnection().getTable(TableName.valueOf(tableName));            for (int i = 0, j = list.size(); i < j; i++) {                json = (JSONObject) list.get(i);                put = new Put(Bytes.toBytes(json.getString("rowKey")));                put.addColumn(Bytes.toBytes(json.getString("family")),                        Bytes.toBytes(json.getString("qualifier")),                        Bytes.toBytes(json.getString("value")));                puts.add(put);            }            t.put(puts);            System.out.println(tableName + " 更新成功!");        } catch (IOException e) {            System.out.println(tableName + " 更新失敗!");            e.printStackTrace();        } finally {            close();        }    }    /**     * 資料刪除      * @param tableName 表名     * @param rowKey    行健     * @return     */    public static void delete(String tableName, String rowKey) {        delete(tableName,rowKey,"","");    }    /**     * 資料刪除      * @param tableName 表名     * @param rowKey    行健     * @param family    列族     * @return     */    public static void delete(String tableName, String rowKey, String family) {        delete(tableName,rowKey,family,"");    }    /**     * 資料刪除      * @param tableName 表名     * @param rowKey    行健     * @param family    列族     * @param qualifier 列     * @return     */    public static void delete(String tableName, String rowKey, String family,            String qualifier) {        if (null == tableName ||tableName.length()==0) {            return;        }        if( null == rowKey || rowKey.length() == 0){            return;        }        Table t = null;        try {            t = getConnection().getTable(TableName.valueOf(tableName));            Delete del = new Delete(Bytes.toBytes(rowKey));            // 如果列族不為空白            if (null != family && family.length() > 0) {                // 如果列不為空白                if (null != qualifier && qualifier.length() > 0) {                    del.addColumn(Bytes.toBytes(family),                            Bytes.toBytes(qualifier));                } else {                    del.addFamily(Bytes.toBytes(family));                }            }                  t.delete(del);            } catch (IOException e) {            System.out.println("刪除失敗!");            e.printStackTrace();        } finally {          close();        }    }    /**     * 查詢該表中的所有資料     *      * @param tableName     *            表名     */    public static void select(String tableName) {        if(null==tableName||tableName.length()==0){            return;        }        Table t = null;        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();        try {            t = getConnection().getTable(TableName.valueOf(tableName));            // 讀取操作            Scan scan = new Scan();            // 得到掃描的結果集            ResultScanner rs = t.getScanner(scan);            if (null == rs ) {                return;            }            for (Result result : rs) {                // 得到儲存格集合                List<Cell> cs = result.listCells();                if (null == cs || cs.size() == 0) {                    continue;                }                for (Cell cell : cs) {                    Map<String,Object> map=new HashMap<String, Object>();                    map.put("rowKey", Bytes.toString(CellUtil.cloneRow(cell)));// 取行健                    map.put("timestamp", cell.getTimestamp());// 取到時間戳記                    map.put("family", Bytes.toString(CellUtil.cloneFamily(cell)));// 取到列族                    map.put("qualifier", Bytes.toString(CellUtil.cloneQualifier(cell)));// 取到列                    map.put("value", Bytes.toString(CellUtil.cloneValue(cell)));// 取到值                    list.add(map);                }            }            System.out.println("查詢的資料:"+list);        } catch (IOException e) {            System.out.println("查詢失敗!");            e.printStackTrace();        } finally {            close();        }    }    /**     * 根據表名和行健查詢     * @param tableName     * @param rowKey     */    public static void select(String tableName, String rowKey) {        select(tableName,rowKey,"","");    }    /**     * 根據表名、行健和列族查詢     * @param tableName     * @param rowKey     * @param family     */    public static void select(String tableName, String rowKey, String family) {        select(tableName,rowKey,family,"");    }    /**     * 根據條件明細查詢     *      * @param tableName     *            表名     * @param rowKey     *            行健 (主鍵)     * @param family     *            列族     * @param qualifier     *            列     */    public static void select(String tableName, String rowKey, String family,            String qualifier) {        Table t = null;        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();        try {            t = getConnection().getTable(TableName.valueOf(tableName));            // 通過HBase中的 get來進行查詢            Get get = new Get(Bytes.toBytes(rowKey));            // 如果列族不為空白            if (null != family && family.length() > 0) {                // 如果列不為空白                if (null != qualifier && qualifier.length() > 0) {                    get.addColumn(Bytes.toBytes(family),                            Bytes.toBytes(qualifier));                } else {                    get.addFamily(Bytes.toBytes(family));                }            }            Result r = t.get(get);            List<Cell> cs = r.listCells();            if (null == cs || cs.size() == 0) {                return;            }            for (Cell cell : cs) {                Map<String,Object> map=new HashMap<String, Object>();                map.put("rowKey", Bytes.toString(CellUtil.cloneRow(cell)));// 取行健                map.put("timestamp", cell.getTimestamp());// 取到時間戳記                map.put("family", Bytes.toString(CellUtil.cloneFamily(cell)));// 取到列族                map.put("qualifier", Bytes.toString(CellUtil.cloneQualifier(cell)));// 取到列                map.put("value", Bytes.toString(CellUtil.cloneValue(cell)));// 取到值                list.add(map);            }            System.out.println("查詢的資料:"+list);        } catch (IOException e) {            System.out.println("查詢失敗!");            e.printStackTrace();        } finally {            close();        }    }}
測試代碼
import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSONObject;/** * * Title: hbaseTest* Description: HBase 相關測試* Version:1.0.0  * @author pancm* @date 2017年11月23日 */public class hbaseTest {    public static void main(String[] args) {        test();    }    /**     * 一些測試     */    private static void test() {        String tableName1="t_student",tableName2="t_student_info";        String []columnFamily1={"st1","st2"};        String []columnFamily2={"stf1","stf2"};        HBaseUtil.creatTable(tableName1, columnFamily1);        HBaseUtil.creatTable(tableName2, columnFamily2);        HBaseUtil.insert(tableName1, "1001", columnFamily1[0], "name", "zhangsan");        HBaseUtil.insert(tableName1, "1002", columnFamily1[0], "name", "lisi");        HBaseUtil.insert(tableName1, "1001", columnFamily1[1], "age", "18");        HBaseUtil.insert(tableName1, "1002", columnFamily1[1], "age", "20");        HBaseUtil.insert(tableName2, "1001", columnFamily2[0], "phone", "123456");        HBaseUtil.insert(tableName2, "1002", columnFamily2[0], "phone", "234567");        HBaseUtil.insert(tableName2, "1001", columnFamily2[1], "mail", "[email protected]");        HBaseUtil.insert(tableName2, "1002", columnFamily2[1], "mail", "[email protected]");        HBaseUtil.select(tableName1); //查詢該表所有資料        HBaseUtil.select(tableName1, "1001"); //根據表名和行健查詢        HBaseUtil.select(tableName2, "1002",columnFamily2[0]); //根據表名、行健和列族查詢        HBaseUtil.select(tableName2, "1002",columnFamily2[1],"mail"); //根據表名、行健、列族、和列查詢        HBaseUtil.select(tableName1, "1002"); //根據表名和行健查詢        HBaseUtil.delete(tableName1, "1002", columnFamily1[0]);//刪除資料        HBaseUtil.select(tableName1, "1002"); //根據表名和行健查詢    }}
其他

著作權聲明:
虛無境
部落格園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm    
個人部落格出處:http://www.panchengming.com
原創不易,轉載請標明出處,謝謝!

大資料學習系列之三 ----- HBase Java Api 圖文詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.