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了。哎。
(全文完)