hive之编译源码

el/2024/7/13 11:31:09

序言

    使用maven来进行源码,真的是靠运气,特别是你网络很差的情况下,再特别是你没有本地库的时候,靠运气吃饭。。。

    本来不想编译的,奈何在hive中执行show create table table_name的时候显示为乱码。。。当一切都很顺利的时候,就能很简单的解决一个问题,当一切不顺利的时候,就感觉很难了,耗费的就是时间。。。是一个耐心加坚持的过程,就看你在什么时候放弃。。。

hive源码编译

    1 问题现象

    在创建数据仓库的时候,总是要写上各种注释,这样才好去追寻血缘关系,这样好知道每个数据库干啥的,每个表干啥的,每个任务干啥的,这样才能把数据作为资产进行管理,所谓的让数据用起来,让数据动起来。

    使用hive1.2.2,使用hadoop2.7.2,使用jdk1.8.0.

    2 配置基本环境

    由于是在linux上进行编译,重新要进行依赖库的安装:

yum install -y openssl openssl-devel svn ncurses-devel zlib-devel libtool
yum install -y snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop autoconf automake
yum -y install glibc-headers gcc-c++ make cmake openssl-devel ncurses-devel

    安装protobuf:

  cd /opt/module/protobuf-2.5.0/./configuremakemake checkmake installldconfig

    进行验证:

[root@KEL1 software]# protoc --version
libprotoc 2.5.0

    2 使用maven进行编译

    在使用linux的时候,进行依赖的安装就是一件痛苦的事,有了yum之后生活幸福感大大提高,要是手动去安装依赖,并且追查依赖关系。。。真是浪费人生时光。

    在使用maven的时候,你会发现这玩意儿也是为了解决依赖关系,也是。。。相当痛苦的过程,尤其是不熟悉的时候。

    先替换仓库地址,毕竟墙外面的花儿香,但是不能越鱼池一步:

//下载的依赖jar包都爱此目录之下
[root@KEL1 repository]# pwd
/root/.m2/repository
//使用yum进行安装的maven配置文件目录
[root@KEL1 repository]# ls -l /etc/maven/settings.xml 
-rw-r--r-- 1 root root 10476 Feb 25 01:47 /etc/maven/settings.xml<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://maven.aliyun.com/nexus/content/groups/pulic</url></mirror>

    3 修改代码进行编译

        修改显示的代码,使用UTF-8编码:

//文件存在路径
[root@KEL1 exec]# pwd
/root/jdbcjar/apache-hive-1.2.2-src/ql/src/java/org/apache/hadoop/hive/ql/exec
//文件名称
[root@KEL1 exec]# vim DDLTask.java 
//将1925行的代码改成如下形式,注意方法名称是write,你要是只改了后面编译不过
outStream.write(createTab_stmt.toString().getBytes("UTF-8"));
//将2110行的代码改成如下形式
outStream.write(createTab_stmt.render().getBytes("UTF-8"));

    进行编译:

//进入解压的源码目录,执行编译打包命令
[root@KEL1 apache-hive-1.2.2-src]# pwd
/root/jdbcjar/apache-hive-1.2.2-src
[root@KEL1 apache-hive-1.2.2-src]# mvn clean package -DskipTests -Phadoop-2 -Pdist

    接下来就是靠运气了,运气好,一个小时结束,运气不好,三天。。。

[root@KEL1 apache-hive-1.2.2-src]# find ./* -name "*.jar"|grep exec 
./ql/target/hive-exec-1.2.2-tests.jar
./ql/target/hive-exec-1.2.2-core.jar
./ql/target/original-hive-exec-1.2.2.jar
./ql/target/hive-exec-1.2.2.jar
//找到对应的hive-exec-1.2.2.jar,替换掉hive里面的jar包

    4 验证

        创建一个表,用中文注释即可:

    

    5 可能出现的问题

    在进行编译的时候,可能出现内存不足OOM,需要进行设定jvm参数:

//报错内存不足导致OOM
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap spaceat com.sun.tools.javac.util.Name.append(Name.java:88)at com.sun.tools.javac.code.Symbol$TypeSymbol.formFullName(Symbol.java:687)at com.sun.tools.javac.code.Symbol$ClassSymbol.<init>(Symbol.java:950)at com.sun.tools.javac.code.Symbol$ClassSymbol.<init>(Symbol.java:958)at com.sun.tools.javac.jvm.ClassReader.defineClass(ClassReader.java:2358)at com.sun.tools.javac.jvm.ClassReader.enterClass(ClassReader.java:2372)at com.sun.tools.javac.jvm.ClassReader.includeClassFile(ClassReader.java:2686)at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2831)at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:2749)//设定JVM参数//export MAVEN_OPTS='-Xms256m -Xmx1024m

    如果出现编译失败,不要担心,直接再次运行编译命令即可,会在原来的基础上继续进行编译,找那些不存在的symbol。

    具体报错内容如下:

466,33] cannot find symbol
[ERROR] symbol:   class RangeInputSplit
[ERROR] location: class org.apache.hadoop.hive.accumulo.mr.HiveAccumuloTableInputFormat
[ERROR] /root/jdbcjar/apache-hive-1.2.2-src/accumulo-handler/src/java/org/apache/hadoop/hive/accumulo/mr/HiveAccumuloTableInputFormat.java:[519,31] cannot find symbol
[ERROR] symbol:   class RangeInputSplit
[ERROR] location: class org.apache.hadoop.hive.accumulo.mr.HiveAccumuloTableInputFormat
[ERROR] /root/jdbcjar/apache-hive-1.2.2-src/accumulo-handler/src/java/org/apache/hadoop/hive/accumulo/predicate/AccumuloPredicateHandler.java:[85,29] cannot find symbol
[ERROR] symbol:   class Range
[ERROR] location: class org.apache.hadoop.hive.accumulo.predicate.AccumuloPredicateHandler
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :hive-accumulo-handler

    偶尔也会出现如下的错误:

error in opening zip file
//不用管,再次执行编译命令即可,可能是网络问题导致下载的jar包有问题

    在查看依赖的时候,发现很美好,但是编译又靠网络了。。。

//查看依赖情况
mvn dependency:tree -X 

    

    爱意随风起,风止爱难平,黄昏与落日,晚风也想你。。。

    成功的路千篇一律,失败的路各种各样诡异的问题。。。。好看的人千篇一律,其他的就不知道了。。。一个问题的特殊性太高,或者使用的场景太少,带来的结果就是投入付出比例不均衡,但是这个又说明了你到底是放弃还是坚持,如果放弃,会不会在心里念念不忘。。。也是一个权衡。

    规模化才有更大的机会,就像批量脚本一样。

    但是有的时候,特殊的问题就像特殊的机会一样,没准你把握住了,也能成就一段人生。。。是矛盾也是一种妥协。


http://www.ngui.cc/el/5239888.html

相关文章

hadoop生态之sqoop

序言 在使用大数据的时候,各种不同的数据都要将数据采集同步到数据仓库中,一个是属于业务系统的RDBMS系统,也就是各种关系型数据库,一个是hadoop生态的存储,中间用于传输的数据的工具可以使用sqoop,也就是sql to hadoop。 在数据进入数仓的ODS层的时候,使用sqoo…

hdfs和yarn高可用对比

序言 总有一天你会笑着说出曾经令你痛苦的事情,毕竟有些东西虽然不是你想要的,但是却是你自找的,表面上是无奈,实际上是懒得去做选择,成功的路只有一条,而失败的路则是各种各样的原因。 得不到的时候念念不忘,得到的时候,却不珍惜,这到底是为什么呢?是忘记了…

三月闲聊

序言 生活原本很沉闷&#xff0c;但跑起来有风。 工欲善其事必先利其器&#xff0c;当你有一些想法的时候&#xff0c;如果没有合适的工具&#xff0c;那将是一个很痛苦的过程。。。至于有多痛苦呢&#xff0c;越追求细节的越enjoy。。。 风言风语 1 在理论的指导下实践 无论是…

七月闲聊

序言 风都停了&#xff0c;所以闲下来瞎聊聊。。。 最近头有点痒&#xff0c;可能是要长脑子了。。。 风言风语 1 开源与商业 看最近的天气&#xff0c;总是不太安稳&#xff0c;一会儿暴风雨&#xff0c;一会儿插喉咙&#xff0c;多事之秋。 谈到商业产品的时候&#xff0c;总…

八月闲聊

序言 远方就是窗外的风景&#xff0c;可望而不可及&#xff0c;在家呆的太久&#xff0c;都忘记了今夕是何年。 如果你来南京玩&#xff0c;记得带好你的绿码。。。 风言风语 1 尊重你的用户&#xff0c;也尊重你自己 可以吵架&#xff0c;但是吵架是为了更好的去了解对方&…

平淡让你无脑?

序言 我的意中人&#xff0c;一定会驾着五彩祥云来打死我。。。平凡之间的平淡。 空花幻月&#xff0c;都是用来迷惑众生的。。。听我讲道理&#xff0c;比死还难受。 风言风语 最近都在升级&#xff0c;产品种类繁多&#xff0c;但是从整体的角度来说&#xff0c;都是点点几个…

从一个小问题探讨解题思路

序言 前奏一响&#xff0c;心一动&#xff0c;就是跑路的信号&#xff0c;从入门到删库。。。你看这篇文章&#xff0c;她像不像一封辞职信。 运维的终点在哪儿&#xff1f;如果运维的终点是没有运维&#xff0c;那么这一切又将有什么存在的含义&#xff1f; 风言风语 问题背景…

敏捷运维

序言 表面上都是自由的&#xff0c;实际上四周围墙&#xff0c;无法跨越&#xff1b;表面上都有很多选择&#xff0c;实际上没得选。 成功是一种考验&#xff0c;失败也是&#xff0c;原因能想出来吗&#xff1f; 敏捷运维&#xff0c;敏捷开发&#xff0c;在各种压力进行运维&…

c++中单独大括号的用法

经常看到大的工程中使用单独的大括号&#xff0c;其用法主要是使用单独大括号里面的临时变量。

记录一些cmake的用法

今天用add_directory时&#xff0c;出现了 “you have changed variables that require your cache to be deleted. Configure will be re-run and you may have to reset some variables.” 这样的死循环&#xff0c;原来是要将这条命令加到cmake头部。 顺带记录一些cmake的用…