一般做大数据分析都会建立在Hive的基础上,Hive本身有两个主要的功能:维护元数据信息,比如库、表以及他们在Hdfs上如何存储;提供查询分析能力,Hive的查询引擎可以自由替换,比如MapReduce、Spark等。
本篇就通过架构和部署等方面来了解下Hive。
1 架构
Hive从架构上主要分成三个角色,客户端、执行引擎、元数据MetaStore。
客户端: 支持多种连接方式,用户可以通过这些客户端连接到Hive集群并执行命令。常用的如Jdbc可以很方便的与一些web项目集成,beeline命令行,thrift跨语言rpc。之前做过的项目直接使用jdbc多一点。
HiveServer2:一般提到HiveServer,还会有一种叫法叫HiveServer2。其实他们是一个东西,只不过HiveServer2是后期优化的升级版,支持多客户端访问以及身份认证等功能。回头说说这个HiveServer2,它是Hive的核心组件,包括接收客户端请求,查询语法的解析、优化、执行等。Hive也支持多种查询引擎,比如MapReduce以及Spark。执行的过程其实大体相同,都是通过一个语法解析解析SQL,然后生成对应执行引擎的查询任务,提交到对应的集群上执行。如果是MapReduce会翻译成一组MapReduce提交到Yarn上执行,如果是Spark也会翻译成Spark的DAG图执行。
元数据:元数据服务提供了对应库和表等信息的维护,比如表的表结构信息、分区信息、字段信息、统计信息等。很多计算框架都会依赖于这些统计信息进行查询的优化,对于大数据的场景这些统计信息有时候是缺失的,因此Spark也在3.0推出了动态查询自适应的特性。
2 部署
如果使用的是Hadoop,那推荐直接使用cdh安装大数据套件,这些东西就都有了。如果是K8s环境,则建议采用Docker方案,无论是Mac还是Windows只要安装Docker就可以一键部署。部署脚本参考项目:
https://github.com/big-data-europe/docker-hive
这个项目内置了Hadoop的简易环境,比如单机版的hdfs(namenode+datanode),提供了一个单机版的presto,基于postgre的metastore,hive-server,这样就构成了一个极简的Hive版本。如果想要用Spark来连接这个Hive进行查询,需要修改下载的docker-compose.yml:
version: "3"
services:
namenode:
image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
volumes:
- namenode:/hadoop/dfs/name
environment:
- CLUSTER_NAME=test
env_file:
- ./hadoop-hive.env
ports:
- "50070:50070"
# 主要修改这里,开放8020端口
- "8020:8020"
datanode:
image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
volumes:
- datanode:/hadoop/dfs/data
env_file:
- ./hadoop-hive.env
environment:
SERVICE_PRECONDITION: "namenode:50070"
ports:
- "50075:50075"
# 增加datanode端口开放
- "50010:50010"
hive-server:
image: bde2020/hive:2.3.2-postgresql-metastore
env_file:
- ./hadoop-hive.env
environment:
HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"
SERVICE_PRECONDITION: "hive-metastore:9083"
ports:
- "10000:10000"
hive-metastore:
image: bde2020/hive:2.3.2-postgresql-metastore
env_file:
- ./hadoop-hive.env
command: /opt/hive/bin/hive --service metastore
environment:
SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"
ports:
- "9083:9083"
hive-metastore-postgresql:
image: bde2020/hive-metastore-postgresql:2.3.0
presto-coordinator:
image: shawnzhu/prestodb:0.181
ports:
- "8080:8080"
volumes:
namenode:
datanode:
然后宿主机配置增加三个域名:
1 namenode
2 namenode的镜像id
3 datanode的镜像id
这三个主机都配成宿主主机的IP即可。
修改完成后启动Docker-Compose并下载相关镜像
docker-compose up -d
安装成功后如下图所示:
PS D:\workspace\docker-hive> docker-compose up -d
Creating network "docker-hive_default" with the default driver
Creating docker-hive_hive-server_1 ... done
Creating docker-hive_hive-metastore_1 ... done
Creating docker-hive_hive-metastore-postgresql_1 ... done
Creating docker-hive_datanode_1 ... done
Creating docker-hive_namenode_1 ... done
Creating docker-hive_presto-coordinator_1 ... done
安装完成后内部包含
PS D:\workspace\docker-hive> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3edc920f9709 bde2020/hive-metastore-postgresql:2.3.0 "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 5432/tcp docker-hive_hive-metastore-postgresql_1
d548c32a8e92 bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8 "/entrypoint.sh /run…" 8 seconds ago Up 6 seconds (health: starting) 0.0.0.0:50075->50075/tcp docker-hive_datanode_1
f070bb17a740 shawnzhu/prestodb:0.181 "./bin/launcher run" 8 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp docker-hive_presto-coordinator_1
8de0d6d2cc37 bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8 "/entrypoint.sh /run…" 8 seconds ago Up 6 seconds (health: starting) 0.0.0.0:50070->50070/tcp docker-hive_namenode_1
ecbc1eafc995 bde2020/hive:2.3.2-postgresql-metastore "entrypoint.sh /bin/…" 8 seconds ago Up 6 seconds 0.0.0.0:10000->10000/tcp, 10002/tcp docker-hive_hive-server_1
a907be52a04d bde2020/hive:2.3.2-postgresql-metastore "entrypoint.sh /opt/…" 8 seconds ago Up 6 seconds 10000/tcp, 0.0.0.0:9083->9083/tcp, 10002/tcp docker-hive_hive-metastore_1
加载测试数据
启动成功后登录到hive-server镜像中
docker-compose exec hive-server bash
使用Beeline连接hive
/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000
创建hive表
CREATE TABLE pokes (foo INT, bar STRING);
加载数据
LOAD DATA LOCAL INPATH '/opt/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
使用技巧:https://www.runoob.com/docker/docker-compose.html
docker-compose down用于关闭yml配置文件中的所有镜像
docker-compose up -d 用于在后台启动所有镜像
3 参考
hiveserver2官方文档
https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2
docker-hive官方文档
https://github.com/big-data-europe/docker-hive