当前位置: 首页 > news >正文

基于Hadoop、hive的数仓搭建实践

文章目录

    • 架构图
    • Hadoop搭建
    • Hive 搭建
    • MySQL搭建
    • 官网文档
    • 下载
    • 配置
      • 配置hive环境变量
      • 配置日志文件
      • 配置hive-site
    • 复制mysql 驱动包
    • 删除日志包
    • 初始化元数据
    • 启动metastore服务
    • 使用hive CLI
    • 启动hiveServer2
    • 访问hiveserver2
    • 客户端连接
      • beeline shell连接
    • Dbeaver连接
    • 经验

基于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环境变量

vi /etc/profile

增加如下代码

# Hive
export HIVE_HOME=/home/datahouse/hive-4.0.0
export PATH=$PATH:$HIVE_HOME/bin

保存后,执行刷新命令

source /etc/profile

配置日志文件

# 进入配置文件目录
cd /home/datahouse/hive-4.0.0/conf

将hive-log4j2.properties.template 配置文件复制成 hive-log4j2.properties

并修改配置文件:

#配置日志路径
property.hive.log.dir = /home/datahouse/hive-4.0.0/logs
property.hive.log.file = hive.log

配置hive-site

进入到解压目录(安装目录)

# 进入到配置文件目录
cd /home/datahouse/hive-4.0.0/conf

新建 hive-site.xml文件,增加如下配置内容:

<configuration><!-- 指定存储元数据存储的数据库 --><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value></property><property><name>javax.jdo.option.ConnectionPassword</name><value>xxxx</value></property><!-- 指定存储元数据要连接的地址 --><property><name>hive.metastore.uris</name><value>thrift://127.0.0.1:9083</value><description>URI for client to connect to metastore server</description></property><!-- 指定hiveserver2连接的host --><property><name>hive.server2.thrift.bind.host</name><value>yd-ss</value></property><!-- 指定hiveserver2连接的端口号 --><property><name>hive.server2.thrift.port</name><value>10000</value></property><!-- hiveserver2的高可用参数,如果不开会导致了开启tez session导致hiveserver2无法启动 --><property><name>hive.server2.active.passive.ha.enable</name><value>false</value></property><!--解决Error initializing notification event poll问题--><property><name>hive.metastore.event.db.notification.api.auth</name><value>false</value></property><property><name>tez.mrreader.config.update.properties</name><value>hive.io.file.readcolumn.names,hive.io.file.readcolumn.ids</value></property><!--配置默认计算引擎为mr--><property><name>hive.execution.engine</name><value>mr</value></property><!--配置HDFS数据目录--><property><name>hive.metastore.warehouse.dir</name><value>/home/datahouse/hive/warehouse</value></property>
</configuration>

其中,hive.metastore.warehouse.dir 目录,得是hdfs分布式文件系统下的目录,这个很重要,若是在Linux本地文件系统下创建该目录,后面是会报错的。下面是创建步骤:

# 切换到hadoop账户(因为hadoop是用hadoop用户部署的,所以要切换,如果是root用户部署,可以不用切换)
[root@yd-ss ~]# su hadoop
# 创建文件
[hadoop@yd-ss root]$ hdfs dfs -mkdir -p /home/datahouse/hive/warehouse
# 赋权
[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

防止日志出现以下信息:

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]

初始化元数据

# 进入到${HIVE_HOME}/bin目录,执行
schematool -initSchema -dbType mysql

初始化元数据在数据库的表信息和数据

启动metastore服务

# bin目录下执行
hive --service metastore
# 查看日志
tail -300f logs/hive.log

启动会报错
在这里插入图片描述

需要在/etc/hosts 文件配置 127.0.0.1 yd-ss 的解析

因为/etc/hostname 文件配置了主机名 为 yd-ss

再次启动,需要使用后台方式启动

# 将日志输出到metastore.log
nohup bin/hive --service metastore >> logs/metastore.log 2>&1 &

使用hive CLI

重大变化:Hive4.0.0中,HiveCLI已经被弃用了,代替它的是Beeline。所以,启动Hive4.0.0时,会默认进入Beeline命令行界面,而不是HiveCLI

启动hiveServer2

nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>&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用户,给该文件赋权

# 切换到hadoop 用户
[root@yd-ss bin]# su hadoop
#切换到 hadoop 安装目录bin下,执行赋权命令
[hadoop@yd-ss bin]$ hdfs dfs -chmod 777 /tmp/hive/_resultscache_

再次启动,即可顺利启动。当时在这个错误纠结了2天时间,关键的是在赋权这个操作上。

访问hiveserver2

通过查看启动日志,webui服务默认是在10002端口启动的,输入以下地址即可访问

http://localhost:10002/

在这里插入图片描述

若报错,则需要在hadoop中core-site.xml配置如下参数:

<!-- 整合hive 用户代理设置 --><property><name>hadoop.proxyuser.root.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.root.groups</name><value>*</value></property>

客户端连接

beeline shell连接

# 到hive安装bin目录下执行,yd-ss代表当前主机名
beeline -u jdbc:hive2://yd-ss:10000 --verbose=true -n root

这个很类似MySQL的shell连接方式,如下:

[root@yd-ss bin]# beeline -u jdbc:hive2://yd-ss:10000 --verbose=true -n root
!connect jdbc:hive2://yd-ss:10000 root [passwd stripped]
Connecting to jdbc:hive2://yd-ss:10000
Connected to: Apache Hive (version 4.0.0)
Driver: Hive JDBC (version 4.0.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 4.0.0 by Apache Hive
0: jdbc:hive2://yd-ss:10000>

执行下面脚本:

CREATE DATABASE test;
show databases;
0: jdbc:hive2://yd-ss:10000> CREATE DATABASE test;
going to print operations logs
printed operations logs
Getting log thread is interrupted, since query is done!
INFO  : Compiling command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92): CREATE DATABASE test
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Created Hive schema: Schema(fieldSchemas:null, properties:null)
INFO  : Completed compiling command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92); Time taken: 0.003 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92): CREATE DATABASE test
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=root_20241113173452_2e942d82-8b36-4dcd-9212-d3bdbd72dc92); Time taken: 0.147 seconds
No rows affected (0.173 seconds)
0: jdbc:hive2://yd-ss:10000> show databases;
going to print operations logs
printed operations logs
Getting log thread is interrupted, since query is done!
INFO  : Compiling command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37): show databases
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Created Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37); Time taken: 0.02 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=root_20241113173512_cfc13da2-518b-406c-946d-83888acf6d37); Time taken: 0.071 seconds
+----------------+
| database_name  |
+----------------+
| default        |
| test           |
+----------------+
2 rows selected (0.218 seconds)

成功执行。基本和MySQL是类似的。

如下,可以看到建的库是存储到hdfs分布式文件系统中的。

[hadoop@yd-ss bin]$ hdfs dfs -ls /home/datahouse/hive/warehouse/
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本地文件系统区别,否则很容易遇到文件权限问题;

相关文章:

基于Hadoop、hive的数仓搭建实践

文章目录 架构图Hadoop搭建Hive 搭建MySQL搭建官网文档下载配置配置hive环境变量配置日志文件配置hive-site 复制mysql 驱动包删除日志包初始化元数据启动metastore服务使用hive CLI启动hiveServer2访问hiveserver2客户端连接beeline shell连接 Dbeaver连接经验 基于HDFS Hive…...

新的恶意软件活动通过游戏应用程序瞄准 Windows 用户

一种新的恶意软件 Winos4.0 被积极用于网络攻击活动。FortiGuard实验室发现&#xff0c;这种先进的恶意框架是从臭名昭著的 Gh0strat 演变而来的&#xff0c;配备了模块化组件&#xff0c;可在受感染的设备上进行一系列恶意活动。 这些攻击已在游戏相关应用程序中发现&#xf…...

【Hutool系列】反射工具-ReflectUtil

前言 反射是 Java 中一种强大的机制&#xff0c;可以在运行时动态地获取类的信息并操作类的属性和方法。在 Java 中&#xff0c;通过反射可以获取和设置类的字段、调用类的方法、创建类的实例等。Java的反射机制&#xff0c;可以让语言变得更加灵活&#xff0c;对对象的操作也更…...

【操作系统专业课】第二次作业

第1题(进程同步与互斥) 使用二值信号量实现 n 个进程之间的互斥。 1. 定义一个二值信号量 mutex= 1。 二值信号量:二值信号量只有两种取值,0 (资源已被占用)和 1(资源可用)。 2. 进程进入临界区前的操作:每个进程在进入临界区之前,都需要执行 P(mutex) 操作。 P 操作…...

Scala的迭代器

1.对比foreach 它的优点在于&#xff1a; (1) 内存效率高。迭代器采用延迟计算的方式&#xff0c;它不会将整个集合加载到内存中&#xff0c;而是在每次调用next方法时才计算并返回下一个元素。 (2) 统一的遍历方法。迭代器为不同类型的集合&#xff08;如列表、集合、映射等…...

(RK3566驱动开发 - 1).pinctrl和gpio子系统

一.设备树 pinctrl部分可以参考 rockchip 官方的绑定文档 &#xff1a;kernel/Documentation/devicetree/bindings/pinctrl PIN_BANK&#xff1a;引脚所属的组 - 本次例程使用的是 GPIO3_A1 这个引脚&#xff0c;所以所属的组为 3&#xff1b; PIN_BANK_IDX&#xff1a;引脚的…...

css三角制作(二十课)

代码&#xff1a; <style>/* 边框原理 */.box1 {width: 0;height: 0;border-top: 100px solid pink;border-bottom: 100px solid blue;border-left: 100px solid yellow;border-right: 100px solid greenyellow;}/* 三角制作 */.box2 {width: 0;height: 0;border: 100px …...

C++_priority_queue(优先级队列)

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1. priority_queue的介绍和使用 priority_queue文档介绍 优先级队列的实现的关键…...

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备&#xff1a; 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…...

MySQL 的主从复制数据同步

一、什么是 MySQL 的主从复制 MySQL 的主从复制&#xff08;Master-Slave Replication&#xff09;是一种将数据从一个主数据库服务器&#xff08;主库&#xff09;复制到一个或多个从数据库服务器&#xff08;从库&#xff09;的技术。主库负责所有的数据写操作&#xff0c;从…...

python——面向对象

一、面向对象编程 1.1 面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1.1.1 面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃…...

Microsoft 365 Exchange如何设置可信发件IP白名单

1、 进入到 Microsoft 365 admin center 管理中心 &#xff0c;点击 管理中心 下的 安全 在弹出的新页面中&#xff0c;依次点击 策略和规则 – 威胁策略 – 反垃圾邮件 再单击 连接筛选器策略(默认) – 编辑连接筛选器策略 2、在 IP 允许列表 中添加可信邮件 IP 段&#xff0…...

LM27313典型电路之升压电路

下图为升压芯片LM27313典型电路图&#xff1a; 从图中可以看出&#xff1a;系统电压VSYS3.7伏&#xff0c;通过C26与C27两个滤波电容后&#xff0c;到达升压芯片的VIN输入脚pin5。 其中电源芯片的电压输出由下式子决定&#xff1a; VOUT1.23*(1R17/R21) 其中VOUT是图中的V5D…...

嵌入式面试八股文(七)·#ifndef#define#endif的作用、以及内存分区(全局区、堆区、栈区、代码区)

目录 1. 头文件中的#ifndef / #define / #endif的作用是什么&#xff1f; 2. 内存分区&#xff1a;全局区、堆区、栈区、代码区简单描述&#xff1f; 2.1 代码区&#xff08;Text Segment&#xff09;&#xff1a; 2.2 全局区&#xff08;Data Segment&#xff09;&…...

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…...

Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表

明白了,您这个补丁的功能是当设备屏幕关闭一段时间后,自动关闭 Wi-Fi 连接并清空多任务菜单。以下是更新后的博客内容,包含了对功能的详细解释和代码实现: 修改 PowerManagerService.java 以实现屏幕灭屏后关闭 Wi-Fi 和清空多任务菜单功能 在本篇博客中,我们将介绍一个针…...

Elasticsearch磁盘占用大于95%时将所有索引置为只读

在一个稳定运行的功能中,突然收到报错。经查明,是在向 Elasticsearch 中插入文档时出现了错误: AuthorizationException: AuthorizationException(403, ucluster_block_exception, ublocked by: [FORBIDDEN/12/index read-only / allow delete (api)];) 网上也有其他人报出类…...

删除 git config 保存的密码

要从 Git 中删除保存的密码&#xff0c;你可以根据你之前使用的保存方法来操作。以下是一些常见的方法来删除 Git 中保存的密码&#xff1a; 删除 credential.helper 中的密码 如果你之前使用 store 或 cache 作为 credential.helper&#xff0c;你可以执行以下步骤来删除保存…...

Springboot环境搭建详解

springboot学习视频记录&#xff1a; 笔记&#xff1a; a&#xff1a;Springboot maven常见依赖、配置文件笔记-CSDN博客 b&#xff1a;Springboot环境搭建详解-CSDN博客 day01 6&#xff1a;springboot的parent和starter依赖- a 7&#xff1a;启动类的位置配置- b 8&am…...

SpringCloud框架学习(第三部分:Resilience4j 与 Micrometer)

目录 九、CircuitBreaker断路器 1.前言&#xff08;Hystrix&#xff09; 2.服务雪崩 3.Circuit Breaker 4. Resilience4j 5.案例实战 &#xff08;1&#xff09;熔断&#xff08;服务熔断 服务降级&#xff09; Ⅰ. 按照 COUNT_BASED&#xff08;计数的滑动窗口&#xf…...

ReTerraForged终极指南:5步打造专业级Minecraft地形生成体验

ReTerraForged终极指南&#xff1a;5步打造专业级Minecraft地形生成体验 【免费下载链接】ReTerraForged TerraForged for modern MC versions 项目地址: https://gitcode.com/gh_mirrors/re/ReTerraForged ReTerraForged是一款专为现代Minecraft版本设计的革命性地形生…...

金属3D打印光束整形:两大路线正面PK

作为金属3D打印技术的最新发展&#xff0c;开展光束整形技术研究的企业越来越多&#xff0c;研发的进程也越来越深。3D打印技术参考注意到&#xff0c;国外由EOS引领该技术发展&#xff0c;同时还有Aconity3D和DMG Mori等行业领导者&#xff1b;在国内&#xff0c;铂力特、华曙…...

告别硬件依赖!用Qt和CanBusDevice库5分钟搭建你的软件ECU模拟器

告别硬件依赖&#xff01;用Qt和CanBusDevice库5分钟搭建你的软件ECU模拟器 在汽车电子开发领域&#xff0c;硬件依赖常常成为效率瓶颈。想象这样一个场景&#xff1a;凌晨两点&#xff0c;你的算法逻辑已经调试完毕&#xff0c;却因为缺少物理ECU设备而无法验证&#xff1b;或…...

影刀RPA跨境店群自动化实战:Python协同Chromium打破风控「垄断」的高并发调度系统架构

定了。彻底打破传统商业指纹浏览器的生态「垄断」与电商巨头风控体系的「底层封锁」&#xff0c;我们用一套完全“自主可控”的、基于 Python 深度协同的分布式微服务调度架构&#xff0c;重塑了跨境千店矩阵的自动化底座。 这几天&#xff0c;科技圈被“DeepSeek V4 首发华为…...

【AI】关于claude code长会话过程中逐渐遗忘给它提供的标准操作规范问题思考

问题 在使用claude code的时候&#xff0c;我发现&#xff0c;我提供了一系列的操作规范&#xff0c;比如代码编译&#xff0c;容器创建&#xff0c;资源初始化等标准化的操作规范&#xff0c;我让它按照规范执行操作。会话前期&#xff0c;它会严格执行&#xff0c;但是会话长…...

从“玄学”到科学:手把手教你用Python/SciPy设计有源巴特沃斯滤波器(告别手动解方程)

从“玄学”到科学&#xff1a;手把手教你用Python/SciPy设计有源巴特沃斯滤波器&#xff08;告别手动解方程&#xff09; 在电子工程领域&#xff0c;滤波器设计一直被视为兼具艺术与科学的复杂技艺。传统设计流程中&#xff0c;工程师需要反复查阅归一化表格、手动解算多项式方…...

NovelReader插件化扩展指南:如何添加新的翻页效果

NovelReader插件化扩展指南&#xff1a;如何添加新的翻页效果 【免费下载链接】NovelReader 仿照"任阅"的追书、看书的小说阅读器。重写"任阅"的代码&#xff0c;优化代码逻辑和代码结构&#xff0c;降低内存使用率。重写小说阅读器&#xff0c;支持网络阅…...

Linux GPIO框架深度解析:从用户空间到内核驱动的完整路径

1. 项目概述&#xff1a;为什么要在Linux下研究GPIO&#xff1f;搞嵌入式开发的朋友&#xff0c;对GPIO&#xff08;通用输入输出&#xff09;肯定不陌生。它就像芯片的“手脚”&#xff0c;负责最简单的电平控制和信号读取。在单片机时代&#xff0c;我们通常直接操作寄存器&a…...

统信UOS离线部署实战:手把手教你用yum缓存提取sshpass等软件包(附完整命令)

统信UOS离线部署全流程指南&#xff1a;从缓存提取到依赖解析 在高度安全隔离的内网环境中&#xff0c;统信UOS系统管理员常面临一个核心挑战&#xff1a;如何将联网环境获取的软件包完整迁移到离线机器。与常见的/var/cache/yum路径不同&#xff0c;统信UOS的缓存机制有其特殊…...

Tauri + GitHub Actions 自动化打包指南:如何为你的桌面应用配置跨平台自动更新

Tauri GitHub Actions 自动化打包与更新体系构建指南 当你的Tauri应用从开发阶段进入产品化阶段时&#xff0c;如何确保用户能够无缝获取最新功能和安全更新&#xff0c;成为影响产品体验的关键因素。本文将带你构建一个完整的自动化打包与更新体系&#xff0c;从签名机制到发…...