设为首页 加入收藏

TOP

Hbase踩过的坑(使用idea调用JavaAPI)
2019-02-15 13:44:13 】 浏览:162
Tags:Hbase 使用 idea 调用 JavaAPI
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37499059/article/details/79659945

一把辛酸泪啊,各种问题,网上都没有搜到一个非常完美的解决办法,几个小时候终于解决了,其实想想也挺简单的,只是没有对症下药,关键点没有找到,那下面我分享一下我的配置步骤。

我的错误:




前言:

我们在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,到这里第一个问题,完美解决了,哈哈哈。


第二个问题:


cxx@master:~/bigdata$ sudo ufw disable
Firewall stopped and disabled on system startup
cxx@master:~/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>1vers: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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java 代码操作hbase 问题,以及怎.. 下一篇《ElasticSearch 5.5.0 +HBASE 集..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目