閱讀908 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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-Clusterhttps://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數據打交道的操作時,會報如下的版本錯誤

ERROR shark.SharkDriver: FAILED: Hive Internal Error: java.lang.RuntimeException(java.io.IOException: Failed on local exception: java.io.IOException: Response is null.; Host Details : local host is: "namenode.hadoop.game.yy.com/xxx.xxx.xx.xxx"; destination host is: "xxx.xxx.com":pppp; 

具體見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. 有一個錯誤是:

java.lang.UnsatisfiedLinkError: org.apache.hadoop.security.JniBasedUnixGroupsMapping.getGroupForUser(Ljava/lang/String;)[Ljava/lang/String;
後來我根據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下的版本,

git clone https://github.com/amplab/shark.git -b branch-0.7 shark-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了。哎。


(全文完)

最後更新:2017-04-03 15:21:46

  上一篇:go 教你認識汽車標誌
  下一篇:go mac OS下在控製台中發送外部郵件