Hadoop学习笔记(HDP)-Part.15 安装HIVE

本文详细介绍了如何在Hadoop平台上安装和配置Hive,包括MetaStore的配置、安装过程、高可用性设置、Ranger授权以及使用Beeline进行远程连接和性能测试。还探讨了常见错误处理方法。

目录
Part.01 关于HDP
Part.02 核心组件原理
Part.03 资源规划
Part.04 基础环境配置
Part.05 Yum源配置
Part.06 安装OracleJDK
Part.07 安装MySQL
Part.08 部署Ambari集群
Part.09 安装OpenLDAP
Part.10 创建集群
Part.11 安装Kerberos
Part.12 安装HDFS
Part.13 安装Ranger
Part.14 安装YARN+MR
Part.15 安装HIVE
Part.16 安装HBase
Part.17 安装Spark2
Part.18 安装Flink
Part.19 安装Kafka
Part.20 安装Flume

十五、安装HIVE

1.配置MetaStore

利用ambari创建的MySQL作为MetaStore,创建用户hive及数据库hive

mysql -uroot -p
CREATE DATABASE hive;
CREATE USER 'hive'@'%' IDENTIFIED BY 'lnyd@LNsy115';
GRANT ALL ON hive.* TO 'hive'@'%';
FLUSH PRIVILEGES;

2.安装

在服务中添加Hive
在这里插入图片描述
安装hive时需要同步安装Tez
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DATABASE
Hive Database:Existing MySQL / MariaDB
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成后,需要按照提示将hdfs、yarn等服务进行重启。
Ambari安装后,Hive使用了Tez作为计算引擎,也可以修改为MR或Spark,在配置文件中调整,/usr/hdp/3.1.5.0-152/hive/conf/hive-site.xml

   <property>
      <name>hive.execution.engine</name>
      <value>tez</value>
    </property>

3.高可用

(1)MetaSore HA

ACTIONS->Add Hive Metastore
在这里插入图片描述
在这里插入图片描述
重启相关服务后完成HA启用。
在这里插入图片描述

(2)HiveServer2 HA

ACTIONS->Add HiveServer2
在这里插入图片描述
在这里插入图片描述
重启HIVE和Tez服务后完成HA启用。
在这里插入图片描述

4.Ranger授权

在Ranger上新建策略完成对租户的授权
在这里插入图片描述
在这里插入图片描述
权限策略可以精细到列

5.常用指令

(1)CLI连接

类似于mysql的命令行工具,但是只能操作本地的Hive服务,无法通过JDBC连接远程服务,且sql执行结果没有格式化,看起来不是很直观。
先用keytab登录,使用hive客户端进入

kinit -kt /etc/security/keytabs/hive.service.keytab hive/hdp01.hdp.com@HDP315.COM
hive

在这里插入图片描述
可以设置一些基本参数,让hive使用起来更便捷:
让提示符显示当前库

set hive.cli.print.current.db=true;

显示查询结果时显示字段名称

set hive.cli.print.header=true;

设置只对当前会话有效,重启hive会话后就失效。
创建测试数据库test_hive_db

create database test_hive_db;

在这里插入图片描述
查看数据库的信息

desc database test_hive_db;

在这里插入图片描述
从输出结果看,测试数据库test_hive_db存储在hdfs上,位置为hdfs://hdp315/warehouse/tablespace/managed/hive/test_hive_db.db

(2)Beeline连接

HiveServer2支持一个新的命令行Shell,称为:Beeline,后续将会使用Beeline替代Hive CLI。Beeline基于SQLLine CLI的JDBC客户端。Hive CLI和Beeline都属于命令行操作模式,主要区别是Hive CLI只能操作本地的Hive服务,而Beeline可以通过JDBC连接远程服务。
开启了kerberos认证的hadoop集群,hive默认使用kerberos认证。先以hive/hdp01.hdp.com@HDP315.COM身份登录,创建数据库hive_db_tenant1和tenant2、表hive_table_tenant1和hive_table_tenant2,在ranger上分别将两个租户赋权到对应的数据库上,然后以tenant1身份连接,分别尝试连接两个数据库,看是否有权限访问

kinit -kt /etc/security/keytabs/hive.service.keytab hive/hdp01.hdp.com@HDP315.COM
beeline -u 'jdbc:hive2://hdp01.hdp.com:2181,hdp02.hdp.com:2181,hdp03.hdp.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/hdp01.hdp.com@HDP315.COM'
create database hive_db_tenant1;
create database hive_db_tenant2;
create table hive_db_tenant1.hive_table_tenant1 (id int,name string,address string,phone string);
create table hive_db_tenant2.hive_table_tenant2 (id int,name string,address string,phone string);
kdestroy
kinit -kt /root/keytab/tenant1.keytab tenant1
beeline -u 'jdbc:hive2://hdp01.hdp.com:2181,hdp02.hdp.com:2181,hdp03.hdp.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/hdp01.hdp.com@HDP315.COM'
describe hive_db_tenant1.hive_table_tenant1;
describe hive_db_tenant2.hive_table_tenant2;

在这里插入图片描述
从结果看,无法访问hive_table_tenant2的表。

(3)导入数据等测试

生成6GB大小的文件

#!/bin/bash
cat /dev/null  > /root/bigFile.txt
for((i=1;i<=100000000;i++));
do
  echo "$i,testname$i,testaddress$i,testphonenumber$i" >> /root/bigFile.txt;
done

本次测试使用tenant1

kinit -kt /root/keytab/tenant1.keytab tenant1
hdfs dfs -put /root/bigFile.txt /testhdfs/tenant1
beeline -u 'jdbc:hive2://hdp01.hdp.com:2181,hdp02.hdp.com:2181,hdp03.hdp.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;principal=hive/hdp01.hdp.com@HDP315.COM'
set tez.queue.name=tenant1;

① 导入测试
测试一次性导入和切分导入的性能
新建表,用于一次性导入

CREATE TABLE `test_tenant1_one`(
`id` int,
`name` string, 
`address` string, 
`phone` string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE
LOCATION 'hdfs://hdp315/testhdfs/tenant1/test_tenant1_one.db';

执行导入

LOAD DATA INPATH 'hdfs://hdp315/testhdfs/tenant1/bigFile.txt' INTO TABLE hive_db_tenant1.test_tenant1_one;

在这里插入图片描述
新建表,用于分桶导入,分桶的实质就是对分桶的字段做了hash,然后存放到对应文件中,所以说如果原有数据没有按key hash,需要在插入分桶的时候hash,也就是说向分桶表中插入数据的时候必然要执行一次MAPREDUCE,这也就是分桶表的数据基本只能通过从结果集查询插入的方式进行导入

CREATE TABLE `test_tenant1_bucket`(
`id` int,
`name` string, 
`address` string, 
`phone` string
)
CLUSTERED BY(id) INTO 16 buckets 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'hdfs://hdp315/testhdfs/tenant1/test_tenant1_bucket.db';

执行导入

INSERT OVERWRITE TABLE test_tenant1_bucket SELECT * FROM test_tenant1_one;

在这里插入图片描述
此时,分桶后的文件会分成16个分片
在这里插入图片描述
② 查询测试
对测试的数据库进行查询操作

SELECT SUM(id) FROM hive_db_tenant1.test_tenant1_bucket;

在这里插入图片描述

6.常见报错

(1)提示没有权限调用default队列

Select查询不报错,但count、insert、load等操作需要调用tez引擎时会报错
报错信息:

ERROR : Job Submission failed with exception 'java.io.IOException(org.apache.hadoop.yarn.exceptions.YarnException: org.apache.hadoop.security.AccessControlException: User hive does not have permission to submit application_1678378182198_0002 to queue default

在这里插入图片描述
默认调用的是default队列,需要手工指定使用的队列
mr指定队列:

set mapreduce.job.queuename=tenant1;

tez指定队列:

set tez.queue.name=tenant1;
[root@hadoop01 ~]# ps -ef | grep HiveServer2 | grep -v grep root 15604 11956 6 22:32 pts/1 00:00:58 /export/servers/jdk1.8.0_161/bin/java -Dproc_jar -Dorg.slf4j.simpleLogger.defaultLogLevel=info -Dproc_hiveserver2 -Dlog4j2.formatMsgNoLookups=true -Dlog4j.configurationFile=hive-log4j2.properties -Djava.util.logging.config.file=/export/servers/apache-hive-3.1.3-bin/conf/parquet-logging.properties -Dyarn.log.dir=/export/servers/hadoop-3.3.5/logs -Dyarn.log.file=hadoop.log -Dyarn.home.dir=/export/servers/hadoop-3.3.5 -Dyarn.root.logger=INFO,console -Djava.library.path=/export/servers/hadoop-3.3.5/lib/native -Xmx256m -Dhadoop.log.dir=/export/servers/hadoop-3.3.5/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/export/servers/hadoop-3.3.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /export/servers/apache-hive-3.1.3-bin/lib/hive-service-3.1.3.jar org.apache.hive.service.server.HiveServer2 root 15828 10065 2 22:35 pts/0 00:00:15 /export/servers/jdk1.8.0_161/bin/java -Dproc_jar -Dorg.slf4j.simpleLogger.defaultLogLevel=info -Dproc_hiveserver2 -Dlog4j2.formatMsgNoLookups=true -Dlog4j.configurationFile=hive-log4j2.properties -Djava.util.logging.config.file=/export/servers/apache-hive-3.1.3-bin/conf/parquet-logging.properties -Dyarn.log.dir=/export/servers/hadoop-3.3.5/logs -Dyarn.log.file=hadoop.log -Dyarn.home.dir=/export/servers/hadoop-3.3.5 -Dyarn.root.logger=INFO,console -Djava.library.path=/export/servers/hadoop-3.3.5/lib/native -Xmx256m -Dhadoop.log.dir=/export/servers/hadoop-3.3.5/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/export/servers/hadoop-3.3.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /export/servers/apache-hive-3.1.3-bin/lib/hive-service-3.1.3.jar org.apache.hive.service.server.HiveServer2 root 16374 11956 14 22:41 pts/1 00:00:59 /export/servers/jdk1.8.0_161/bin/java -Dproc_jar -Dorg.slf4j.simpleLogger.defaultLogLevel=info -Dproc_hiveserver2 -Dlog4j2.formatMsgNoLookups=true -Dlog4j.configurationFile=hive-log4j2.properties -Djava.util.logging.config.file=/export/servers/apache-hive-3.1.3-bin/conf/parquet-logging.properties -Djline.terminal=jline.UnsupportedTerminal -Dyarn.log.dir=/export/servers/hadoop-3.3.5/logs -Dyarn.log.file=hadoop.log -Dyarn.home.dir=/export/servers/hadoop-3.3.5 -Dyarn.root.logger=INFO,console -Djava.library.path=/export/servers/hadoop-3.3.5/lib/native -Xmx256m -Dhadoop.log.dir=/export/servers/hadoop-3.3.5/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/export/servers/hadoop-3.3.5 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Dhadoop.policy.file=hadoop-policy.xml -Dhadoop.security.logger=INFO,NullAppender org.apache.hadoop.util.RunJar /export/servers/apache-hive-3.1.3-bin/lib/hive-service-3.1.3.jar org.apache.hive.service.server.HiveServer2 [root@hadoop01 ~]# [root@hadoop01 ~]# # 检查端口监听状态 (10000/10001) [root@hadoop01 ~]# sudo netstat -tulnp | grep -E '10000|10001' tcp6 0 0 :::10001 :::* LISTEN 16374/java [root@hadoop01 ~]#
06-18
<think>我们面临的核心问题是:HiveServer2端口监听异常和Beeline连接失败。具体表现为:-端口10001监听正常,可通过`jdbc:hive2://localhost:10001`连接-端口10000未监听,且`jdbc:hadoop01://hadoop01:10000`连接失败(注意:这里连接字符串格式错误)根据引用[1]的说明,HiveServer2的默认端口是10000,且绑定主机默认为localhost。但用户配置中显示10001端口监听正常,而10000端口未监听,说明可能有两个问题:1.10000端口的服务未启动或启动失败2.10000端口的服务绑定到了其他主机(如localhost)导致外部无法访问同时,用户尝试连接10000端口时使用了错误的JDBCURL格式:`jdbc:hadoop01://hadoop01:10000`,正确格式应为`jdbc:hive2://hadoop01:10000`。因此,解决方案分为两部分:A.修复10000端口的监听问题B.使用正确的JDBCURL格式具体步骤:###A.修复HiveServer210000端口监听问题####1.检查HiveServer2配置关键配置项(位于`hive-site.xml`):-`hive.server2.thrift.port`:指定监听端口(默认10000)-`hive.server2.thrift.bind.host`:指定绑定的主机(默认为localhost,需改为0.0.0.0或具体IP)查看当前配置:```bash#进入Hive配置目录,查看hive-site.xmlcd$HIVE_HOME/confgrep-A1'hive.server2.thrift.port'hive-site.xmlgrep-A1'hive.server2.thrift.bind.host'hive-site.xml```若未配置`hive.server2.thrift.bind.host`或配置为localhost,则外部无法访问。需要修改为服务器IP或0.0.0.0(不推荐,存在安全风险)。修改配置示例(在hive-site.xml中添加或修改):```xml<property><name>hive.server2.thrift.port</name><value>10000</value></property><property><name>hive.server2.thrift.bind.host</name><value>hadoop01</value><!--或具体IP,如192.168.xxx.xxx--></property>```####2.重启HiveServer2服务先停止原有进程(注意:用户已有多个HiveServer2进程,可能是重复启动):```bash#查找所有HiveServer2进程ps-ef|grepHiveServer2|grep-vgrep|awk'{print$2}'|xargskill-9```然后重新启动:```bash#启动HiveServer2(确保使用修改后的配置)hive--servicehiveserver2&```####3.验证端口监听```bashnetstat-tuln|grep10000```期望输出:```bashtcp600:::10000:::*LISTEN```如果仍然没有监听,检查日志(位于`/tmp/root/hive.log`或配置的日志目录)排查启动错误。###B.使用正确的JDBCURL连接用户之前的错误连接字符串:`jdbc:hadoop01://hadoop01:10000`,正确格式应为:```bashbeeline-u"jdbc:hive2://hadoop01:10000"```注意:`hadoop01`必须是网络中可解析的主机名(或使用IP地址),且防火墙允许10000端口(之前已确认FirewallD未运行,故无需额外配置)。###C.10001端口与10000端口的关系根据用户环境,10001端口已经正常监听,且可以通过localhost连接。这说明可能有两个HiveServer2实例分别运行在10000和10001端口?但用户实际只有一个服务在运行(从进程数量看有多个,可能是重复启动)。建议:统一使用一个端口(如10000),并确保配置正确。###D.连接测试使用正确格式的URL连接10000端口:```bashbeeline-u"jdbc:hive2://hadoop01:10000"```如果连接失败,检查:-服务端日志(HiveServer2启动日志)-网络连通性(从客户端到服务器10000端口):`telnethadoop0110000`-服务器防火墙(虽然之前显示未运行,但需确认)###总结步骤1.**修改配置**:将`hive.server2.thrift.bind.host`设置为服务器IP(非localhost),端口按需设置(10000)。2.**重启服务**:先杀掉所有HiveServer2进程,再启动一个实例。3.**验证监听**:使用`netstat`确认端口监听在正确的主机和端口。4.**正确连接**:使用`jdbc:hive2://hadoop01:10000`格式连接。###附加说明:多个HiveServer2进程问题用户通过`ps-ef|grepHiveServer2`查看到多个进程,这可能是重复启动导致。确保只启动一个HiveServer2服务,否则会造成端口冲突。建议:使用服务管理脚本或进程管理工具(如`nohup`)来启动和停止服务。###相关问题1.如何配置HiveServer2的高可用?2.HiveServer2的日志文件在哪里查看?3.如何为HiveServer2配置Kerberos认证?4.Beeline连接时出现"User:rootisnotallowed"错误如何解决?5.如何优化HiveServer2的并发性能?引用说明:[^1]:HiveServer2的端口和绑定主机配置说明</think>### 排查与解决 HiveServer2 端口监听及 Beeline 连接问题 #### 1. **端口监听异常分析** 根据您的日志显示: - 端口 10001 正常监听:`tcp6 :::10001 :::* LISTEN` - 端口 10000 **未监听**(`netstat` 无输出) - 存在多个 HiveServer2 进程(PID 15604, 15828, 16374),可能导致端口冲突 **根本原因**: HiveServer2 默认监听 10000 端口,但您的配置可能被修改为 10001(引用[1])。多个进程竞争同一端口会导致监听异常。 #### 2. **Beeline 连接失败原因** - ✅ `jdbc:hive2://localhost:10001` 成功: 连接的是本机 10001 端口(HiveServer2 实际监听端口) - ❌ `jdbc:hadoop01://hadoop01:10000` 失败: - **协议错误**:JDBC URL 格式应为 `jdbc:hive2://` 而非 `jdbc:hadoop01://` - **端口错误**:10000 端口未监听 - **主机名解析问题**:`hadoop01` 可能未正确解析为 IP #### 3. **解决方案** ##### 步骤 1:统一 HiveServer2 端口配置 修改 `hive-site.xml` 确保端口一致: ```xml <!-- 强制指定端口为10000 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> <!-- 统一使用10000 --> </property> <!-- 绑定服务器真实IP(非localhost) --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop01</value> <!-- 或服务器实际IP --> </property> ``` ##### 步骤 2:终止冲突进程并重启服务 ```bash # 终止所有HiveServer2进程 pkill -f HiveServer2 # 单实例启动HiveServer2(避免端口冲突) hive --service hiveserver2 \ --hiveconf hive.server2.thrift.port=10000 \ --hiveconf hive.server2.thrift.bind.host=hadoop01 & ``` ##### 步骤 3:验证端口监听 ```bash netstat -tuln | grep -E '10000|10001' ``` 期望输出: `tcp6 0 0 :::10000 :::* LISTEN` ##### 步骤 4:使用正确的 JDBC URL 连接 ```bash # 连接10000端口(协议+主机名+端口) beeline -u "jdbc:hive2://hadoop01:10000" # 或直接使用IP(避免DNS问题) beeline -u "jdbc:hive2://192.168.xxx.xxx:10000" ``` #### 4. **关键配置说明** | 配置项 | 推荐值 | 作用 | |--------|--------|------| | `hive.server2.thrift.port` | 10000 | 统一服务端口 | | `hive.server2.thrift.bind.host` | hadoop01 | 绑定服务器主机名 | | `hive.metastore.uris` | thrift://hadoop01:9083 | Metastore 服务地址 | #### 5. **连接成功验证** ```bash [root@hadoop01 ~]# beeline -u "jdbc:hive2://hadoop01:10000" Connecting to jdbc:hive2://hadoop01:10000 Connected to: Apache Hive (version 3.1.3) Driver: Hive JDBC (version 3.1.3) 0: jdbc:hive2://hadoop01:10000> SHOW DATABASES; +----------------+ | database_name | +----------------+ | default | +----------------+ ``` ### 相关问题 1. HiveServer2 如何配置高可用(HA)模式? 2. Beeline 连接时出现 "Authentication Error" 如何解决? 3. 如何优化 HiveServer2 的线程池参数(如 `hive.server2.thrift.max.worker.threads`)?[^1] 4. 防火墙未运行(FirewallD not running)是否存在安全风险? 5. 如何通过 HiveServer2 日志定位连接失败的根本原因? [^1]: HiveServer2 的线程池配置参数说明 [^2]: SLF4J 绑定冲突可能导致日志记录异常 [^3]: HDFS 配置文件路径需在 Hive 中正确引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这啥名啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值