第四章 HBase数据库

版权声明:如需转载,请注明出处! https://blog.csdn.net/qq_41172416/article/details/88713327

1、Hbase 基础

 HBase链接:https://pan.baidu.com/s/1rUNxxwVZKbI_CPRi8F3hMQ 
提取码:onnb 


# 解压hbase压缩包
tar xvf hbase-1.0.2-bin.tar.gz  -C  /home/hduser

运行分布式 HBase 需要以下条件:

  1. JDK 环境
  2. SSH 免密码登录
  3. Hadoop 环境

1、完全分布式模式

 注意:检查并同步所有节点机(node1、node2、node3)的时钟,并且各节点与 HBase的 HMaster节点(node1)时钟误差不能大于30秒。

修改三个配置文件:

(1)hbase-site.xml文件

<configuration>
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://node1:9000/hbase</value>
  <description>配置 HRegionServer 的数据库存储目录</description>
</property>
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
  <description>配置 HBase 为完全分布式</description>
</property>
<property>
  <name>hbase.master</name>
  <value>node1:60000</value>
  <description>配置 HMaster 的地址</description>
</property>
<property>
  <name>hbase.zookeeper.quorum</name>
  <value>node1,node2,node3</value>
  <description>配置 ZooKeeper 集群服务器的位置 </description>
</property>
</configuration>

其中主要参数说明如下:

  1. hbase.cluster.distributed:默认为false,即单机或伪分布式运行。这里设置为 true,表示在完全分布式模式运行。
  2. hbase.master:指定 HBase 的HMaster 服务器地址、端口。
  3. Hbase.zookeeper.quorum:指出了 ZooKeeper 集群中各服务器位置。也就是将哪些节点加入ZooKeeper 进行协调管理,推荐为奇数各服务器。

(2)hbase-env.sh文件

export JAVA_HOME=/usr/java/jdk1.8.0_191-amd64
export HADOOP_HOME=/home/hduser/hadoop
export HBASE_HOME=/home/hduser/hbase-1.0.2
export HBASE_MANAGES_ZK=true

(3)regionservers文件

该文件列出了所有 HRegionServer 节点,配置方式与 Hadoop 的slaves 文件类似,每行指定一台机器。当 HBase 启动、关闭时会把此文件中列出的所有机器同时启动、关闭。将node2、node3作为HRegionServer.因此 regionservers 文件中内容为node2和node3。

node2
node3

注意:regionservers 文件不包含node1,因为node1已在hbase-site.xml中被指定为 HMaster 服务器,通常不会将HMaster 和 HRegionServer 服务器运行在一个节点上。

在机器node1 上配置完成上面三个文件后,HBase基本的完全分布式模式配置便已完成。同 Hadoop分布式安装类似,还需要将HBase 所在目录,如:“/home/hduser/hbase-1.0.2” 分别复制到 node2、node3,使得各个节点上都能运行HBase来构建 HBase集群。

在node1 上运行下面的命令:

scp -r /home/hduser/hbase-1.0.2 hduser@node2:/home/hduser/

scp -r /home/hduser/hbase-1.0.2 hduser@node3:/home/hduser/

启动HBase:

命令: bin/start-hbase.sh

[hduser@node1 hbase-1.0.2]$ bin/start-hbase.sh
node2: zookeeper running as process 3395. Stop it first.
node3: zookeeper running as process 3319. Stop it first.
node1: zookeeper running as process 5604. Stop it first.
starting master, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-master-node1.out
node2: starting regionserver, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-regionserver-node2.out
node3: starting regionserver, logging to /home/hduser/hbase-1.0.2/logs/hbase-hduser-regionserver-node3.out
[hduser@node1 hbase-1.0.2]$ jps
4864 SecondaryNameNode
5604 HQuorumPeer
4678 NameNode
13607 Jps
8362 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
5007 ResourceManager
13503 HMaster
[hduser@node1 hbase-1.0.2]$ 

进入shell 命令:

命令: ./bin/hbase shell

[hduser@node1 hbase-1.0.2]$ ./bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hduser/hbase-1.0.2/lib/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hduser/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
2019-03-20 23:41:58,153 WARN  [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.2, r76745a2cbffe08b812be16e0e19e637a23a923c5, Tue Aug 25 15:59:49 PDT 2015

hbase(main):001:0> status
2 servers, 0 dead, 2.0000 average load

hbase(main):002:0> 

查看HBase运行状态: 

如: http://node1:16010

2、Hbase Shell 操作

常用命令列表


 1、创建表:create

语法:create '表名称','列名称1','列名称2',…,'列名称N'

示例:create 'scores','grade','course'


2、查看所有表:list

语法:list

如果要查看该表所有列族的详细描述信息可使用describe命令。

语法:describe  '表名’


 3、添加数据:put

语法:put '表名称','行键','列键','值'

示例:put 'scores','tom','grade:','1' 


 4、扫描表:scan

 1、指定列族

语法:scan '表名称',{COLUMNS=>['列族名1','列族名2',……],参数名=>参数值…}

示例:scan 'scores' 

 2、指定列键

语法:scan '表名称',{COLUMN=>['列键1','列键2',……],参数名=>参数值…}

示例:scan 'scores',{COLUMN=>'course:math',LIMIT=>1}


 5、获取数据:get

语法:

           get '表名称','行键',{COLUMNS=>['列族名1','列族名2'…],参数名=>参数值…}

           get '表名称','行键',{COLUMN=>['列键1','列键2'…],参数名=>参数值…}

示例:

           get 'scores','jason'

           get 'scores','jason',{COLUMNS=>'course'}

           get 'scores','jason',{COLUMN=>'course:math'}


 6、删除数据:delete

语法:

          delete '表名称','行键','列键'

          deleteall '表名称','行键'

示例:

          delete 'scores','jason','course:art'

          deleteall 'scores','jason'


 7、修改表:alter

语法:

          alter '表名称',参数名=>参数值,...

          alter '表名称',{参数名=>参数值,...}, {参数名=>参数值,...}…

示例:

          alter 'scores',NAME=>'course',VERSIONS=>'5'

          alter 'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course', VERSIONS=>'5'}


 8、删除表:drop

注意:删除前使用 disable 将表置为不可用

语法:

        disable '表名'

        drop '表名'

示例:

       disable 'scores'

       drop 'scores'


3、Hbase 编程

1、使用 Eclipse 开发 HBase 应用程序

 1、创建普通Java project

在node1 上打开 Eclipse ,新建 Java Project 工程。

2、添加 jar 文件到构建路径

lib链接:https://pan.baidu.com/s/1aVm2XXLiYF_JPTwq2LJ2WQ 
提取码:x2b9 

3、添加 hbase-site.xml

链接:https://pan.baidu.com/s/1yfFGsTsUx_3ILWLLk_s2ug 
提取码:c0bi 

将 $HBASE_HOME/conf 下的 hbase-site.xml复制到工程源文件目录 “src” 中。

项目结构如下所示:

4、编写测试代码

package cn.hbase;

import java.io.IOException;

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.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.util.Bytes;

public class HBaseTest {
	static Configuration cfg = HBaseConfiguration.create();
	// 列出数据库中所有表
	public static void list() throws IOException {
		// 创建数据库链接
		Connection conn = ConnectionFactory.createConnection(cfg);
		// Admin用于管理HBase数据库的表信息
		Admin admin = conn.getAdmin();
		System.out.println("===list tables:===");
		for (TableName tn : admin.listTableNames())
			System.out.println(tn);
		conn.close();// 关闭连接
	}

	public static void main(String[] args) throws IOException {
		list();
	}
}

运行结果如下:

2、HBase 数据存储管理 API

 HBase Java API 与HBase数据模型对应关系

1.HBaseConfiguration:包括HBase的所有配置信息

示例:

          Configuration cfg=HBaseConfiguration.create();

          配置文件搜索顺序: 1、hbase-site.xml             2、hbase-default.xml

2.Connection表示到HBase的连接

  1.  获取Admin管理数据库
  2.  获取Table管理表

示例:

         Connection conn=ConnectionFactory.createConnection(cfg);//创建连接     //获取管理HBase集群的管理实例

         Admin admin=conn.getAdmin(); //获取管理HBase集群的管理实例

        Table table=conn.getTable(TableName.valueOf(“scores”)); //获取scores表的实例

         conn.close();//关闭连接

3. Admin:管理HBase的接口

下面通过 Admin 接口来重新创建 scores表,代码如下所示:

package cn.hbase;

import java.io.IOException;

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.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.util.Bytes;

public class HBaseTest {

	static Configuration cfg = HBaseConfiguration.create();

	// 列出数据库中所有表
	public static void list() throws IOException {
		// 创建数据库链接
		Connection conn = ConnectionFactory.createConnection(cfg);
		// Admin用于管理HBase数据库的表信息
		Admin admin = conn.getAdmin();
		System.out.println("===list tables:===");
		for (TableName tn : admin.listTableNames())
			System.out.println(tn);
		conn.close();// 关闭连接
	}

	// 创建表
	public static void create(String tableName, String... familyNames)
			throws IOException {
		Connection conn = ConnectionFactory.createConnection(cfg);
		Admin admin = conn.getAdmin();
		// TableName:以POJO对象来封装表的名字
		TableName tn = TableName.valueOf(tableName);
		if (admin.tableExists(tn)) { // 如果存在先删除
			admin.disableTable(tn);// 先使表无效
			admin.deleteTable(tn);
		}
		// HTableDescriptor包含了表的名字及其对应的列族
		HTableDescriptor htd = new HTableDescriptor(tn);
		for (String family : familyNames)
			htd.addFamily(new HColumnDescriptor(family));
		admin.createTable(htd);
		conn.close();
		System.out.println("create success!");
	}

	// 修改表-增加列族
	public static void addColumnFamily(String tableName, String... familyNames)
			throws IOException {
		Connection conn = ConnectionFactory.createConnection(cfg);
		Admin admin = conn.getAdmin();
		TableName tn = TableName.valueOf(tableName);
		HTableDescriptor htd = admin.getTableDescriptor(tn);
		for (String family : familyNames)
			htd.addFamily(new HColumnDescriptor(family));
		admin.modifyTable(tn, htd);
		conn.close();
		System.out.println("modify success!");
	}

	// 修改表-删减列族
	public static void removeColumnFamily(String tableName,
			String... familyNames) throws IOException {
		Connection conn = ConnectionFactory.createConnection(cfg);
		Admin admin = conn.getAdmin();
		TableName tn = TableName.valueOf(tableName);
		HTableDescriptor htd = admin.getTableDescriptor(tn);
		for (String family : familyNames)
			htd.removeFamily(Bytes.toBytes(family));// 删减指定列族
		admin.modifyTable(tn, htd);
		conn.close();
		System.out.println("remove success!");
	}

	// 查看表结构
	public static void describe(String tableName) throws IOException {
		Connection conn = ConnectionFactory.createConnection(cfg);
		Admin admin = conn.getAdmin();
		TableName tn = TableName.valueOf(tableName);
		HTableDescriptor htd = admin.getTableDescriptor(tn);
		System.out.println("===decribe " + tableName + ":===");
		for (HColumnDescriptor hcd : htd.getColumnFamilies()) {
			System.out.println(hcd.getNameAsString());
		}
		System.out.println("===============");
		conn.close();
	}

	public static void main(String[] args) throws IOException {
		
		create("scores", "grade", "course");// 创建表并指定2个列族
		describe("scores");
		addColumnFamily("scores", "f1", "f2");// 新增2个列族
		describe("scores");
		removeColumnFamily("scores", "f1");// 删除1个列族
		describe("scores");
		list();
		
		
	}
}

4. HTableDescriptor、TableName、Table

5. HTableDescriptor、TableName、Table

猜你喜欢

转载自blog.csdn.net/qq_41172416/article/details/88713327