HBase

HBase

安装hbase

下载

wget https://archive.apache.org/dist/hbase/2.0.0-alpha4/hbase-2.0.0-alpha4-bin.tar.gz

安装后解压到/opt/hbase文件夹

配置环境变量

修改~/.bashrc文件,添加以下代码

1
2
export HBASE_HOME=/opt/hbase 
export PATH=$PATH:$HBASE_HOME/bin

立即生效,source ~/.bashrc

修改配置文件

修改以下内容,/opt/hbase/conf/hbase-env.sh

1
2
export HBASE_MANAGES_ZK=true  
export JAVA_HOME=/opt/jdk

使用hbase自带的zookeeper,java路径为/opt/jdk

修改以下内容,/opt/hbase/conf/hbase-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configuration>

<property>
<name>hbase.rootdir</name>
<value>hdfs://Master:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>Master:2181,Slave1:2181,Slave2:2181</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>

</configuration>

设置储存位置为hdfs://Master:9000/hbase

使用完全分布式模式,指定zookeeper集群的地址列表,指定zookeeper本地快照位置

修改以下内容:/opt/hbase/conf/regionservers

1
2
3
Master
Slave1
Slave2

HMaster闪退

1、时间同步

造成HMaster闪退,可能是由于节点的时间未同步,使用ntpdate

1
2
3
4
5
6
yum install -y ntpdate
#设置时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
yes | cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#同步时间
ntpdate us.pool.ntp.org

配置后检查各个节点的date,看时间是否同步

2、zookeeper未连接

使用hbase自带的zookeeper的话,要保证之前安装的zookeeper不会抢占2181端口,如果已有进程抢占2181端口,使用kill命令杀死进程。

保证各个节点防火墙已关闭,使2181端口能够正常访问

1
service iptables stop

启动hbase

先启动Hadoop,start -all.sh ,之后启动hbase,使用shell

HBase Shell

create

alter

删除menber中的member_id列族

list

put

1
2
3
4
5
6
7
8
9
10
11
12
13
put 'member','scutshuxue','info:age','24' 
put 'member','scutshuxue','info:birthday','1987-06-17'
put 'member','scutshuxue','info:company','alibaba'
put 'member','scutshuxue','address:contry','china'
put 'member','scutshuxue','address:province','zhejiang'
put 'member','scutshuxue','address:city','hangzhou'
put 'member','xiaofeng','info:birthday','1987-4-17'
put 'member','xiaofeng','info:favorite','movie'
put 'member','xiaofeng','info:company','alibaba'
put 'member','xiaofeng','address:contry','china'
put 'member','xiaofeng','address:province','guangdong'
put 'member','xiaofeng','address:city','jieyang'
put 'member','xiaofeng','address:town','xianqiao'

get

1
2
get 'member','scutshuxue','info' 
get 'member','scutshuxue','info:age'

count

Java API

windows下安装hadoop

下载hadoop_2.8.2

解压到合适位置后,添加环境变量

由于是在windows上安装,使用编译好的windows版本二进制文件进行替换,下载地址:

https://github.com/steveloughran/winutils

由于没有2.8.2版本,所以使用2.8.3版本替换bin文件夹下全部内容

修改配置文件后,格式化hdfs,到sbin目录下启动hadoop

可以通过http://localhost:8088/http://localhost:50070/ 查看hadoop相关信息

windows下安装hbase

官网下载安装包,版本选择的是 HBase 2.0.0-alpha4,下载地址:http://archive.apache.org/dist/hbase/

修改环境变量等配置文件,在运行时报错

原因是缺少jar包导致,在网上下载 jline-2.12.1.jar,替换掉hadoop目录里的两个低版本的 jline-0.9.94.jar,并复制一份添加到yarn/lib中去

运行

java项目

创建Java项目,导入本机hbase\lib下的所有jar包

创建HBaseUtils类、Run类

  • 建立连接

    1
    2
    3
    4
    5
    6
    7
    8
      HBaseUtils() throws IOException {
    conf = HBaseConfiguration.create();
    conf.set("hbase.rootdir", "hdfs://Master:9000/hbase");
    conf.set("hbase.zookeeper.quorum", "Master,Slave1,Slave2");
    config.set("hbase.zookeeper.property.clientPort", "2181");// zookeeper端口
    connection = ConnectionFactory.createConnection(config);
    admin = conn.getAdmin();
    }
  • 创建表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void createTable(String tableName, String[] family) throws Exception {
    HTableDescriptor desc =new HTableDescriptor(tableName);

    for(int i=0;i<family.length;i++){
    desc.addFamily(new HColumnDescriptor(family[i]));
    }
    if(admin.tableExists(tableName)){
    System.out.println("Already Exits");
    }else{
    admin.createTable(desc);
    System.out.println("Create Success");
    }
    }
  • 插入数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void insertRecord(String tableName, String row, String col, String values) throws IOException {
    createConn();
    Table table = conn.getTable(TableName.valueOf(tableName));
    Put put = new Put(row.getBytes());
    String[] cols = col.split(":");
    put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values.getBytes());
    table.put(put);
    table.close();
    closeConn();
    }
  • 删除数据

    1
    2
    3
    4
    5
    6
    7
    public void deleteRow(String tName, String row) throws IOException {
    createConn();
    Table table = conn.getTable(TableName.valueOf(tName));
    Delete del = new Delete(row.getBytes());
    table.delete(del);
    table.close();
    }
  • 遍历表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public ResultScanner getResultScann(String tableName) throws Exception {

    Scan scan=new Scan();
    ResultScanner rs =null;
    HTable htable=new HTable(conf, tableName);
    try{
    rs=htable.getScanner(scan);
    for(Result r: rs){
    for(KeyValue kv:r.list()){

    System.out.println(Bytes.toString(kv.getRow()));
    System.out.println(Bytes.toString(kv.getFamily()));
    System.out.println(Bytes.toString(kv.getQualifier()));
    System.out.println(Bytes.toString(kv.getValue()));
    System.out.println(kv.getTimestamp());
    }
    }
    }finally{
    rs.close();
    }
    return rs;
    }
  • 结果

  • 在虚拟机中查看结果,可以看到通过java api成功创建了menber表

  • 如果在虚拟机中使用hbase shell时出现错误

    Can't get master address from ZooKeeper; znode data == null

    只需重新启动hbase