1. 程式人生 > >Hbase踩過的坑(使用idea呼叫JavaAPI)

Hbase踩過的坑(使用idea呼叫JavaAPI)

一把辛酸淚啊,各種問題,網上都沒有搜到一個非常完美的解決辦法,幾個小時候終於解決了,其實想想也挺簡單的,只是沒有對症下藥,關鍵點沒有找到,那下面我分享一下我的配置步驟。

我的錯誤:



前言:

我們在windows上用Idea除錯我們的hadoop或者hbase程式時,我們windows下面也要配置好hadoop環境,並且要注意版本一致(Maven/我們安裝的版本)

1.window安裝hadoop環境


注意:版本和伺服器上的版本一致


winutils.exe很多地方都有下,github等,如果找不到可以留下QQ郵箱

百度雲:連結:https://pan.baidu.com/s/1QDSsRrMAxd9n_MS3HxMIzw 密碼:312a

/**
 * 在Windows下直接執行該程式是需要Hadoop客戶端環境的。
 * 下載Hadoop安裝到Win下,配置環境變數
 * HADOOP_HOME=Hadoop的安裝目錄
 * PATH=在原有的path的最後新增
 * “;%HADOOP_HOME%\bin;%HADOOP_HOME%\sbin”
 * HADOOP_USER_NAME=cxx
 * 將winutils.exe檔案放到Hadoop安裝目錄的bin目錄下。
 */

ok,到這裡第一個問題,完美解決了,哈哈哈。

第二個問題:


[email protected]:~/bigdata$ sudo ufw disable
Firewall stopped and disabled on system startup
[email protected]
:~/bigdata$
centos
關閉防火牆:sudo systemctl stop firewalld.service
關閉開機啟動:sudo systemctl disable firewalld.service

我把windows,和伺服器上的防火牆關了之後,果然好了。

注意問題:

1.版本問題,Maven中版本要和自己伺服器上一致

2.防火牆問題

3.resource下有配置檔案

4.配置好?Winutils不會立刻生效,可以重啟,也有簡單的辦法

  System.setProperty("hadoop.home.dir", "E:\\hadoop-2.8.3");

附上我的Hbase在Idea上測試程式碼:


需要的jar包,pom.xml

  <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-common</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-protocol</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>  
    <name>fs.defaultFS</name>  
     <value>hdfs://master:9000</value>
 </property>  
</configuration>

hbase-site.xml

<?xml version="1.0"?>
<configuration>
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://master:9000/hbase</value>
	</property>
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>master</value>
	</property>
</configuration>

log4j.properties 方便檢視日誌

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
package com.hbase;

import java.io.IOException;
import java.util.Iterator;
import java.util.NavigableMap;
import java.util.Set;
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.NamespaceDescriptor;
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.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.exceptions.DeserializationException;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.util.Bytes;


public class HBaseDemo{
    private Connection conn;
    private Table table;
    private Admin admin;

    public HBaseDemo() throws IOException{
        System.setProperty("hadoop.home.dir", "E:\\hadoop-2.8.3");
        String home = System.getProperty("hadoop.home.dir");
        // 0.先獲取HadoopAPI中的Configuration物件
        Configuration hconf=new Configuration();
        // 1.獲取HBaseConfiguration物件
        Configuration conf=
            HBaseConfiguration.create(hconf);
        // 2.獲取Connection物件
        conn=ConnectionFactory.createConnection(conf);
        // 3.獲取Admin物件
        admin=conn.getAdmin();
    }

    public HBaseDemo(String tbl) throws IOException{
        this();
        // 4.獲取Table物件
        table=conn.getTable(TableName.valueOf(tbl));
    }

    // 1.建立名稱空間
    public void createNS(String ns) throws IOException{
        // 建立名稱空間描述器物件
        NamespaceDescriptor nsDesc=
            NamespaceDescriptor.
                create(ns).build();
        admin.createNamespace(nsDesc);
    }

    /**
     * 2.建立表
     * @param ns    名稱空間
     * @param tbl   表名
     * @param cf    列族名
     * @param vers  某一列的版本數
     * @param nums  對該表進行分割槽的個數
     * @param sk    Region的行鍵的起始值
     * @param ek    Region的行鍵的結束值
     */
    public void createTbl(
        String ns,
        String tbl,
        String cf,
        int vers,
        String sk,
        String ek,
        int nums) throws IOException{
        // 構建表描述器
        HTableDescriptor tblDesc=
            new HTableDescriptor(
                TableName.valueOf(
                    ns==null||"".equals(ns)?
                        tbl:ns+":"+tbl));
        // 在建立表的時候需要傳遞列族,建立HColumnDescriptor
        HColumnDescriptor hcolDesc=
            new HColumnDescriptor(cf);
        // 使用HTableDescriptor物件的addFamily方法,
        // 將列族新增到表上
        tblDesc.addFamily(hcolDesc);
        // 給某一列設定版本數
        hcolDesc.setMaxVersions(vers>1?vers:1);
        // 建立表
        admin.createTable(
            tblDesc,
            Bytes.toBytes(sk),
            Bytes.toBytes(ek),
            nums);
    }

    /**
     *
     * @param ns    名稱空間
     * @param tbl   表名
     * @param rk    行鍵
     * @param cf    列族名
     * @param col   列名
     * @param val   要插入的值
     */
    public void put(
        String ns,String tbl,String rk,
        String cf,String col,String val) throws IOException{
        // 獲取表物件
        Table table=getTbl(ns,tbl);
        // 構建Put物件,引數是行鍵 RowKey
        Put put=new Put(Bytes.toBytes(rk));
        put.addColumn(
            Bytes.toBytes(cf),      // 列族
            Bytes.toBytes(col),     // 列名
            Bytes.toBytes(val));    // 值
        // 插入資料
        table.put(put);
    }

    public void put(
        String ns,String tbl,String rk,
        String cf,String col,String val,int max) throws IOException{
        // 獲取表物件
        Table table=getTbl(ns,tbl);
        for(int x=0;x<max;x++){
            // 構建Put物件,引數是行鍵 RowKey
            Put put=new Put(Bytes.toBytes(rk+x));
            put.addColumn(
                Bytes.toBytes(cf),      // 列族
                Bytes.toBytes(col),     // 列名
                Bytes.toBytes(val+x));    // 值
            // 插入資料
            table.put(put);
        }
    }

    // 3.獲取值
    public void get(String ns,String tbl,String rk) throws IOException{
        // 獲取表物件
        Table table=getTbl(ns,tbl);
        // 獲取值
        Get get=new Get(Bytes.toBytes(rk));
        Result result=
            table.get(get);
        showResult(result);
    }

    // 4.掃描表
    public void scan(String ns,String tbl) throws IOException{
        // 獲取表物件
        Table table=getTbl(ns,tbl);
        // 獲取Scanner物件
        Scan scan=new Scan();
        // 通過Scan物件獲取Scanner物件
        ResultScanner scanner=table.getScanner(scan);
        // 獲取迭代器物件
        Iterator<Result> iterator=
            scanner.iterator();
        // 進行迭代,拿到Result物件
        while(iterator.hasNext()){
            Result result=iterator.next();
            showResult(result);
        }
    }

    public void scan(String ns,String tbl,Filter filter) throws IOException{
        Table table=getTbl(ns,tbl);
        // 獲取Scan物件,並且加入過濾器,
        Scan scan=new Scan();
        scan.setFilter(filter);
        Iterator<Result> iterator=
            table.getScanner(scan).iterator();
        while(iterator.hasNext()){
            showResult(iterator.next());
        }
    }

    public void showResult(Result result){
        // 通過Result物件獲取行鍵
        byte[] row=result.getRow();
        // 獲取Map物件
        NavigableMap<byte[],
            NavigableMap<byte[],
                NavigableMap<Long,byte[]>>>
            map=result.getMap();
        // map中的鍵是什麼?   -->     列族
        // map中的值是什麼?   -->     某個列族對應的值
        // 遍歷map
        Set<byte[]> cfs=map.keySet();
        for(byte[] cf : cfs){
            NavigableMap<byte[],
                NavigableMap<Long,byte[]>>
                map1=map.get(cf);
            // map1中的鍵是什麼?  -->   列名
            // map1中的值是什麼?  -->   某個列對應的值
            // 遍歷map1
            Set<byte[]> cols=map1.keySet();
            for(byte[] col : cols){
                NavigableMap<Long,byte[]>
                    map2=map1.get(col);
                // map2中的鍵是什麼?  -->   Timestamp
                // map2中的值是什麼?  -->   值
                // 遍歷map2
                Set<Long> tss=map2.keySet();
                for(Long ts : tss){
                    byte[] val=map2.get(ts);
                    System.out.println(
                        "行鍵:"+new String(row)+
                        "\t列族:"+new String(cf)+
                        "\t列名:"+new String(col)+
                        "\t時間戳:"+ts+
                        "\t值:"+new String(val));
                }
            }
        }
    }

    // 封裝方法,用來獲取表物件
    public Table getTbl(String ns,String tbl) throws IOException{
        return conn.getTable(
            TableName.valueOf(
                ns==null||"".equals(ns)?
                    tbl:ns+":"+tbl));
    }

    public static void main(String[] args) throws IOException, DeserializationException{
        HBaseDemo demo=new HBaseDemo();
        //demo.createNS("test2");
        //demo.createTbl("test2","teacher","baseinfo",5,"100000","909090",5);
        //demo.put("test2","teacher","222222","baseinfo","name","Kevin",1000);
        //demo.get("test2","teacher","222222999","baseinfo","name");
        //demo.scan("test2","teacher");
        //demo.scan("test2","teacher",new KeyOnlyFilter(true));
        //demo.scan("test2","teacher",new RowFilter(CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("222222100"))));
        // 測試協處理器
        demo.get("test2","teacher","222222950");
    }

    public Connection getConn(){
        return conn;
    }

    public void setConn(Connection conn){
        this.conn=conn;
    }

    public Table getTable(){
        return table;
    }

    public void setTable(Table table){
        this.table=table;
    }

    public Admin getAdmin(){
        return admin;
    }

    public void setAdmin(Admin admin){
        this.admin=admin;
    }
}

原始碼:連結:https://pan.baidu.com/s/16EPBuE6_IDILr8ylwIjLCg 密碼:t9f9

相關推薦

Hbase使用idea呼叫JavaAPI

一把辛酸淚啊,各種問題,網上都沒有搜到一個非常完美的解決辦法,幾個小時候終於解決了,其實想想也挺簡單的,只是沒有對症下藥,關鍵點沒有找到,那下面我分享一下我的配置步驟。我的錯誤:前言:我們在windows上用Idea除錯我們的hadoop或者hbase程式時,我們window

使用JQ、BootStrap時,不定期更新

(此文用於記錄程式設計過程過程中,遇到的那些令人頭皮發麻的坑,以及它們的解決方法) 一、使用bootstrap-select、JQ   日前,要做一個需求,有一個輸入框,可以multiple輸入,輸入的東西還要到資料庫判斷,其是否存在?後臺還要根據這些資訊一條一條查詢別的表資料,我想這個邏輯

Kali Linux / centOS 7 SSH不定期更新

0x00: 最近學習kali linux,聞之初是三年前了。隨已不是從前計劃中的自己,但也盡力去突破新的自己。       環境:kali-linux 2018-2amd64映象 0x01:關於ssh輸入密碼無法登陸的坑 cause :一開始好好的,開機後就連線不上了。

Nginx Sticky的使用及nginx-sticky-module

#什麼是Sticky?# 為了理解Sticky的工作原理,我們可以先考慮一個問題:負載均衡怎麼做? DNS解析,在域名解析時分配給不同的伺服器IP; IP Hash,根據客戶端的IP,將請求分配到不同的伺服器上; cookie,伺服器給客戶端下發一個cookie,具

27.Spring-Boot中攔截器中靜態資源的處理以及Spring mvc configuring拓展介紹

一.springboot中對靜態資源的處理  預設情況下,springboot提供存放放置靜態資源的資料夾:  /static  /public   /resources  /META-INF/resources 對於maven專案即就是存在src/main/re

EclipseSpring外掛不顯示問題,我,分享下

網上最多的說法是版本不相容(spring外掛和eclipse),但是其實大家都不是傻子,都會看對應版本。 所以最多情況還是版本都對的情況下出現外掛不顯示等問題,下面貼出穩穩的安裝外掛和顯示方法; 1、先確定環境,比如eclipse+jdk+spring外掛, 這裡4.5版本的eclipse最好搭

jenkins構建docker構建的映象容器

1.構建時提示依賴包沒有找到的,可以在goal時加上-e,-X引數,如下圖可以看到更加詳細的日誌資訊,從而知道倉庫是否搞錯了,把缺失的依賴包手動匯入倉庫。2.啟動指令碼報錯:解決辦法如下:在執行docker run命令的時候增加一個-u引數,如下改進後的命令,docker r

idea搭建SSM框架遇到的包含完整過程

首先說明這是我一個不熟悉idea和SSM框架的新手小白遇到的坑,適合用idea搭建SSM框架的小夥伴看一看,老鳥就不用看了。以下為詳細步驟(傻瓜教程,超級細節)搭建SSM框架的前提當然是我們已經準備好一下環境安裝好的intellige idea, java環境,tomcat伺

程式設計師,Mybatis你嗎?

摘自:https://yq.aliyun.com/roundtable/49835?&utm_campaign=sys&utm_medium=market&utm_source=edm_email&msctype=email&msca

微信小程序不定時更新

變化 .net 需要 我們 應該 重聲明 比較 abcd 不一定 emmmm,覺得自己小程序太薄弱了,所以還是找個東西練手,不過還是要感謝某大神提供的“扒小程序”的方法,雖然不是說拿下來就能用,但是作為仿小程序來說,我要的圖片素材,頁面名稱都有了.

記一個在js中使用setTimeout方法箭頭函式與function定義的區別

今天寫程式碼時遇到了一個問題,程式碼如下 this.timer = setTimeout(function() { const result = [] for (let i in this.cities) { this.cities[

【洛谷】P1052 狀壓dp

ron mic ont 由於 不同 amp 整數 輸入輸出格式 pac 題目描述 在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數

MongoDB中的一些最好不要用

ODB 關系 有一種 徹底 是把 shard 內存數據庫 完整 發的 MongoDB 是目前炙手可熱的 NoSQL 文檔型數據庫,它提供的一些特性很棒:如自動 failover 機制,自動 sharding,無模式 schemaless,大部分情況下性能也很棒。但是薄荷在深

vue-router傳參的query和params

name router png 不能 頁面 efi def .com 對象 1.query方式傳參和接收參數 傳參: this.$router.push({ path:‘/xxx‘ query:{ id:id

實現SpringBoot的熱部署方法IDEA上操作

熱部署原理: 配置檔案中用了spring-boot-devtools主要是因為這是一個為開發者服務的一個模組,其中最重要的功能就是自動應用程式碼更改到最新的App上面去。原理是在發現程式碼有更改之後,重新啟動應用,但是速度比手動停止後再啟動更快。其深層原理是使用了兩個ClassLoader,

P1052 離散化+dp

P1052 過河 dp不難,重點是要想到離散化。 石子個數$<=100$意味著有大量空間空置,我們可以縮掉這些空間。 實現的話自己yy下就差不多了。 #include<iostream> #include<cstdio> #include<cstring&

SVM用python手動實現呼叫

廢話不多說,總而言之就是下面幾步: 1 計算所有的 Ei 2 尋找第一個違反KKT的變數 3尋找第二個Ei差值的變數 4更新alpha和b,並重新計算所有的Ei 下面舉個詳細的例子,首先這是樣本的分佈圖,非線性 其次這是識別後的圖以及正確率(正確率這個需要調參,太麻煩了,所以我就這樣了)

列印功能JS 呼叫瀏覽器

1.呼叫瀏覽器,完成列印功能(IE,Google都支援【當前時間截點】) 列印當前頁面,可以運用css做排版處理,隱藏一些不需要出現的東西   /*列印   */ function printDiv(value) {       &n

Spark開發環境搭建IDEA、Maven

在搭建開發環境之前,請先安裝好scala開發環境和spark: scala:https://blog.csdn.net/qq_39429714/article/details/84332869 spark:https://blog.csdn.net/qq_39429714/article/d

Maven打包時跳測試maven-surefire-plugin

1、在pom檔案新增 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <