[Hive]五、Hive 源码编译

G:\Bigdata\2.hive\大数据技术之Hive源码编译

Hadoop3.3.1
Hive3.1.3
Spark3.3.1
Hive on spark / spark on hive 均验证通过。

1章 部署Hadoop和Hive

1.1 版本测试

Hadoop3.3.6 和Hive3.1.3

运行hive客户端时报错:

java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

查看Hadoop在Github上的pom依赖,在hadoop-project模块中: 

hadoop/hadoop-project/pom.xml at rel/release-3.3.6 · apache/hadoop · GitHub

查看Hive的Guava依赖:

hive/pom.xml at rel/release-3.1.3 · apache/hive · GitHub

Hadoop启动后调用了guava-27中的一些方法,而Hive在启动时,它的JVM中加载的是guava-19这个版本,而这版本中就没有这个方法。

2章 Hadoop和Hive的兼容性问题

2.1 问题原因

上述问题是由Hadoop3.1.3版本所依赖的guava-27.0-jre和Hive-3.1.3版本所依赖的guava-19.0不兼容所致。

2.2 解决思路

1)更换Hadoop版本 

        经过观察发现,Hadoop-3.1.0,Hadoop-3.1.1,Hadoop-3.1.2版本的guava依赖均为guava-11.0.2,而到了Hadoop-3.1.3版本,guava依赖的版本突然升级到了guava-27.0-jre。
        Hive-3的所有发行版本的guava依赖均为guava-19.0。而guava-19.0和guava-11.0.2版本是兼容的,所以理论上降低Hadoop版本,这个问题就能得到有效的解决。

通过对github上源码的提交记录,可以找到跟guava相关的信息:branch 选择Hadoop rel/3.1.3

找到hadoop-project的pom.xml, 点击history,搜索guava

点进去之后发现这个升级跟guava的漏洞CVE-018-10237有关:

继续搜索这个漏洞的详细信息,发现里面描述的这个guava漏洞从guava11.0 一直到guava-24版本都存在,因此Hadoop才从3.1.3一下子升级到guava-27. 

2)升级Hive-3.1.3中的guava依赖版本,并重新编译Hive

        若将Hive-3.1.3中的guava依赖版本升级到guava-27.0-jre,这样就能避免不同版本的guava依赖冲突,上述问题同样能得到解决。

2.3 解决实操

        此处,我们选择升级Hive-3.1.3中的guava依赖版本,所以我们需要拉取Hive源码进行修改并重新编译。由于Hive源码的编译工作需要在Linux系统中进行,同时我们需要修改Hive的源码,所以我们需要一个合适的操作环境。

2.3.1 搭建编译环境

1)虚拟机准备

        准备一台虚拟机,并安装Centos7.9系统(带桌面环境)。

2)安装JDK

(1)卸载现有JDK

[seven@hadoop100 opt]# sudo rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps

ubuntu写作Java:

1. 确定已安装的Java版本:首先要确定系统默认安装的Java版本。可以使用以下命令检查系统中已安装的Java版本:   
   ```bash
   java -version
   ```

2. 卸载Java:根据系统中已安装的Java版本,选择对应的命令进行卸载。

   - 如果系统中是 OpenJDK,请使用以下命令卸载:

     ```
     sudo apt-get remove openjdk-\*
     ```

   - 如果系统中是 Oracle Java,请使用以下命令卸载:

     ```bash
     sudo apt-get remove --purge oracle-java\*
     ```

3. 清除残留文件:除了执行卸载命令之外,你也可以运行以下命令来清理残留文件:

   ```bash
   sudo apt-get autoremove
   ```

4. 验证卸载:最后,你可以再次运行 `java -version` 命令来确认Java已被成功卸载。

请注意,在卸载Java之前,请确保你不再需要系统自带的Java,并且可以自行安装其他版本的Java或者 OpenJDK。

(2)将JDK上传虚拟机的/opt/software文件夹下面

(3)解压JDK到/opt/module目录下

[seven@hadoop100 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

(4)配置JDK环境变量

1 新建/etc/profile.d/my_env.sh文件

[seven@hadoop100 module]# sudo vim /etc/profile.d/my_env.sh

添加如下内容,然后保存(:wq)退出

#JAVA_HOME

export JAVA_HOME=/opt/module/jdk1.8.0_212

export PATH=$PATH:$JAVA_HOME/bin

2 让环境变量生效

[seven@hadoop100 software]$ source /etc/profile.d/my_env.sh

(5)测试JDK是否安装成功

[seven@hadoop100 module]# java -version

        如果能看到以下结果,则Java正常安装

        java version "1.8.0_212"

3)安装Maven

(1)将Maven安装包上传到虚拟机/opt/software目录

(2)解压Maven到/opt/module目录下

[seven@hadoop100 software]$ tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/module/

(3)配置Maven环境变量

        1 编辑/etc/profile.d/my_env.sh文件

        [seven@hadoop100 module]$ sudo vim /etc/profile.d/my_env.sh

        追加以下内容

# MAVEN_HOME

export MAVEN_HOME=/opt/module/apache-maven-3.6.3

export PATH=$PATH:$MAVEN_HOME/bin

        2 让环境变量生效

[seven@hadoop100 software]$ source /etc/profile.d/my_env.sh

(4)检测Maven是否安装成功

[seven@hadoop100 module]$ mvn -version

如果能看到以下结果,则Maven正常安装

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)

Maven home: /opt/module/apache-maven-3.6.3

Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /opt/module/jdk1.8.0_212/jre

Default locale: zh_CN, platform encoding: UTF-8

OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

(5)配置仓库镜像

1 修改Maven配置文件

[seven@hadoop100 ~]$ vim /opt/module/apache-maven-3.6.3/conf/settings.xml

2 在<mirrors></mirrors>节点中增加以下内容     

<mirror>

    <id>aliyunmaven</id>

    <mirrorOf>central</mirrorOf>

    <name>阿里云公共仓库</name>

    <url>https://maven.aliyun.com/repository/public</url>

</mirror>

4)安装Git

(1)安装第三方仓库

[seven@hadoop100 ~]$ sudo yum install https://repo.ius.io/ius-release-el7.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

(2)安装Git

[seven@hadoop100 ~]$ sudo yum install -y git236

5)安装IDEA

(1)将IDEA安装包上传到虚拟机/opt/software目录

(2)解压IDEA到/opt/module目录下

[seven@hadoop100 software]$ tar -zxvf ideaIU-2021.1.3.tar.gz -C /opt/module/

(3)启动IDEA(在图形化界面启动)

[seven@hadoop100 ~]$ nohup /opt/module/idea-IU-211.7628.21/bin/idea.sh 1>/dev/null 2>&1 &

(4)配置Maven

2.3.2 修改并编译Hive源码

1)在IDEA中新建项目拉取Hive源码

Hive源码的远程仓库地址:

https://github.com/apache/hive.git

国内镜像地址:

hive: Hive是一个基于Hadoop的数据仓库平台

2)测试编译环境

        在修改依赖和代码之前,先测试一下打包是否能成功,用来检测环境是否正常。

        LanguageManual - Apache Hive - Apache Software Foundation

        在hive的UserMannual中找到编译相关的信息:

        

        

        mvn clean package -Pdist [-DskipTests -Dmaven.javadoc.skip=true]

        实际测试结果:

        

(1)打开终端

(2)输入打包命令

mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true

注:打包命令参考官网

https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-CompileHiveonmaster

打包成功的标志如下:

4)修改Maven父工程的pom.xml文件中的guava.version参数

<guava.version>19.0</guava.version>

改为

<guava.version>27.0-jre</guava.version>

5)重新执行Hive的编译打包命令,并根据错误提示修改代码

mvn clean package -Pdist -DskipTests -Dmaven.javadoc.skip=true

打包成功后目标文件所在目录:

seven@ubuntu:~/IdeaProjects/hive/packaging/target

6)反复执行上一步骤,直至编译打包成功

注:以下文件是根据修改guava版本的相关内容制作的补丁,可应用该补丁快速修改代码。

guava-27.0-jre.patch

From b611fdd410be34a7c07b9adc29328119269aa6da Mon Sep 17 00:00:00 2001
From: atguigu <email@atguigu.com>
Date: Thu, 1 Sep 2022 00:31:59 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7guava=E4=BE=9D=E8=B5=96?==?UTF-8?q?=E7=89=88=E6=9C=AC=E8=87=B327.0-jre?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit---.../hive/druid/serde/DruidScanQueryRecordReader.java |  3 ++-.../org/apache/hadoop/hive/llap/AsyncPbRpcProxy.java |  4 ++--.../hadoop/hive/llap/daemon/impl/AMReporter.java     |  6 +++---.../hive/llap/daemon/impl/LlapTaskReporter.java      |  2 +-.../hive/llap/daemon/impl/TaskExecutorService.java   |  2 +-.../llap/tezplugins/LlapTaskSchedulerService.java    |  6 +++---pom.xml                                              |  2 +-.../hadoop/hive/ql/exec/tez/WorkloadManager.java     | 12 ++++--------.../hive/ql/exec/tez/SampleTezSessionState.java      |  8 +++-----9 files changed, 20 insertions(+), 25 deletions(-)diff --git a/druid-handler/src/java/org/apache/hadoop/hive/druid/serde/DruidScanQueryRecordReader.java b/druid-handler/src/java/org/apache/hadoop/hive/druid/serde/DruidScanQueryRecordReader.java
index 64c640f45a..6b9f08cd8a 100644
--- a/druid-handler/src/java/org/apache/hadoop/hive/druid/serde/DruidScanQueryRecordReader.java
+++ b/druid-handler/src/java/org/apache/hadoop/hive/druid/serde/DruidScanQueryRecordReader.java
@@ -28,6 +28,7 @@import com.google.common.collect.Iterators;import java.io.IOException;
+import java.util.Collections;import java.util.Iterator;import java.util.List;@@ -43,7 +44,7 @@private ScanResultValue current;-  private Iterator<List<Object>> compactedValues = Iterators.emptyIterator();
+  private Iterator<List<Object>> compactedValues = Collections.emptyIterator();@Overrideprotected JavaType getResultTypeDef() {
diff --git a/llap-common/src/java/org/apache/hadoop/hive/llap/AsyncPbRpcProxy.java b/llap-common/src/java/org/apache/hadoop/hive/llap/AsyncPbRpcProxy.java
index ad39963614..1ece28c0f2 100644
--- a/llap-common/src/java/org/apach

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417596.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include<stdio.h> #define MAX 100 void findmin(int a[],int n,int& pos) {int mina[0];pos0;//pos0我开始忘了&#xff0c;特别注意边界for(int …

怎么才能快速提升网站在谷歌的收录?

​想让你的网站在谷歌快速收录&#xff0c;其实正常的方法都需要时间&#xff0c;无论是定期更新&#xff0c;提交网站地图&#xff0c;搞外链建设啥的&#xff0c;这些方法虽然有效&#xff0c;但见效慢。而且谷歌爬虫不会一下子抓取你所有页面&#xff0c;需要时间。如果真想…

停车找位难怎么办?捷顺智慧车位引导系统方案,让找车停车变得简单快捷!

随着城市化的快速发展&#xff0c;城市交通压力日益增大&#xff0c;尤其是在商业区、办公区和居民区&#xff0c;停车位的供需矛盾愈发突出。在这种背景下&#xff0c;车位引导系统&#xff08;PGS&#xff09;的重要性日益凸显。它不仅能够提高停车效率&#xff0c;减少车辆在…

用了这个编程助手,“数学建模”真的太简单了~

目录 一、ChatGPT在数学建模中的价值1、学习和指导2、模型评估和改进3、算法设计和优化4、解释和文档生成 二、作为编程手如何正确使用ChatGPT1、阅读代码及优化代码2、执行脚本3、生成单测 三、编程手备战建模大赛的一些建议1、明确&#xff1a;如何去问一个问题2、程序设计能…

[译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

STM32F100xx 系统架构

STM32F100xx 系统架构 参考手册下载关键词: STM32F100xx advanced Arm-based 32-bit MCUs - Reference manual 总结 注意: 这个架构是High-density value line devices的图。 ICode bus 把M3内核指令总线连接到闪存指令接口。Bus matrix 由4主4从构成。 总线矩阵管理内核系…

进程

进程 进程进程的含义PCB块内存空间进程分类&#xff1a;进程的作用进程的状态进程已经准备好执行&#xff0c;所有的资源都已分配&#xff0c;只等待CPU时间进程的调度 进程相关命6.查询进程相关命令1.ps aux2.top3.kill和killall发送一个信号 函数1.fork();2.getpid3.getppid示…

Web 应用开源项目大全结合巴比达内网穿透

巴比达内网穿透配置 一、引言 无论是家庭用户还是企业用户&#xff0c;内网穿透技术的需求日益增长。巴比达&#xff08;BabiDa&#xff09;内网穿透工具以其简单易用的特性&#xff0c;成为了许多用户的首选。本文将详细介绍巴比达内网穿透的配置方法&#xff0c;帮助您轻松实…

人工智能在行动:利用人工智能扩展您的显示和视频工作

在过去的18个月里&#xff0c;我们见证了一场由生成式AI带动的变革性革命。我们看到消费者对生成式AI工具的使用从最初的好奇&#xff0c;逐渐发展到掌握知识并付诸行动。2024年标志着 AI实际应用 的一年&#xff0c;这一年里&#xff0c;每个人都开始利用这些技术来变得更加敏…

rancher upgrade 【rancher 升级】

文章目录 1. 背景2. 下载3. 安装4. 检查5. 测试5.1 创建项目5.2 创建应用5.3 删除集群5.4 注册集群 1. 背景 rancher v2.8.2 升级 v2.9.1 2. 下载 下载charts helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update helm fetc…

Qt 应用程序主界面

主要窗口类的概述 这些类提供了典型现代主应用程序窗口所需的一切&#xff0c;如主窗口本身、菜单和工具栏、状态栏等。 QAction 可以插入小部件的抽象用户界面操作 QActionGroup 将动作组合在一起 QDockWidget 小部件&#xff0c;可以停靠在QMainWindow中&#xff0c;也可以作…

5、Django Admin后台移除“删除所选”操作

默认情况下&#xff0c;Django Admin后台的listview模型列表页&#xff0c;会有一个Delete Selected删除所选操作。假设你需要再从Hero管理模型中移除该删除操作。 ModelAdmin.get_actions方法可以返回所有的操作方法。通过覆盖此方法&#xff0c;移除其中delete_selected方法…

毒猫粮危机!安全主食罐怎么选?健康猫罐头推荐

央视315晚会揭露了“毒猫粮”事件&#xff0c;让众多爱猫人士心惊胆战。河北邢台南和区&#xff0c;这个被誉为“中国宠物食品之都”的地方&#xff0c;年产量惊人的130万吨宠物食品背后&#xff0c;竟隐藏着用劣质原料冒充高端食材的丑闻。低价粉料取代了昂贵鲜肉&#xff0c;…

[STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器

stack stack介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供…

0成本实现.NET Web API 8.0项目内网映射

1.背景 最近在学习CICD&#xff0c;里面会有用到内网映射的使用场景。为了加深对内网映射实操的记忆。我实操了下基于.Net 8.0的内网映射&#xff0c;并支持互联网访问。本文主要介绍了在win11下安装路由侠&#xff0c;并将.net 8.0发布到win11&#xff0c;项目运行、路由侠配…

NR L2 UL处理data优先级问题

MAC 处理LCG 的顺序 有优先级如上图 L2 UL处理data优先级是有明确规定的&#xff0c;这里简单整理下。 MAC logical channel 处理data的优先级&#xff0c;即哪些data要优先处理有定义不同的优先级&#xff0c;如上图。 对于RLC 也有类似的规定&#xff0c;如上图38.322中所述&…

解决 Transformer 根本缺陷,CoPE 论文爆火:所有大模型都能获得巨大改进!

即使最强大的 LLM 也难以通过 token 索引来关注句子等概念&#xff0c;现在有办法了。 最近两天&#xff0c;马斯克和 LeCun 的口水战妥妥成为大家的看点。这两位 AI 圈的名人你来我往&#xff0c;在推特&#xff08;现为 X&#xff09;上相互拆对方台。 LeCun 在宣传自家最新论…

【C++】C++ STL探索:Vector使用与背后底层逻辑

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现 在string类文章中提及了STL容器间的接口是大差不差的&#xff0c;本篇将直…

Linux | System V 共享内存:工作原理与使用指南

目录 一、System V 共享内存概述 二、共享内存的使用方法 1. shmget()&#xff1a;创建或获取共享内存段 2. shmat()&#xff1a;将共享内存附加到进程地址空间 3. shmdt()&#xff1a;将共享内存从进程地址空间分离 4. shmctl()&#xff1a;控制共享内存段 三、共享内存…

Kioxia的NVMe RAID卸载有何亮点?

随着每一代固态硬盘SSD的速度不断提升&#xff0c;RAID阵列面临着一个重大的挑战&#xff1a;如何有效地维持并扩展性能。即使是通过专门的RAID卡来处理RAID操作的情况下&#xff0c;例如在RAID 5阵列中&#xff0c;简单的写请求也需要涉及两次读取和两次写入不同的SSD。如果没…