【数据堆栈】hive + hadoop数仓搭建实践

[复制链接]
发表于 2025-12-25 04:11:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
基于HDFS + Hive+mysql搭建离线数仓,终极效果可以大概通过可视化界面访问数仓数据
架构图


此中,
1 hive 服务包罗 metastore元数据 服务和 hiveserver2服务
2 启动metastore元数据服务,metastore元数据存储在MySQL中
3 在metastore服务根本上再启动hiveserver2服务,即可通过代码、客户端、beeline shell去链接hive
4 建的库表存储到hdfs中
Hadoop搭建

由于资源不敷,搭建伪分布式,利用Hadoop的HDFS分布式存储功能,可以查察搭建教程
由于资源限定 hadoop情况搭建利用的是 hadoop 用户。
拜见Hadoop3.2.1安装-单机模式和伪分布式模式
Hive 搭建

Hive是一个分布式的、支持容错的数仓体系,用于大量数据分析。HMS提供了一个元数据堆栈,可以很轻易举行数据分析和数据驱动决议。是很多数据湖架构利用的紧张的组件。Hive是基于Hadoop,可以利用HDFS存储。支持用户通过SQL语言管理数据。
MySQL搭建

搭建数仓,必要先搭建MySQL,这里不再赘述。
官网文档

https://hive.apache.org/development/gettingstarted/
下载

https://archive.apache.org/dist/hive/
这里选择的是Hive4.0版本
下载bin.tar.gz包,解压
设置

设置hive情况变量

  1. vi /etc/profile
复制代码
增长如下代码
  1. # Hive
  2. export HIVE_HOME=/home/datahouse/hive-4.0.0
  3. export PATH=$PATH:$HIVE_HOME/bin
复制代码
生存后,实行革新下令
  1. source /etc/profile
复制代码
设置日记文件

  1. # 进入配置文件目录
  2. cd /home/datahouse/hive-4.0.0/conf
复制代码
将hive-log4j2.properties.template 设置文件复制成 hive-log4j2.properties
并修改设置文件:
  1. #配置日志日志路径
  2. property.hive.log.dir = /home/datahouse/hive-4.0.0/logs
  3. property.hive.log.file = hive.log
复制代码
设置hive-site

进入到解压目次(安装目次)
  1. # 进入到配置文件目录
  2. cd /home/datahouse/hive-4.0.0/conf
复制代码
新建 hive-site.xml文件,增长如下设置内容:
  1. <configuration>
  2.         <!-- 指定存储元数据存储的数据库 -->
  3.    <property>
  4.       <name>javax.jdo.option.ConnectionURL</name>
  5.       <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
  6.    </property>
  7.    <property>
  8.       <name>javax.jdo.option.ConnectionDriverName</name>
  9.       <value>com.mysql.jdbc.Driver</value>
  10.    </property>
  11.    <property>
  12.       <name>javax.jdo.option.ConnectionUserName</name>
  13.       <value>root</value>
  14.    </property>
  15.    <property>
  16.       <name>javax.jdo.option.ConnectionPassword</name>
  17.       <value>xxxx</value>
  18.    </property>
  19.    <!-- 指定存储元数据要连接的地址 -->
  20.    <property>
  21.       <name>hive.metastore.uris</name>
  22.       <value>thrift://127.0.0.1:9083</value>
  23.       <description>URI for client to connect to metastore server</description>
  24.    </property>
  25.    <!-- 指定hiveserver2连接的host -->
  26.    <property>
  27.       <name>hive.server2.thrift.bind.host</name>
  28.       <value>yd-ss</value>
  29.    </property>
  30.    <!-- 指定hiveserver2连接的端口号 -->
  31.    <property>
  32.       <name>hive.server2.thrift.port</name>
  33.       <value>10000</value>
  34.    </property>
  35.    <!-- hiveserver2的高可用参数,如果不开会导致了开启tez session导致hiveserver2无法启动 -->
  36.    <property>
  37.       <name>hive.server2.active.passive.ha.enable</name>
  38.       <value>false</value>
  39.    </property>
  40.    <!--解决Error initializing notification event poll问题-->
  41.    <property>
  42.       <name>hive.metastore.event.db.notification.api.auth</name>
  43.       <value>false</value>
  44.    </property>
  45.    <property>
  46.       <name>tez.mrreader.config.update.properties</name>
  47.       <value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value>
  48.    </property>
  49.    <!--配置默认计算引擎为mr-->
  50.    <property>
  51.       <name>hive.execution.engine</name>
  52.       <value>mr</value>
  53.    </property>
  54.    <!--配置HDFS数据目录-->
  55.       <property>
  56.       <name>hive.metastore.warehouse.dir</name>
  57.       <value>/home/datahouse/hive/warehouse</value>
  58.    </property>
  59. </configuration>
复制代码
此中,hive.metastore.warehouse.dir 目次,得是hdfs分布式文件体系下的目次,这个很紧张,假如在Linux当地文件体系下创建该目次,背面是会报错的。下面是创建步调:
  1. # 切换到hadoop账户(因为hadoop是用hadoop用户部署的,所以要切换,如果是root用户部署,可以不用切换)
  2. [root@yd-ss ~]# su hadoop
  3. # 创建文件
  4. [hadoop@yd-ss root]$ hdfs dfs -mkdir -p /home/datahouse/hive/warehouse
  5. # 赋权
  6. [hadoop@yd-ss root]$ hdfs dfs -chmod 777  /home/datahouse/hive/warehouse/
复制代码
复制mysql 驱动包

找到java 毗连MySQL的驱动包,上传到${HIVE_HOME}/lib 目次
可以在maven中心堆栈去找,
https://mvnrepository.com/
删除日记包

删除安装路径下的/lib/log4j-slf4j-impl-2.18.0.jar
防止日记出现以下信息:
  1. SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/data/soft/apache-hive-4.0.0-beta-1-bin/lib/log4j-slf4j-impl-2.18.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/data/soft/hadoop-3.3.5/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
复制代码
初始化元数据

  1. # 进入到${HIVE_HOME}/bin目录,执行
  2. schematool -initSchema -dbType mysql
复制代码
初始化元数据在数据库的表信息和数据
启动metastore服务

  1. # bin目录下执行
  2. hive --service metastore
  3. # 查看日志日志
  4. tail -300f logs/hive.log
复制代码
启动会报错

必要在/etc/hosts 文件设置 127.0.0.1 yd-ss 的分析
由于/etc/hostname 文件设置了主机名 为 yd-ss
再次启动,必要利用配景方式启动
  1. # 将日志日志输出到metastore.log
  2. nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &
复制代码
利用hive CLI

巨大变革:Hive4.0.0中,HiveCLI已经被弃用了,取代它的是Beeline。以是,启动Hive4.0.0时,会默认进入Beeline下令行界面,而不是HiveCLI
启动hiveServer2

  1. nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&1 &
复制代码
报错
  1. Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=EXECUTE, inode="/tmp/hive/_resultscache_":hadoop:supergroup:drwx------
复制代码
缘故起因是/tmp/hive/_resultscache_目次权限标题,/tmp/hive/_resultscache_ 文件夹 所属用户hadoop,权限为全部者777,但组和其他用户权限都为0,即只有hadoop用户有rwx权限,其他用户无权限。
办理方案:登录hadoop用户,给该文件赋权
  1. # 切换到hadoop 用户
  2. [root@yd-ss bin]# su hadoop
  3. #切换到 hadoop 安装目录bin下,执行赋权命令
  4. [hadoop@yd-ss bin]$ hdfs dfs -chmod 777 /tmp/hive/_resultscache_
复制代码
再次启动,即可顺遂启动。当时在这个错误纠结了2天时间,关键的是在赋权这个利用上。
访问hiveserver2

通过查察启动日记,webui服务默认是在10002端口启动的,输入以下地点即可访问
  1. http://localhost:10002/
复制代码

若报错,则必要在hadoop中core-site.xml设置如下参数:
  1. <!-- 整合hive 用户代理设置 -->
  2.   <property>
  3.     <name>hadoop.proxyuser.root.hosts</name>
  4.     <value>*</value>
  5.   </property>
  6.   <property>
  7.     <name>hadoop.proxyuser.root.groups</name>
  8.     <value>*</value>
  9.   </property>
复制代码
客户端毗连

beeline shell毗连

  1. # 到hive安装bin目录下执行,yd-ss代表当前主机名
  2. beeline -u jdbc:hive2://yd-ss:10000 --verbose=true -n root
复制代码
这个很雷同MySQL的shell毗连方式,如下:
  1. [root@yd-ss bin]# beeline -u jdbc:hive2://yd-ss:10000 --verbose=true -n root
  2. !connect jdbc:hive2://yd-ss:10000 root [passwd stripped]
  3. Connecting to jdbc:hive2://yd-ss:10000
  4. Connected to: Apache Hive (version 4.0.0)
  5. Driver: Hive JDBC (version 4.0.0)
  6. Transaction isolation: TRANSACTION_REPEATABLE_READ
  7. Beeline version 4.0.0 by Apache Hive
  8. 0: jdbc:hive2://yd-ss:10000>
复制代码
实行下面脚本:
  1. CREATE DATABASE test;
  2. show databases;
复制代码
  1. 0: jdbc:hive2://yd-ss:10000> CREATE DATABASE test;
  2. going to print operations logs
  3. printed operations logs
  4. Getting log thread is interrupted, since query is done!
  5. INFO  : Compiling command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92): CREATE DATABASE test
  6. INFO  : Semantic Analysis Completed (retrial = false)
  7. INFO  : Created Hive schema: Schema(fieldSchemas:null, properties:null)
  8. INFO  : Completed compiling command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92); Time taken: 0.003 seconds
  9. INFO  : Concurrency mode is disabled, not creating a lock manager
  10. INFO  : Executing command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92): CREATE DATABASE test
  11. INFO  : Starting task [Stage-0:DDL] in serial mode
  12. INFO  : Completed executing command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92); Time taken: 0.147 seconds
  13. No rows affected (0.173 seconds)
  14. 0: jdbc:hive2://yd-ss:10000> show databases;
  15. going to print operations logs
  16. printed operations logs
  17. Getting log thread is interrupted, since query is done!
  18. INFO  : Compiling command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37): show databases
  19. INFO  : Semantic Analysis Completed (retrial = false)
  20. INFO  : Created Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
  21. INFO  : Completed compiling command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37); Time taken: 0.02 seconds
  22. INFO  : Concurrency mode is disabled, not creating a lock manager
  23. INFO  : Executing command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37): show databases
  24. INFO  : Starting task [Stage-0:DDL] in serial mode
  25. INFO  : Completed executing command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37); Time taken: 0.071 seconds
  26. +----------------+
  27. | database_name  |
  28. +----------------+
  29. | default        |
  30. | test           |
  31. +----------------+
  32. 2 rows selected (0.218 seconds)
复制代码
乐成实行。根本和MySQL是雷同的。
如下,可以看到建的库是存储到hdfs分布式文件体系中的。
  1. [hadoop@yd-ss bin]$ hdfs dfs -ls /home/datahouse/hive/warehouse/
  2. drwxr-xr-x   - root supergroup          0 2024-11-14 10:38 /home/datahouse/hive/warehouse/test.db
复制代码
Dbeaver毗连

参考文章 DBeaver 毗连hive数仓
毗连上后,根本就和mysql利用雷同了。
履历

1 hive 包罗 metastore元数据服务和hiveserver2服务;
2 hadoop服务是利用hadoop 用户摆设的伪分布式模式,hive是利用root用户摆设的;
3 apache下的组件是真的难用,文档不清晰,各种xml设置标题;
4 要相识hdfs分布式文件体系和Linux当地文件体系区别,否则很轻易碰到文件权限标题;
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表