环境&背景:
Ambari2.6.2+HDP2.6.5
基础环境下,从ambari安装部署的hive的版本为1.2.1,而hdp2.6.5的官网支持包含着hive2.1.0
https://docs.cloudera.com/HDPDocuments/HDPforCloud/HDPforCloud-2.6.5/hdp-release-notes/content/hdp_comp_versions.html

目的:
将已经使用ambari安装的hive1.2.1版本升级到hive2.1.0版本,并且保证hive2.1.0.以及2.3.3被ambari正常管理。
两种方案:
注意:ambari进行的操作必须保证agent运行
方法一:
在ambari页面找到:

为hive2.1.0的连接,Interactive主要有 LLAP进行交互式查询,这是hive2的特性,这也证明着此当前为hive2.X的,但是有个问题就是metastore还是hive1.2.1。这个方法的优点是简单,方便,快捷。在ambair页面操作HiveServer2 Interactive即可管理hive2。
是否可能存在其他使用问题暂不明确。
其他:
Llap:这里选择禁用:


方法二:
更改环境变量:
在ambari停止hive metstore
确定2.1.0的目录后将2.1的环境变量配置:
export HIVE_HOME=/usr/hdp/2.6.5.0-292/hive2
export PATH=$PATH:$HIVE_HOME/bin
刷新环境变量,并hive --version 检查版本,确定版本为所替换的版本:
![]()
更换ambari-a脚本中配置地址:
登录机器找到:
/var/lib/ambari-agent/cache/common-services/HIVE/0.12.0.2.0/package/scripts
下的status_params.py:
解释:status_params.py
status_params.py 脚本通常包括以下功能:
获取服务状态:通过与 Hive 服务交互,确定服务是否正在运行。
参数设置:定义和获取与 Hive 服务状态相关的参数,这些参数可能会被 Ambari 用于展示状态或者进行健康检查。
集成:将 Hive 状态信息集成到 Ambari 的管理框架中,使管理员能够通过 Ambari UI 查看 Hive 的状态。
通过更改脚本中的参数达到ambari管理hive的目的:
参数主要都在92行,定位到此处,原始:

更改为:

解释:参数修改内容:
hive_etc_dir_prefix:Hive 配置文件的目录前缀,要改成以hive2为准的地址
hive_home_dir:hive的安装目录,以此更改为hive2的做到偷梁换柱
hive_conf_dir:hive配置文件
hive_client_conf_dir:指定 Hive 客户端配置文件的目录
hive_server_conf_dir是server的目录不需更改。
其中{stack_root}不用更改,代表安装了整个大数据堆栈的根目录
要更改的为{component_directory}为hive2(疑问,这个是ambari创建的目录还是说自己定义的?)
登录ambari启动hivemetastore
![]()
并到机器上检查mstastore版本
为hiveserver2指定hive2:
- 同样更新环境变量
- 复制status_params脚本到指定位置
- 停止hiveserver2原本的进程(hive1.2.1的)
- 删除原本连接,并创建软连接:

- Ambari启动hiveserver2,并到机器检查是否为2.1的hive
升级2.3.3版本:
为了适配hive on spark :
这里使用得spark2所以要看下版本适配:
https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started#space-menu-link-content

下载apache-hive-2.3.3-bin.tar.gz:
上传到地址下并解压如:

这里不要直接进行复制,会导致脚本执行与jar未替换ambari启动报错:

找到位置:


脚本:
验证脚本:
export HIVE_CONF_DIR=/usr/hdp/current/hive-metastore/conf/conf.server ; /usr/hdp/current/hive-server2-hive2/bin/schematool -initSchema -dbType mysql -userName hive -passWord hive -verbose
报错:说明脚本替换不完整,jar得软连接指向不对

将bin.lib.scripts.jdbc目录全部删除:
rm -rf bin/*\
...
将2.3.3下得copy到安装目录:
sudo cp -rvf /allinstall/apache-hive-2.3.3-bin/bin/* /usr/hdp/2.6.5.0-292/hive2/bin/
sudo cp -rvf /allinstall/apache-hive-2.3.3-bin/jdbc/* /usr/hdp/2.6.5.0-292/hive2/jdbc/
sudo cp -rvf /allinstall/apache-hive-2.3.3-bin/lib/* /usr/hdp/2.6.5.0-292/hive2/lib/
sudo cp -rvf /allinstall/apache-hive-2.3.3-bin/scripts/* /usr/hdp/2.6.5.0-292/hive2/scripts/
创建软连接脚本:
更改软连接脚本
编码设置:
sed -i 's/\r$//'脚本.sh
执行后到ambari执行启动:

同理更改hiveserver2也是同样得操作:
![]()

每个操作前将更改的在ambari上stop再操作
其他问题:

- Hive2的目录ambari自己定义创建的?
是的
- hive-client和hive-matestore的软连接不需要改么?

读取的环境变量?
需要。下面得告警是要改的
而metastore启动没改是因为实际读的还是hive1的配置

解决Instance Response告警问题:
把/usr/hdp/current/下得软连接包括hive-client,hive-metastore改为指向hive2:

测试mr和tez:
su hive
beeline -u "jdbc:hive2://slave01.example.com:2181,slave02.example.com:2181,slave03.example.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"
mr没问题,主要是tez
替换tez包
替换hdfs上的tez包:
找不到缺失的文件,补充过去:
cp /usr/hdp/2.6.5.0-292/hive2_backup/beeline.distro /usr/hdp/2.6.5.0-292/hive2/bin/
mr没有问题,tez版本不匹配,需要更改

官网hive源码:
查看Hive源码:https://github.com/apache/hive/blob/rel/release-2.3.3/pom.xml下的pom文件

Hive:http://hive.apache.org/downloads.html
Tez:http://tez.apache.org/releases/apache-tez-0-8-4.html
将旧的版本保存到,命令如下图
hadoop fs -get /hdp/apps/2.6.5.0-292/tez_hive2/tez.tar.gz /allinstall/
解压:apache-tez-0.8.4-bin.tar.gz
进入 tez 目录,上传tez目录下的 share/tez.tar.gz 到 hdfs 上(备份旧的删掉原来的,并且注意权限保持一致)

hadoop fs -mkdir /hdp/apps/2.6.5.0-292/tez/
hadoop fs -put tez.tar.gz /hdp/apps/2.6.5.0-292/tez/

到ambari下更改hive的配置:

替换服务器机器上的tez包:
将得到的包下的
/allinstall/apache-tez-0.8.4-bin/* 替换到所有安装tezclient的机器上
/usr/hdp/2.6.5.0-292/tez下
并且创建软连接:conf -> /etc/tez/2.6.5.0-292/0(可以使用ansible统一一次性创建)
重启hive和hiveserver2
beeline -u "jdbc:hive2://slave01.example.com:2181,slave02.example.com:2181,slave03.example.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2" -n hive -p hive
SELECT e.name, e.department, e.salary FROM employees e JOIN (SELECT MAX(salary) AS max_salary FROM employees) AS max_emp ON e.salary = max_emp.max_salary;
权限要改
hadoop fs -chmod -R 777 /hdp/apps/2.6.5.0-292/tez_hive2/
hadoop fs -chown -R hdfs:hadoop /hdp/apps/2.6.5.0-292/tez


查看安装目录是否包含ATSV15HistoryLoggingService:
grep -r ATSV15HistoryLoggingService
缺失包:
tez-yarn-timeline-history-with-fs-0.8.4.2.6.5.0-292.jar
tez-yarn-timeline-cache-plugin-0.8.4.2.6.5.0-292.jar
此为补充完的包:
将这两个缺失的包也放到hdfs中(单独拿share中的把包添加进去-这个暂时没有替换也是可以的,说明类没用到多出来的那两个包?)
替换后重启尝试,依旧报错:

Ambair检查环境变量,配置:
更改yarn的内容:

扩展内容:
- **故障转移方式**:
- `ConfiguredRMFailoverProxyProvider`: 同步故障转移,按顺序尝试资源管理器。
- `RequestHedgingRMFailoverProxyProvider`: 并行请求,减少请求延迟。
- **使用场景**:
- `ConfiguredRMFailoverProxyProvider`: 适合于需要严格一致性的情况。
- `RequestHedgingRMFailoverProxyProvider`: 适合于需要快速响应和高可用性的情况。
tez配置:

tez.history.logging.service.class 是 Apache Tez 中的一个配置属性,用于指定 Tez 历史日志记录服务的实现类,两个类只是针对不同版本的:yarn.timeline-service.version根据这个配置
tez.am.acls.enabled:权限控制 ,没必要关闭
tez.use.cluster.hadoop-libs:是否使用hadoop集群库, 使用集群库可以减少作业提交时的资源占用(因为不需要将库打包到每个作业中)
这这块我不明白,显示的1.5版本但是不能用15的,而且我没找到生产机器关于tez的配置是哪个?而且这些运行的大小配置改的合适么,现网的脚本很多,这个大小我担心不行,应该也要调整的吧,默认不是更好么
替换hive包:
在hive目录下创建extlib目录用来存放扩展包(并在脚本充补充环境配置(见hive配置)):
这里是整个的hive目录下的内容:
d

Hive配置:
tez目录统一一致
脚本中添加环境变量
export HADOOP_HOME=${HADOOP_HOME:-/usr/hdp/2.6.5.0-292/hadoop}
export HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-/usr/hdp/2.6.5.0-292/hadoop-mapreduce}
export HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-/usr/hdp/2.6.5.0-292/hadoop-yarn}
export HADOOP_LIBEXEC_DIR=${HADOOP_HOME}/libexec
export HIVE_AUX_JARS_PATH=/usr/hdp/2.6.5.0-292/hive2/extlib
尤其注意: HIVE_AUX_JARS_PATH 相当于对与hive增加一个三方扩展库。(具体所需包在上边的hive包中)
问题定位:
运行脚本例如:
beeline -u "jdbc:hive2://slave01.example.com:2181,slave02.example.com:2181,slave03.example.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2" -n hive
SELECT e.name, e.department, e.salary FROM employees e JOIN (SELECT MAX(salary) AS max_salary FROM employees) AS max_emp ON e.salary = max_emp.max_salary;
打开(基本流程)
http://x.x.x.x:8088/cluster/apps


?user.name=<用户名>


其他问题:

我平台连接时候写的hive地址是hiveserver2的,说明hive这个25005的端口也就是hiveserver2的ha地址,然后生成的我看了下一共有2个hiveserver2分别不住两台机器,
![]()
这个ha。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_41546244/article/details/169266095



