docker安装Hive

首先,Hive是基于Hadoop中HDFS和MapReduce的,所以需要先安装Hadoop,按照Hadoop的教程见:Mac基于Docker搭建Hadoop集群

一、下载Hive

  1. 访问Apache官网:https://dlcdn.apache.org/hive/hive-3.1.2/,选择对应的版本,注意,Hive版本要和Hadoop版本相对应,参考:https://hive.apache.org/downloads.html

            

  如上图,可以看到,Hive 3.1.2版本支持 Hadoop 3.x.y版本,而我的Hadoop版本是 3.2.2的,所以选择Hive版本为 3.1.2 。

  

二、安装Hive

  1. 拷贝刚刚下载的Hive到docker容器中:
# 拷贝Hive安装包进 h01容器
docker cp /Users/luochao7/Downloads/apache-hive-3.1.2-bin.tar.gz 5fa8d538d8ae:/usr/local
# 进入容器 docker exec
-it 5fa8d538d8ae bash cd /usr/local/
# 解压安装包 tar xvf apache-hive-3.1.2-bin.tar.gz
#文件夹更名 root@h01:
/usr/local# mv apache-hive-3.1.2-bin hive
#拷贝Mysql jdbc驱动到hive安装包 lib目录下(我的Mysql是8.
0.26的) docker cp /Users/luochao7/.m2/repository/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar 5fa8d538d8ae:/usr/local/hive/lib

  

三、配置Hive

  1.修改Hadoop中的 core-site.xml,并且 Hadoop集群同步配置文件,重启生效

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

  因为Hive需要把数据存储在 HDFS上,并且通过 MapReduce作为执行引擎处理数据

  2.修改配置文件

#slf4j这个包hadoop及hive两边只能有一个,这里删掉hive这边
root@Master:/usr/local/hive/lib# rm log4j-slf4j-impl-2.10.0.jar

#guava这个包hadoop及hive两边只删掉版本低的那个,把版本高的复制过去,这里删掉hive,复制hadoop的过去(注意看路径)
root@h01:/usr/local/hadoop/share/hadoop/common/lib# cp guava-27.0-jre.jar /usr/local/hive/lib/
root@h01:/usr/local/hive/lib# rm -rf guava-19.0.jar

#修改hive环境变量文件 添加Hadoop_HOME
root@h01:/usr/local/hive/conf# mv hive-env.sh.template hive-env.sh
root@h01:/usr/local/hive/conf# vim hive-env.sh

#在最后一行添加
export HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

#新增hive-site.xml 配置mysql等相关信息
root@h01:/usr/local/hive/conf# vim hive-site.xml

#粘贴配置
<configuration>
    <!-- 存储元数据mysql相关配置 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value> jdbc:mysql://172.17.0.2:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <!--mysql用户名-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <!--mysql密码-->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    <!-- H2S运行绑定host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>h01</value>
    </property>
    <!-- 远程模式部署metastore 服务地址 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://h01:9083</value>
    </property>
    <!-- 关闭元数据存储授权  -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <!-- 关闭元数据存储版本的验证 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
</configuration> 

  3. 初始化元数据(先启动 mysql)

root@h01:/usr/local/hive# bin/schematool -initSchema -dbType mysql -verbos

  初始化元数据,此时会在 mysql中,创建一个 hive数据库,因为之前不存在 hive数据库,所以会新建,在 mysql中使用: show databases 查看。

  常见问题:如果在执行如上语句的时候,出现如下图:

            

  因为我的 mysql是安装在另外一个 docker 容器中的,导致两个 docker 不连通,解决办法:docker中两个容器ping不通的情况

  解决之后,重新修改 hive/conf/hive-site.xml,将地址修改为:jdbc:mysql://172.18.0.3:3306,重新执行初始化元数据命令,即可。

 

四、启动Hive:第一代客户端(deprecated 不推荐使用)

  1. 前台启动Metastore服务(不推荐):
root@h01:/usr/local/hive# bin/hive --service metastore

  启动后,窗口一直处于等待的状态:

            

  这个时候,这个窗口就不能干别的,使用 control + c 结束,所以,不推荐这种方式。 

  2.后台启动Metastore服务(推荐):

#输入命令回车执行 再次回车 进程将挂起后台
root@h01:/usr/local/hive# nohup bin/hive --service metastore &

  注意末尾有一个 &符号,启动后,这个进程在后台运行:

            

   使用 jps 查看进程:

            

  可见,有一个 RunJar 在后台运行。

  3.启动 hive(先启动Hadoop集群)

root@h01:/usr/local/hive# bin/hive

  启动成功后,如下图所示,输入 show databases 可以查看hive的数据库:

            

 

 五、启动Hive:第二代客户端(推荐使用)

  Hive经过发展,推出了第二代客户端 beeline,但是 beeline客户端不是直接访问 metastore服务的,而是需要单独启动 hiveserver2服务。在Hive安装的服务器上,首先启动metastore服务,然后启动 hiveserver2服务.

  如下图所示:

            

  1. 后台启动Metastore服务(先启动Hadoop ,如果电脑资源比较小,可以只启动Master):

#输入命令回车执行 再次回车 进程将挂起后台
root@h01:/usr/local/hive# nohup bin/hive --service metastore &

  2. 后台启动 hiverserver2 服务:

root@h01:/usr/local/hive# nohup bin/hive --service hiveserver2 &

  注意启动 hiverserver2 服务之后,要等一会儿(等半分钟吧)再往下启动 beeline客户端,不然会报错:Could not open connection to the HS2 server

  3. 启动 beeline客户端:

root@h01:/usr/local/hive# bin/beeline

  4. 连接 hiverserver2 服务

beeline> ! connect jdbc:hive2://h01:10000
#输入密码,一般都是root访问,直接输入 root,密码不用输,直接回车
Enter username for jdbc:hive2://h01:10000: root
Enter password for jdbc:hive2://h01:10000:
Connected to: Apache Hive (version 3.1.2)

   截图如下:

            

   否则,不连接 hiveserver2 的话,直接 show databases 会显示:No current connection.

  5.测试是否能和Hadoop相连:(如果之前没有创建 itcast 数据库)

INFO  : Compiling command(queryId=root_20220324095900_739f115e-5f84-43f8-9eed-e07e95a84db4): create database itcast
INFO  : Compiling command(queryId=root_20220324095924_3e08b7ab-605f-4951-9c90-f002288f0b63): use itcast
INFO  : Compiling command(queryId=root_20220324095930_85fb6058-0d15-4d99-8cc3-8d6ae761f0b0): show tables
0: jdbc:hive2://h01:10000> create table t_user(id int, name varchar(255), age int);
0: jdbc:hive2://h01:10000> insert into table t_user values(1,"zhangsan",20);

  如果能插入成功,就表示能正常连接到Hadoop,因为Hive的数据都是存在 HDFS上的,只是这个过程很慢,如下图:

            

   执行这一条 insert 语句,竟然花了 69秒,插入成功的话,使用:select * from t_user,显示如下:

            

六、常见问题

  •   因为我的Hadoop、Mysql、Hive,都是部署在Docker容器服务中的,所以在启动Hadoop 、Hive、Mysql的时候,运行 hive程序的时候,Mysql的容器就会挂掉,导致远程连接错误,且Hive程序运行很慢。具体描述、解决方案,见:https://www.cnblogs.com/luo-c/p/15992665.html

  

 

posted @ 2022-03-07 14:41  星海寻梦233  阅读(3774)  评论(2编辑  收藏  举报