天天看点

Shark简介、部署及编译小结

shark简介

shark即hive on spark,本质上是通过hive的hql解析,把hql翻译成spark上的rdd操作,然后通过hive的metadata获取数据库里的表信息,实际hdfs上的数据和文件,会由shark获取并放到spark上运算。shark的特点就是快,完全兼容hive,且可以在shell模式下使用rdd2sql()这样的api,把hql得到的结果集,继续在scala环境下运算,支持自己编写简单的机器学习或简单分析处理函数,对hql结果进一步分析计算。

shark速度快的原因除了spark平台提供的基于内存迭代计算外,在设计上还存在对spark上进行了一定的改造,主要有

  - partial dag execution:对join优化,调节并行粒度,因为spark本身的宽依赖和窄依赖会影响并行计算和速度

  - 基于列的压缩和存储:把hql表数据按列存,每列是一个array,存在jvm上,避免了jvm gc低效,而压缩和解压相关的技术是yahoo!提供的

其他特性和设计要点请参看论文shark: sql and rich analytics at scale

总结来说,shark是一个插件式的东西,在我现有的spark和hive及hadoop-client之间,在这两套都可用的情况下,shark只要获取hive的配置(还有metastore和exec等关键包),spark的路径,shark就能利用hive和spark,把hql解析成rdd的转换,把数据取到spark上运算和分析。在sql on hadoop这块,shark有别于impala,stringer,而这些系统各有自己的设计思路,相对于对mr进行优化和改进的思路,shark的思路更加简单明了些。

shark部署

shark wiki上发布了两个主要版本,shark-0.7.0-hadoop1-bin.tgz和shark-0.7.0-hadoop2-bin.tgz。shark-0.7.0-hadoop1-bin.tgz适用于cdh3,shark-0.7.0-hadoop2-bin.tgz适用于cdh4,他们都使用hive-0.9.0进行了编译,使用的spark是0.7.2的。相对来说,hive的版本比较老,想要支持0.11.0这样更新的版本的话需要自己重新编译shark。在github上,现在shark的master分支已经开始支持未发布的spark0.8版本,编译注意的地方会在下一节讲。

shark的部署参看https://github.com/amplab/shark/wiki/running-shark-on-a-cluster和https://github.com/amplab/shark/wiki/running-shark-locally。首先要选择适合自己hadoop集群版本的shark-0.7.0-hadoopx-bin.tgz。

解压出来的hive-0.9.0配置在shark-env.sh的hive_home,同时还可以额外指定hive_conf的目录,一般就指定自己已有的可以连接hadoop的hive conf目录。其余的spark_mem, spark_home, scala_home就不说了。

用bin/shark-withinfo启动shark,可以看到info信息,shark首先启动自己的cli,然后会启动hive,再启动spark,之后就可以用hql测试shark可用与否。

在配置好各个home后,如果跑在common hadoop上,当你进行select这样和hdfs数据打交道的操作时,会报如下的版本错误,

具体见shark group的这个帖。目前,我尝试了很多也没有找到解决办法,特别是像我用的hadoop-client还是公司自己改装过的,相对的hive的几个主要jar包(hive-metastore-xx, hive-exec-xx)也被改动了,导致不但shark发布的包不能直接使用,连使用shark重新根据自己的hive编译一遍都编译不过。

最后再提醒几个可能发生的常见错误。

1. hive_home/lib下要有jdbc驱动包,比如mysql-driver的jar包,否则会报错。

2. hive_home/lib下的hive-metastore-xx.jar,可能太旧,不适应自己的hadoop集群,可以替换成自己的hive/lib下的metastore包,否则会报错,hql执行不成功。替换后至少在执行use db; show tables; 这样的hql没有问题。

3. 有一个错误是:

后来我根据hadoop jira上的这个相似的问题https://issues.apache.org/jira/browse/hadoop-9232,受到启发,解决方案是对shark目录下lib_manage/jars/org.apache.hadoop/hadoop-common内的jar包内的配置文件core-site.xml,去掉hadoop.security.group.mapping的相关配置,就ok了。

shark编译

主要参考官方文档:https://github.com/amplab/shark/wiki/building-shark-from-source-code。在下载版本的时候,一定要注意下载配套的源码。我第一次编译的时候用了shark-master的源码,就编译失败了,因为它依赖spark-0.8版本,而这版本还未发布。应该获取branch-0.7下的版本,

除了指定下scala_home和hive_home外,最好再指定下spark_home。最后sbt/sbt package,利用sbt进行打包,需要蛮长的时间。

我尝试了依赖公司的hive包编译,失败了,报了77个error,原因是shark的源码里很多依赖于hive的接口,有些有,有些没有,所以我又尝试了依赖hive-0.9.0的包编译,成功了,没有报错。虽然我想尝试编译适合自己公司集群的shark失败了,但是我还是完成了这条路的探索。目前我如果想使用shark的话,只能自己部一套cdh的hadoop和hive了。哎。

(全文完)

继续阅读