Shark簡介、部署及編譯小結

jopen 11年前發布 | 57K 次閱讀 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了。哎。

 

(全文完)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!