搭建过程
访问Hive的Docker Hub,使用说明中(apache/hive - Docker Image | Docker Hub),存在如下几种场景:
export HIVE_VERSION=4.0.1
使用Derby做为元数据存储库;拉起HiveServer2(嵌入元存储)
docker run -d -p 10000:10000 -p 10002:10002 \
--env SERVICE_NAME=hiveserver2 \
--name hive4 apache/hive:${HIVE_VERSION}
使用Derby做为元数据存储库;拉起独立元存储
docker run -d -p 9083:9083 \
--env SERVICE_NAME=metastore \
--name metastore-standalone apache/hive:${HIVE_VERSION}
拉起HS2:
1、使用外部独立元存储:"-Dhive.metastore.uris用于指定外部元存储地址
2、指定挂载
docker run -d -p 10000:10000 -p 10002:10002 \
--env SERVICE_NAME=hiveserver2 \
--env SERVICE_OPTS="-Dhive.metastore.uris=thrift://metastore-standalone:9083" \
--mount source=warehouse,target=/opt/hive/data/warehouse \
--env IS_RESUME="true" \
--name hiveserver2-standalone apache/hive:${HIVE_VERSION}
使用外部的RDBMS (Postgres/Oracle/MySql/MsSql),拉起独立元存储
docker run -d -p 9083:9083 \
--env SERVICE_NAME=metastore \
--env DB_DRIVER=postgres \
--env SERVICE_OPTS="-Djavax.jdo.option.ConnectionDriverName=org.postgresql.Driver -Djavax.jdo.option.ConnectionURL=jdbc:postgresql://postgres:5432/metastore_db -Djavax.jdo.option.ConnectionUserName=hive -Djavax.jdo.option.ConnectionPassword=password" \
--mount source=warehouse,target=/opt/hive/data/warehouse \
--name metastore-standalone apache/hive:${HIVE_VERSION}
基于上面的说明,我这里将hive的HS2和Metastore均按照standalone部署,且Metastore使用外部数据库(这里使用postgresql)。然后,使用docker-compose进行管理。
首先,进行环境准备
useradd hive
usermod -a -G docker hive
su - hive
echo "export HIVE_VERSION=4.0.1" ~/.bash_profile
source ~/.bash_profile
然后,定义docker-compose yaml
cat >docker-compose.yaml <<'EOF'
services:
postgres:
image: postgres
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: hive
POSTGRES_DB: metastore_db
ports:
- "5432:5432"
volumes:
- ./postgres_data:/var/lib/postgresql/data # 挂载卷到宿主机
networks:
- zookeeper-net
metastore-standalone:
image: apache/hive:${HIVE_VERSION}
environment:
SERVICE_NAME: metastore
DB_DRIVER: postgres
SERVICE_OPTS: >
-Djavax.jdo.option.ConnectionDriverName=org.postgresql.Driver
-Djavax.jdo.option.ConnectionURL=jdbc:postgresql://postgres:5432/metastore_db
-Djavax.jdo.option.ConnectionUserName=hive
-Djavax.jdo.option.ConnectionPassword=password
ports:
- "9083:9083"
depends_on:
- postgres
volumes:
- ./metastore:/opt/hive/data/warehouse # 挂载卷到宿主机
- ./postgresql-42.6.2.jar:/opt/hive/lib/postgresql-42.6.2.jar
networks:
- zookeeper-net
hiveserver2-standalone:
image: apache/hive:${HIVE_VERSION}
environment:
SERVICE_NAME: hiveserver2
SERVICE_OPTS: "-Dhive.metastore.uris=thrift://metastore-standalone:9083"
IS_RESUME: "true"
ports:
- "10000:10000"
- "10002:10002"
depends_on:
- metastore-standalone
volumes:
- ./hiveserver2:/opt/hive/data/warehouse # 挂载卷到宿主机
networks:
- zookeeper-net
networks:
zookeeper-net:
external: true
EOF
拉起hive服务
docker-compose up -d
赋权host上的目录,否则无法写入数据
chmod 777 hiveserver2/
chmod 777 metastore/
访问HiveServer2 Web UI
浏览器输入:http://IP:10002/,因为没有配置认证,所以会直接进入主页。
在Beeline中要执行命令举例
show tables;
create table hive_example(a string, b int) partitioned by(c int);
alter table hive_example add partition(c=1);
insert into hive_example partition(c=1) values('a', 1), ('a', 2),('b',3);
select count(distinct a) from hive_example;
select sum(b) from hive_example;