Hive On Spark官方文档:https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started


首先,之前凭借自己的错觉以为使用官网提供好的安装包之后就可以,后来各种实验各种问题。最后下决心进行自己编译源码进行安装。经过两天的摸索最终还是成功了!!功夫还是不负有心人的,以后要多多有耐心,细心做事。

接下来言归正传,正如hive官网说的hive on spark,hive的版本要without hadoop,所以需要自行编译spark。此处没有想象那么困难,要有动手的勇气和激情,很多问题都会迎刃而解,编译源码,第一步就是下载源码,个人推荐去GitHub上下载需要的源码包,因为这个更新的及时,官网下载的源码有时候没有及时更新,会让你走很多弯路。下面就说一下源码编译过程:

由于国内使用maven非常卡,所以推荐maven仓库配置成阿里巴巴的仓库,速度非常给力的。

仓库地址如下:

<mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>




编译Spark源码一定要参考官网文档,网上博客有时候老旧可能让你陷入困境。笔者深有体会。

如果想修改Spark的scala类库版本等可以修改Saprk-source根目录的pom文件。


配置一下maven的参数,防止编译过程内存溢出。

export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"



使用如下脚本:

make-distribution.sh --name custom-spark --tgz  --mvn ${MAVEN_HOME}/bin/mvn -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn


其中参数含义分别为:

--name custom-spark //指定压缩包名字

--tgz   //生成tgz的部署包



--mvn ${MAVEN_HOME}/bin/mvn   //指定使用自己本地配置的mvn,不指定默认使用spark-source/build下面的mvn



最后生成的安装包早Spark源码根目录。


到此,假设你已经编译好了Spark安装包,部署即可。


接下来,Github下载hive源码,此处要修改Hive依赖的Spark版本和Hadoop以及Scala类库版本。

修改好版本(修改pom.xml)之后便可以进行编译,使用mvn clean package -Pdist -Dmaven.test.skip=true编译即可。(可以跳过测试步骤,否则太慢)


Hive官方编译文档:


$ git clone https://git-wip-us.apache.org/repos/asf/hive.git $ cd hive $ mvn clean package -Pdist $ cd packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin $ ls LICENSE NOTICE README.txt RELEASE_NOTES.txt  bin/ (all the shell scripts) lib/ (required jar files) conf/ (configuration files) examples/ (sample input and query files) hcatalog / (hcatalog installation) scripts / (upgrade scripts for hive-metastore)





最后输出目录:

packaging/target/apache-hive-{version}-SNAPSHOT-bin/apache-hive-{version}-SNAPSHOT-bin
例如我的输出目录:
/home/daxin/installData/source/hive-2.1.1/packaging/target/apache-hive-2.2.0-SNAPSHOT-bin/apache-hive-2.2.0-SNAPSHOT-bin


(Hive编译遇见的问题‘参见:)


假定此时你已经编译好Hive源码。


安装MySQL数据库,创建数据库,同时安装Hive(安装过程另写博文补充)。

安装好执行:schematool -dbType MySQL -initSchema  把之前创建的元数据都同步到mysql 里。

此处遇见的:“schematool -dbType MySQL -initSchema ” 命令直接复制输入进去之后,竟然报错。

File /home/daxin/bigdata/Hive/scripts/metastore/upgrade/MySQL/upgrade.order.MySQLnot found 

参见:


后来去 /home/daxin/bigdata/Hive/scripts/metastore/upgrade/MySQL/看文件也确实存在,只不过文件名字大小写不一致,后来

怀疑schematool -dbType MySQLschematool -dbType mysql -initSchema

最后元数据同步数据库完毕之后启动元数据服务,之后启动Hive脚本设置set hive.execution.engine=spark;


启动元数据服务:hive --service metastore &


创建表:

create table t_u(id string,age int ,salary double) row format delimited   fields terminated by ' '  lines terminated by '\n' stored as textfile ;

create table t_s(id string,age int ,salary double) row format delimited   fields terminated by ' '  lines terminated by '\n' stored as textfile ;

导入数据:

load data   inpath '/uu' into table t_s;


load data   inpath '/uu' into table t_u;

之后写一个查询测试:select u.age from t_u u ,t_s s where u.age =s.age;

竟然又报错了:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Iterable

此时不过还是喜悦的,感觉离success已经不远了。最后发现是hive没有加载spark jars原因,解决方案:在hive脚本中加载spark jars即可,具体步骤参见:


此时在输入:select u.age from t_u u ,t_s s where u.age =s.age;


为什么hive on spark 的runjar关闭后日志就看不了了 spark on hive hive on spark_spark


Hadoop YARN 界面:

为什么hive on spark 的runjar关闭后日志就看不了了 spark on hive hive on spark_hive_02


Spark Job界面:


为什么hive on spark 的runjar关闭后日志就看不了了 spark on hive hive on spark_Hive_03


到此已经完成安装!