本篇要做的事:基于上一篇使用docker搭建的spark集群安装一个hive。
Hive下载:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hive/stable-2/apache-hive-2.3.3-bin.tar.gz
Hive镜像创建
写一个dockerfile来安装hive:
# 引用镜像
FROM spark:v1
#设置维护人员
MAINTAINER ffzs
# 复制文件 并解压
ADD apache-hive-2.3.3-bin.tar.gz /usr/lib
# 环境设置
ENV HIVE_HOME=/usr/lib/apache-hive-2.3.3-bin
ENV PATH=$PATH:$HIVE_HOME/bin
创建一个叫hive:v1的镜像
docker build -t hive:v1 .
此时,我们运行hive:v1镜像,对hive进行配置:
docker run -it hive:v1
创建hive-site.xml:
vim $HIVE_HOME/conf/hive-site.xml
# 添加内容如下
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop5:3306/hivedb?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
<!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop05 为 localhost -->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>
修改hadoop的core-site.xml文件,以使beeline可以访问hive:
vim $HADOOP_CONFIG_HOME/core-site.xml
#添加内容如下
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
要连接msyql需要在hive中的lib文件加中添加驱动:
apt install libmysql-java
find / -name mysql-connector-java*
#我的在这/usr/share/java/mysql-connector-java-5.1.38.jar
#复制
cp /usr/share/java/mysql-connector-java-5.1.38.jar $HIVE_HOME/lib/
配置完成 保存:
docker commit `docker ps -q` hive:v1
关闭container:
docker stop `docker ps -aq`
docker rm `docker ps -aq`
安装mysql镜像
我们要使用mysql作为元数据库,需要安装mysql,但是在docker上安装mysql保存的密码总是无法保存,操作总是出现问题,于是我选着直接pull 一个官方镜像,外接mysql,这里选用mysql5.7:
docker pull mysql:5.7
运行
docker run -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
保存一下:
docker commit `docker ps -q` mysql:v1
关闭同上。。
开启hadoop集群
改写docker的开启shell:
run-docker-hive.sh
#!/bin/bash
docker rm -f hadoop1 >/dev/null 2>&1
echo "start hadoop1 container..."
docker run -itd \
--network hadoop \
--name hadoop1 \
--ip 172.19.0.2 \
--hostname hadoop1 \
hive:v1 >/dev/null 2>&1
docker exec hadoop1 bash -c "echo 1 > /home/hadoop/data/zkdata/myid"
N=${1:-5}
i=2
while [ $i -lt $N ]
do
docker rm -f hadoop$i >/dev/null 2>&1
echo "start hadoop$i container..."
docker run -itd \
--network hadoop \
--name hadoop$i \
--ip 172.19.0.$(( $i + 1 )) \
--hostname hadoop$i \
spark:v1 >/dev/null 2>&1
docker exec hadoop$i bash -c "echo $i > /home/hadoop/data/zkdata/myid"
i=$(( $i + 1 ))
done
docker rm -f hadoop5 >/dev/null 2>&1
echo "start hadoop5 container..."
docker run -d \
--network hadoop \
--name hadoop5 \
--ip 172.19.0.6 \
--hostname hadoop5 \
mysql:v1 >/dev/null 2>&1
如果你的172.19.0.0ip段被其他network占用:
删除network
docker network rm network名
创建hadoop network 指定 172.19.0.0 ip:
docker network create --driver=bridge --subnet=172.19.0.0/16 hadoop
#! /bin/bash
sh run-docker-hive.sh
sh zk-start.sh
sh jnn-start.sh
sh hadoop-start.sh
开启hive:
sh hive-start.sh
开启hadoop1的bash:
docker exec -it hadoop1 bash
初始化元数据库:
schematool -dbType mysql -initSchema
出现红框内容说明成功…
启动hive
此时运行hive --service cli或hive效果一样:
hive --service cli
beeline连接hive
先启动 hiveserver2 服务:
nohup hiveserver2 1>/home/hadoop/hiveserver.log 2>/home/hadoop/hiveserver.err &
出现 RunJar说明开启成功。。
启动beeline连接:
beeline -u jdbc:hive2://hadoop1:10000 -n root
出现上面的内容说明连接成功。。