HBase(十)整合Hive

Hive的安装部署

先决条件

  • 搭建好三节点Hadoop集群;
  • hadoop100上先安装好MySQL服务;

准备安装包

  • 下载hive安装包 apache-hive-3.1.2-bin.tar.gz
  • 规划安装目录 /opt/pkg/hive
  • 上传安装包到hadoop100服务器中

解压

解压安装包到指定的规划目录/opt/pkg/

[hadoop@hadoop100 ~]$ cd /export/softwares/
[hadoop@hadoop100 soft]$ tar -xzvf apache-hive-3.1.2-bin.tar.gz -C /opt/pkg/

修改配置文件

  1. 进入hive安装目录
[hadoop@hadoop100 servers]$ cd /opt/pkg
  1. 重新命名hive目录
[hadoop@hadoop100 install]$ mv  apache-hive-3.1.2-bin/    hive
  1. 修改/opt/pkg//conf目录下的hive-site.xml, 默认没有该文件, 需要手动创建
[hadoop@hadoop100 install]$ cd /opt/pkg/hive/conf/
[hadoop@hadoop100 conf]$ vim hive-site.xml
  1. 进入编辑模式, 文件内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
      <property>
              <name>javax.jdo.option.ConnectionURL</name>
              <value>jdbc:mysql://hadoop100:3306/metastore?useSSL=false</value>
      </property>

      <property>
              <name>javax.jdo.option.ConnectionDriverName</name>
              <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
              <name>javax.jdo.option.ConnectionUserName</name>
              <value>root</value>
      </property>
          <property>
              <name>hive.metastore.warehouse.dir</name>
              <value>/user/hive/warehouse</value>
      </property>
      <property>
              <name>javax.jdo.option.ConnectionPassword</name>
              <value>niit1234</value>
      </property>
      <property>
              <name>hive.metastore.schema.verification</name>
              <value>false</value>
      </property>
      <property>
              <name>hive.metastore.event.db.notification.api.auth</name>
              <value>false</value>
      </property>
       <property>
              <name>hive.cli.print.current.db</name>
              <value>true</value>
      </property>
       <property>
              <name>hive.cli.print.header</name>
              <value>true</value>
      </property>
      <property>
              <name>hive.server2.thrift.bind.host</name>
              <value>hadoop100</value>
      </property>
      <property>
              <name>hive.server2.thrift.port</name>
              <value>10000</value>
      </property>
</configuration>
  1. 修改日志配置文件hive-log4j.properties

创建hive日志存储目录

[hadoop@hadoop100 conf]$ mkdir /opt/pkg/hive/logs/

重命名生成文件hive-log4j.properties

[hadoop@hadoop100 conf]$ pwd
/opt/pkg/hive/conf
[hadoop@hadoop100 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties
[hadoop@hadoop100 conf]$ vim hive-log4j2.properties # 修改文件

修改此文件的hive.log.dir属性的值

  #更改以下内容,设置我们的hive的日志文件存放的路径,便于排查问题
  hive.log.dir=/opt/pkg/hive/logs/

拷贝mysql驱动包

上传mysql驱动包,如mysql-connector-java-5.1.38.jar/opt/download/目录中

由于运行hive时,需要向mysql数据库中读写元数据,所以需要将mysql的驱动包上传到hive的lib目录下

[hadoop@hadoop100 ~]$ cd /opt/download/
[hadoop@hadoop100 soft]$ cp mysql-connector-java-5.1.38.jar /opt/pkg/hive/lib/

解决日志Jar包冲突

# 进入lib目录
[hadoop@hadoop100 conf]$ cd /opt/pkg/hive/lib/
# 重新命名 或者直接删除
[hadoop@hadoop100 lib]$ mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak

配置Hive环境变量

打开/etc/profile文件

$ sudo vim /etc/profile

末尾添加如下内容

export HIVE_HOME=/opt/pkg/hive
export PATH=$PATH:$HIVE_HOME/bin

使修改生效

$ source /etc/profile

初始化元数据库

  1. 新建一个hadoop100连接, 登录MySQL
# 连接MySQL, 用户名root, 密码niit1234
[hadoop@hadoop100 ~]$ mysql -uroot -pniit1234
  1. 创建hive元数据, 需要和hive-site.xml中配置的一致
-- 创建数据库, 数据库名为: metastore
create database metastore;
show databases;
  1. 退出mysql
exit
  1. 初始化元数据库
  [hadoop@hadoop100 ~]$ schematool -initSchema -dbType mysql -verbose

看到schemaTool completed 表示初始化成功

验证安装

  • hadoop集群已启动
  • mysql服务已启动
  • 在hadoop100上任意目录启动hive cli命令行客户端
[hadoop@hadoop100 ~]$ hive
# 启动成功之后, 警告信息可以忽略

查看有哪些数据库

show databases;

说明hive安装成功

退出cli

quit;

HBase与Hive整合配置

拷贝jar包

将我们HBase的五个jar包拷贝到hive的lib目录下
hbase的jar包都在/opt/pkg/hbase/lib
我们需要拷贝五个jar包名字如下

hbase-client-2.2.2.jar
hbase-hadoop2-compat-2.2.2.jar
hbase-hadoop-compat-2.2.2.jar
hbase-it-2.2.2.jar
hbase-server-2.2.2.jar
  • 在hadoop100执行以下命令
cd  /opt/pkg/hbase-2.2.2/lib
cp hbase-protocol-2.2.2.jar   /opt/pkg/hive/lib/
cp hbase-server-2.2.2.jar  /opt/pkg/hive/lib/
cp hbase-client-2.2.2.jar  /opt/pkg/hive/lib/
cp hbase-common-2.2.2.jar   /opt/pkg/hive/lib/
cp hbase-common-2.2.2-tests.jar   /opt/pkg/hive/lib/

如果发现hive/lib已经存在相同jar包(大版本相同即可),也可以先不拷贝。

修改hive的配置文件

编辑hadoop100服务器上面的hive的配置文件hive-site.xml

cd /opt/pkg/hive/conf
vim hive-site.xml

添加以下两个属性的配置

<property>
    <name>hive.zookeeper.quorum</name>
    <value>hadoop100,hadoop101,hadoop102</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop100,hadoop101,hadoop102</value>
</property>

修改hive-env.sh配置文件

cd /opt/pkg/apache-hive-3.1.2/conf
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
  • 添加以下配置
export HADOOP_HOME=/opt/pkg/hadoop
export HBASE_HOME=/opt/pkg/hbase
export HIVE_CONF_DIR=/opt/pkg/hive/conf

需求一:将hive表当中分析的结果保存到hbase表当中去

hive当中建表

  • hadoop100执行以下命令,进入hive客户端,并创建hive表
cd /opt/pkg/hive/
bin/hive

创建hive数据库与hive对应的数据库表

create database course;
use course;

create external table if not exists course.score(id int, cname string, score int) 
row format delimited fields terminated by '\t' stored as textfile ;

准备数据内容如下并加载到hive表

hadoop100执行以下命令,创建数据文件

cd /opt/data
vim hive-hbase.txt

文件内容如下

1   zhangsan    80
2   lisi    60
3   wangwu  30
4   zhaoliu 70

vim编辑时 :set noexpandtab关闭将tab转换成空格的设置,输入时使用制表符作为分隔符
可以:set list用来查看制表符(^I)和换行($)

进入hive客户端进行加载数据

hive (course)> load data local inpath '/opt/data/hive-hbase.txt' into table score;
hive (course)> select * from score;

创建hive管理表与HBase进行映射

我们可以创建一个hive的管理表与hbase当中的表进行映射,hive管理表当中的数据,都会存储到hbase上面去

hive当中创建内部表

create table course.hbase_score(id int,cname string,score int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score") tblproperties("hbase.table.name" = "hbase_score");

通过insert overwrite select 插入数据

insert overwrite table course.hbase_score select id,cname,score from course.score;

hbase当中查看表 hbase_score

进入hbase的客户端查看表hbase_score,并查看当中的数据

hbase(main):023:0> list
TABLE
hbase_score
myuser
myuser2
student
user
5 row(s) in 0.0210 seconds
=> ["hbase_score", "myuser", "myuser2", "student", "user"]

hbase(main):024:0> scan 'hbase_score'

ROW                      COLUMN+CELL                                                   
 1                       column=cf:name, timestamp=1550628395266, value=zhangsan       
 1                       column=cf:score, timestamp=1550628395266, value=80           
 2                       column=cf:name, timestamp=1550628395266, value=lisi           
 2                       column=cf:score, timestamp=1550628395266, value=60           
 3                       column=cf:name, timestamp=1550628395266, value=wangwu         
 3                       column=cf:score, timestamp=1550628395266, value=30           
 4                       column=cf:name, timestamp=1550628395266, value=zhaoliu       
 4                       column=cf:score, timestamp=1550628395266, value=70           
4 row(s) in 0.0360 seconds

需求二:创建hive外部表,映射HBase当中已有的表模型

HBase当中创建表并手动插入加载一些数据

进入HBase的shell客户端,

bin/hbase shell

手动创建一张表,并插入加载一些数据进去

# 创建一张表
# 通过put插入数据到hbase表
create 'hbase_hive_score',{ NAME =>'cf'}
put 'hbase_hive_score','1','cf:name','zhangsan'
put 'hbase_hive_score','1','cf:score', '95'
put 'hbase_hive_score','2','cf:name','lisi'
put 'hbase_hive_score','2','cf:score', '96'
put 'hbase_hive_score','3','cf:name','wangwu'
put 'hbase_hive_score','3','cf:score', '97'

建立hive的外部表,映射HBase当中的表以及字段

在hive当中建立外部表

进入hive客户端,然后执行以下命令进行创建hive外部表,就可以实现映射HBase当中的表数据

CREATE external TABLE course.hbase2hive(id int, name string, score int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name,cf:score") TBLPROPERTIES("hbase.table.name" ="hbase_hive_score");

查看hive表course.hbase2hive

select * from course.hbase2hive;

Views: 15

Index