hive2.01+mysql5.5

本文详细介绍了如何在Linux环境下安装和配置Hive2.1版本,包括环境搭建、配置步骤及常见问题解决方法,特别是针对MySQL元数据存储的配置细节。

1.环境介绍:

root@hzl-ThinkPad-L460:~# hive --version
hive 2.0.1
Subversion git://reznor-mbp-2.local/Users/sergey/git/hivegit -r e3cfeebcefe9a19c5055afdcbb00646908340694
Compiled by sergey on Tue May 3 21:03:11 PDT 2016
From source with checksum 5a49522e4b572555dbbe5dd4773bc7c2
root@hzl-ThinkPad-L460:~# mysql -V;
mysql  Ver 14.14 Distrib 5.5.53, for debian-linux-gnu (x86_64) using    readline 6.3

2.安装hive
下载hive安装包,可以从 Apache 其中一个镜像站点中下载最新稳定版的 hive, apache-hive-2.1.0-bin.tar.gz。
解压安装hive,使用以下命令安装 hive:

sudo tar -xzvf apache-hive-2.1.0-bin.tar.gz    ##解压
sudo ln -s apache-hive-2.1.0-bin hive    ##创建软链接

3.设置 hive环境变量
编辑 .bashrc 文件, 在其中添加以下内容:

# hive Env
export hive_HOME=/root/app/hive
export PATH=$PATH:$hive_HOME/bin

使环境变量生效:

source .bashrc

4.配置hive
配置文件重命名,在运行 hive 之前需要使用以下命令修改配置文件:

cd /root/app/hive/conf
cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties

修改hive-env.sh
因为 hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:

export JAVA_HOME=/root/app/java    ##Java路径
export HADOOP_HOME=/root/app/hadoop   ##Hadoop安装路径
export hive_HOME=/root/app/hive    ##hive安装路径
export hive_CONF_DIR=/root/app/hive/conf    ##hive配置文件路径

修改hive-site.xml替换hive-site.xml文件中的 system:java.io.tmpdir {system:user.name}

  <property>
    <name>system:java.io.tmpdir</name>
    <value>/root/hive</value>
  </property>
  <property>
    <name>system:user.name</name>
    <value>root</value>
  </property>

配置hive Metastore
默认情况下, hive的元数据保存在了内嵌的 derby 数据库里, 但一般情况下生产环境使用 MySQL 来存放 hive 元数据。将 mysql-connector-java-5.1.39.jar 放入 $hive_HOME/lib 下。
hive-site.xml 中配置 MySQL 数据库连接信息

<property>
 <name>javax.jdo.option.ConnectionURL</name>
 <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=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>hive</value>
</property>
<property>
 <name>javax.jdo.option.ConnectionPassword</name>
 <value>hive</value>
</property>

为hive创建HDFS目录
在 hive 中创建表之前需要使用以下 HDFS 命令创建 /tmp 和 /user/hive/warehouse (hive-site.xml 配置文件中属性项 hive.metastore.warehouse.dir 的默认值) 目录并给它们赋写权限。

hdfs dfs -mkdir /tmp
hdfs dfs -mkdir /usr/hive/warehouse
hdfs dfs -chmod g+w /tmp
hdfs dfs -chmod g+w /usr/hive/warehouse

运行hive
在命令行运行 hive 命令时必须保证 HDFS 已经启动。可以使用 start-dfs.sh 来启动 HDFS。
从 hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。

schematool -dbType mysql -initSchema

要使用 hive CLI(hive command line interface), 可以在终端输入以下命令:

hive

问题总结

这里写图片描述

解决方案:将 $hive_HOME/lib 下 的 mysql-connector-java-6.0.3.jar 替换成 mysql-connector-java-5.1.39.jar。 原因分析:mysql-connector-java 6.x 版本 和 5.1.x 版本不兼容 , nullNamePatternMatchesAll 连接属性的默认值在 mysql-connector-java 5.1 和 6.0 之间发生了改变. 在 5.1 版本中默认值是 true, 而 6.0 版本中默认值是 false。可以参考文章 https://liquibase.jira.com/browse/CORE-2723

2.这里写图片描述

修改 system:java.io.tmpdir {system:user.name}

3.hive2.10和如上的mysql版本使用所有jdbc都不能成功load。

<think>我们有三台服务器,配置如下:服务器1:64核CPU,128G内存服务器2:32核CPU,64G内存服务器3:32核CPU,64G内存需求:构建离线数仓,数据来源为WebAPI和数据库拉取,组件为Hadoop+Hive+Spark+Zookeeper+Azkaban+Sqoop+Prometheus+Grafana+flume(WeBAPI接口采集数据)根据之前的部署方案,HiveMetastore部署在服务器1(64核/128G),而MySQL作为HiveMetastore的后端数据库,通常也会部署在同一台服务器(服务器1)以确保高性能访问。下面详细解释HiveMetastore与MySQL在离线数仓中的作用及配合方式:###HiveMetastore与MySQL的作用1.**HiveMetastore**:-**核心功能**:存储Hive的元数据,包括数据库、表、分区、列名、类型、表位置等。-**作用**:解耦元数据与计算引擎,使Spark、Presto等工具可以通过HiveMetastore访问元数据[^1][^2]。2.**MySQL**:-**角色**:作为HiveMetastore的后端存储数据库(替代默认的Derby)。-**优势**:-支持多会话并发访问(Derby仅支持单会话)。-高可靠性,避免元数据单点故障[^1][^2]。###在离线数仓中的配合流程```mermaidflowchartTBsubgraph服务器1[64核/128G]MySQL[(MySQL数据库)]-->Metastore[HiveMetastore服务]endHive[HiveCLI/Beeline]-->MetastoreSpark[SparkSQL]-->MetastoreSqoop[Sqoop]-->MetastoreFlink[Flink]-->MetastoreMetastore-->|读写元数据|MySQLHDFS[(HDFS)]-->|表数据存储|Metastore```1.**元数据存储**:-用户通过Hive或Spark创建表时,表结构(如字段类型、分区信息)写入MySQL。-表数据实际存储在HDFS,但路径信息记录在MySQL中[^2]。2.**查询流程**:-用户提交HiveQL查询→HiveServer2向Metastore请求表元数据→Metastore从MySQL读取→HiveServer2生成执行计划→YARN调度执行。3.**数据采集联动**:-**Sqoop导入**:将关系数据库数据导入Hive表时,Sqoop会:-通过Metastore创建Hive表结构(元数据存入MySQL)。-将数据文件写入HDFS对应路径。###关键配置示例1.**HiveMetastore连接MySQL**(`hive-site.xml`):```xml<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://server1:3306/hive_metastore?createDatabaseIfNotExist=true</value></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value></property><property><name>javax.jdo.option.ConnectionUserName</name><value>hive</value></property>```2.**MySQL高可用建议**:-在服务器3部署MySQL从节点,通过主从复制实现元数据备份:```sql--在服务器1(主)执行CREATEUSER'repl'@'server3'IDENTIFIEDBY'password';GRANTREPLICATIONSLAVEON*.*TO'repl'@'server3';```###性能优化策略1.**Metastore缓存**:-启用HiveMetastore服务缓存(减少MySQL查询压力):```xml<property><name>hive.metastore.cache.pinobjtypes</name><value>Table,Database,Partition</value></property>```2.**MySQL调参**:-增加连接池大小(适应多并发访问):```ini#/etc/my.cnf[mysqld]max_connections=500innodb_buffer_pool_size=4G#建议分配服务器1的20%内存```###数据仓库应用案例**拉链表实现**(使用HiveQL依赖Metastore的元数据管理)[^3]:```sql--创建拉链表(Metastore在MySQL中记录表结构)CREATETABLEdwd.user_behavior(user_idSTRING,behaviorSTRING,start_dateDATE,end_dateDATE)STOREDASORC;--使用增量更新数据合并(依赖Metastore定位分区)INSERTOVERWRITETABLEdwd.user_behaviorSELECTCOALESCE(a.user_id,b.user_id)ASuser_id,...FROMdwd.user_behavioraFULLOUTERJOINods.user_behavior_updatebONa.user_id=b.user_idANDa.end_date='9999-12-31';```###监控指标通过Prometheus监控Metastore和MySQL:```yaml#prometheus.yml配置示例-job_name:'mysql'static_configs:-targets:['server1:9104']#使用mysqld_exporter-job_name:'hive_metastore'static_configs:-targets:['server1:9083']#Metastore服务端口```###注意事项1.**版本兼容性**:HiveMySQL驱动包版本需匹配(例如Hive3.1.x使用MySQLConnector/J8.x)。2.**元数据备份**:每日备份MySQL中的`hive_metastore`数据库。3.**安全**:MySQL设置白名单(仅允许服务器1、2、3访问)。§§相关问题§§1.如何验证HiveMetastore与MySQL的连接是否正常?2.Hive表数量达到百万级时,如何优化Metastore性能?3.如何通过Grafana监控MySQL的元数据读写延迟?4.Sqoop导入时如何自动同步表结构到HiveMetastore?5.HiveonSpark场景中,Metastore配置有哪些特别注意项?</think>### Hive Metastore与MySQL在离线数仓中的作用及协作机制 #### 核心作用对比 | **组件** | **职责** | **存储位置** | **关键特性** | |------------------|-------------------------------------------------------------------------|-------------------|-----------------------------| | **Hive Metastore** | 管理元数据(表结构、分区信息、存储位置等) | 独立服务(部署在服务器1) | 提供统一元数据访问接口[^1] | | **MySQL** | 持久化存储Hive Metastore的元数据 | 数据库(部署在服务器1) | 关系型存储,支持ACID事务[^2] | #### 协作流程 ```mermaid flowchart TB subgraph 服务器1[64核/128G] MySQL[(MySQL数据库)] --> Metastore[Hive Metastore服务] end Hive[Hive CLI/Beeline] --> Metastore Spark[Spark SQL] --> Metastore Sqoop[Sqoop] -->|自动创建表| Metastore Metastore -->|读写元数据| MySQL HDFS[(HDFS)] -->|表数据存储| Metastore ``` 1. **元数据持久化** - 当通过Hive创建表时: ```sql CREATE TABLE user_logs (id STRING, dt STRING) PARTITIONED BY (date STRING) STORED AS PARQUET; ``` - Metastore将表结构、分区信息、HDFS路径等元数据写入MySQL数据库[^1][^2] - MySQL中的关键表: - `TBLS`(表信息) - `COLUMNS_V2`(字段定义) - `PARTITIONS`(分区信息) 2. **查询执行流程** 用户提交查询时的协作: ```mermaid sequenceDiagram 用户->>HiveServer2: SELECT COUNT(*) FROM user_logs 激活 HiveServer2 HiveServer2->>Metastore: 获取user_logs元数据 激活 Metastore Metastore->>MySQL: 查询表结构/分区位置 MySQL-->>Metastore: 返回元数据 Metastore-->>HiveServer2: 返回HDFS路径 HiveServer2->>YARN: 提交MapReduce/Spark任务 YARN->>HDFS: 读取实际数据 HDFS-->>YARN: 返回数据 YARN-->>HiveServer2: 返回结果 HiveServer2-->>用户: 显示结果数 ``` 3. **数据采集集成** - **Sqoop导入**时自动创建Hive表: ```bash sqoop import \ --connect jdbc:mysql://dbserver/sales \ --table orders \ --hive-import # 自动创建Hive表并写入元数据 ``` - **Spark SQL**直接读取Metastore元数据: ```scala val df = spark.sql("SELECT * FROM user_logs") // 通过Metastore获取表结构 ``` #### 关键优势 1. **元数据与数据分离** - 元数据存储在MySQL(关系型) - 实际数据存储在HDFS(分布式) - 实现计算与存储解耦[^2] 2. **多引擎共享** ```mermaid graph LR Metastore-->Hive Metastore-->Spark Metastore-->Presto Metastore-->Impala ``` 所有计算引擎通过统一接口访问元数据 3. **ACID保障** MySQL提供: - 事务完整性(如并发创建表) - 故障恢复能力(WAL日志) - 持久化存储(避免元数据丢失) #### 部署配置要点 在`hive-site.xml`中配置MySQL连接: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://server1:3306/metastore_db?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hiveuser</value> </property> ``` #### 典型应用场景 1. **拉链表实现** 依赖Metastore管理历史版本元数据[^3]: ```sql INSERT OVERWRITE TABLE dwd.user_behavior SELECT COALESCE(a.user_id, b.user_id) FROM dwd.user_behavior a FULL OUTER JOIN ods.user_behavior_update b ON a.user_id = b.user_id; ``` 2. **JSON数据解析** 利用Metastore存储复杂结构[^4]: ```sql CREATE TABLE logs (data STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'; ``` #### 性能优化建议 1. **MySQL配置** ```ini # my.cnf 优化 innodb_buffer_pool_size = 64G # 分配50%内存 max_connections = 1000 ``` 2. **Metastore缓存** ```xml <!-- hive-site.xml --> <property> <name>hive.metastore.cache.pinobjtypes</name> <value>Table,Database,Partition</value> </property> ``` 3. **连接池配置** ```xml <property> <name>hive.metastore.connection.pool.maxSize</name> <value>100</value> </property> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值