shark 安装
本文介紹在計算機集群上如何啟動和運行Shark。如果對Amazon EC2上運行Shark感興趣,請點擊這里查看如何使用EC2腳本快速啟動預先配置好的集群。
依賴:
注意:Shark是一個即插即用的工具,所以可以在現有的Hive數據倉庫之上運行,不需要您對現有的部署做出任何修改。
在集群上運行Shark需要一下幾個外部組件:
- Scala 2.9.3
- Spark 0.7.2
- 兼容的JAVA運行時環境:OpenJDK 7, Oracle HotSpot JDK 7,或者?Oracle HotSpot JDK 6u23+
- Shark專用的?Hive JAR (基于Hive 0.9),包括在Shark發布包里。
- HDFS?集群:在這里不介紹如何安裝,可以查看我的博文.
Scala
如果系統里沒有安裝Scala 2.9.3,可以按提示下載:
$ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.3.tgz
$ tar xvfz scala-2.9.3.tgz
Spark
采用Spark的單獨部署模式運行Shark。
部署細節:|http://spark-project.org/docs/latest/spark-standalone.html).也可以查看我翻譯的博文。
下載Spark:
$ wget http://spark-project.org/files/spark-0.7.2-prebuilt-hadoop1.tgz? # Hadoop 1/CDH3
或者
$ wget http://spark-project.org/files/spark-0.7.2-prebuilt-cdh4.tgz??? # Hadoop 2/CDH4
解壓縮:
$ tar xvfz spark-0.7.2-prebuilt*.tgz
編輯?spark-0.7.2/conf/slaves添加集群中Slaves的主機名稱,每一行對應一個Salve。
編輯spark-0.7.2/conf/spark-env.sh設置SCALA_HOME和SPARK_WORKER_MEMORY
export SCALA_HOME=/path/to/scala-2.9.3
export SPARK_WORKER_MEMORY=16g
SPARK_WORKER_MEMORY?是Spark在每一個節點上可用內存的最大,增加這個數值可以在內存中緩存更多的數據,但是一定要記住給Slave的操作系統和其他服務預留足夠的內存。
Shark
下載Shark 0.2.1發布包,里邊包括?shark-0.2.1和hive-0.9.0-bin.
$ wget http://spark-project.org/download/shark-0.7.0-hadoop1-bin.tgz? # Hadoop 1/CDH3
或者
$ wget http://spark-project.org/download/shark-0.7.0-hadoop2-bin.tgz? # Hadoop 2/CDH4
解壓縮:
$ tar xvfz shark-0.7.0-*-bin.tgz
編輯shark-0.7.0/conf/shark-env.sh設置HIVE_HOME, SCALA_HOME和MASTER環境變量(參考如下):
export HADOOP_HOME=/path/to/hadoop
export HIVE_HOME=/path/to/hive-0.9.0-bin
export MASTER=spark://<MASTER_IP>:7077
export SPARK_HOME=/path/to/spark
export SPARK_MEM=16g
source?$SPARK_HOME/conf/spark-env.sh
(source命令通常用于重新執行剛修改的初始化文件,使之立即生效)
最后一行是為了避免重復設置SCALA_HOME。一定要確保SPARK_MEM的數值不能超過前面設置的SPARK_WORKER_MEMORY的數值.
如果是在現有的Hive上運行Shark,確定設置?HIVE_CONF_DIR (在shark-env.sh文件中)指向你的配置文件夾.也可以,復制?Hive XML配置文件到Shark的hive-0.9.0-bin/conf配置文件夾內,比如:
cp /etc/hive/conf/*.xml /path/to/hive-0.9.0-bin/conf/
復制?Spark和?Shark目錄到所有的slaves.前提是master的用戶可以實現無密碼SSH登錄到所有的slaves.例如:
$ while read slave_host; do
$?? rsync -Pav spark-0.7.2 shark-0.7.0 $slave_host
$ done < /path/to/spark/conf/slaves
運行?Spark的集群啟動腳本,啟動集群:
$ cd spark-0.7.2
$ ./bin/start_all.sh
基于CDH4/Hadoop2配置Shark
The newest versions of require additional configuration options.
新版本的Hadoop需要額外的配置選項。在Hive的配置文件(hive-site.xml)中進行配置:
- fs.default.name:?指向HDFS?的namenode.例如:hdfs://myNameNode:8020/
- fs.defaultFS:?和fs.default.name設置為同樣值。
- mapred.job.tracker:設置為JobTracker,格式為host:port。如果僅僅運行Spark可以設置為"NONE"。注意:一定要明確設置這個選項,即使不使用JobTracker.
測試
使用如下命令,啟動Shark
$ ./bin/shark-withinfo
關于Spark單獨模式的更多腳本細節參考這里。
To verify that Shark is running, you can try the following example, which creates a table with sample data:
使用下面的命令,創建一個簡單的表格就可以確認一下Shark是否可以運行。
CREATE TABLE src(key INT, value STRING);
LOAD DATA LOCAL INPATH '${env:HIVE_HOME}/examples/files/kv1.txt' INTO TABLE src;
SELECT COUNT(1) FROM src;
CREATE TABLE src_cached AS SELECT * FROM SRC;
SELECT COUNT(1) FROM src_cached;
更詳細的學習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數據打交道的操作時,會報如下的版本錯誤,
[html]?view plaincopy
具體見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. 有一個錯誤是:
[html]?view plaincopy
Shark編譯
主要參考官方文檔:https://github.com/amplab/shark/wiki/Building-Shark-from-Source-Code。在下載版本的時候,一定要注意下載配套的源碼。我第一次編譯的時候用了shark-master的源碼,就編譯失敗了,因為它依賴Spark-0.8版本,而這版本還未發布。應該獲取branch-0.7下的版本,
[html]?view plaincopy
除了指定下SCALA_HOME和HIVE_HOME外,最好再指定下SPARK_HOME。最后sbt/sbt package,利用sbt進行打包,需要蠻長的時間。
我嘗試了依賴公司的hive包編譯,失敗了,報了77個error,原因是Shark的源碼里很多依賴于hive的接口,有些有,有些沒有,所以我又嘗試了依賴hive-0.9.0的包編譯,成功了,沒有報錯。雖然我想嘗試編譯適合自己公司集群的shark失敗了,但是我還是完成了這條路的探索。目前我如果想使用Shark的話,只能自己部一套CDH的hadoop和hive了。哎。
總結
- 上一篇: vc++ 2008 Redistribu
- 下一篇: 安装vs产生的垃圾文件(eula.102