天天看點

在 CDH 4.5 上安裝 Shark 0.9

Spark是一個新興的大資料計算平台,它的優勢之一是記憶體型計算,是以對于需要多次疊代的算法尤為适用。同時,它又能夠很好地融合到現有的Hadoop生态環境中,包括直接存取HDFS上的檔案,以及運作于YARN之上。對于Hive,Spark也有相應的替代項目——Shark,能做到 drop-in replacement ,直接建構在現有叢集之上。本文就将簡要闡述如何在CDH4.5上搭建Shark0.9叢集。

準備工作

  • 安裝方式:Spark使用CDH提供的Parcel,以Standalone模式啟動
  • 軟體版本
    • Cloudera Manager 4.8.2
    • CDH 4.5
    • Spark 0.9.0 Parcel
    • Shark 0.9.1 Binary
  • 伺服器基礎配置
    • 可用的軟體源(如中科大的源)
    • 配置主節點至子節點的root賬戶SSH無密碼登入。
    • /etc/hosts

      中寫死IP和主機名,或者DNS做好正反解析。

安裝Spark

  • 使用CM安裝Parcel,不需要重新開機服務。
  • 修改

    /etc/spark/conf/spark-env.sh

    :(其中one-843是主節點的域名)
STANDALONE_SPARK_MASTER_HOST=one-
DEFAULT_HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/*
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/native
           
  • 修改

    /etc/spark/conf/slaves

    ,添加各節點主機名。
  • /etc/spark/conf

    目錄同步至所有節點。
  • 啟動Spark服務(即Standalone模式):
$ /opt/cloudera/parcels/SPARK/lib/spark/sbin/start-master.sh
$ /opt/cloudera/parcels/SPARK/lib/spark/sbin/start-slaves.sh
           
  • 測試

    spark-shell

    是否可用:
sc.textFile("hdfs://one-843:8020/user/jizhang/zj_people.txt.lzo").count
           

安裝Shark

  • 安裝Oracle JDK 1.7 Update 45至

    /usr/lib/jvm/jdk1.7.0_45

  • 下載下傳别人編譯好的二進制包:shark-0.9.1-bin-2.0.0-mr1-cdh-4.6.0.tar.gz
  • 解壓至

    /opt

    目錄,修改

    conf/shark-env.sh

export JAVA_HOME=/usr/lib/jvm/jdk1._45
export SCALA_HOME=/opt/cloudera/parcels/SPARK/lib/spark
export SHARK_HOME=/root/shark-.-bin-.-mr1-cdh-.

export HIVE_CONF_DIR=/etc/hive/conf

export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export SPARK_HOME=/opt/cloudera/parcels/SPARK/lib/spark
export MASTER=spark://one-:

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/*
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/opt/cloudera/parcels/HADOOP_LZO/lib/hadoop/lib/native
           
  • 開啟SharkServer2,使用Supervisord管理:
[program:sharkserver2]
command = /opt/shark/bin/shark --service sharkserver2
autostart = true
autorestart = true
stdout_logfile = /var/log/sharkserver2.log
redirect_stderr = true
           
$ supervisorctl start sharkserver2
           
  • 測試
$ /opt/shark/bin/beeline -u jdbc:hive2://one-: -n root
           

版本問題

背景

CDH

CDH是對Hadoop生态鍊各元件的打包,每個CDH版本都會對應一組Hadoop元件的版本,如CDH4.5的部分對應關系如下:

  • Apache Hadoop: hadoop-2.0.0+1518
  • Apache Hive: hive-0.10.0+214
  • Hue: hue-2.5.0+182

可以看到,CDH4.5對應的Hive版本是0.10.0,是以它的Metastore Server使用的也是0.10.0版本的API。

Spark

Spark目前最高版本是0.9.1,CDH前不久推出了0.9.0的Parcel,使得安裝過程變的簡單得多。CDH5中對Spark做了深度內建,即可以用CM來直接控制Spark的服務,且支援Spark on YARN架構。

Shark

Shark是基于Spark的一款應用,可以簡單地認為是将Hive的MapReduce引擎替換為了Spark。

Shark的一個特點的是需要使用特定的Hive版本——AMPLab patched Hive:

  • Shark 0.8.x: AMPLab Hive 0.9.0
  • Shark 0.9.x: AMPLab Hive 0.11.0

在0.9.0以前,我們需要手動下載下傳AMPLab Hive的二進制包,并在Shark的環境變量中設定$HIVE_HOME。在0.9.1以後,AMPLab将該版本的Hive包上傳至了Maven,可以直接打進Shark的二進制包中。但是,這個Jar是用JDK7編譯的,是以運作Shark需要使用Oracle JDK7。CDH建議使用Update 45這個小版本。

Shark與Hive的并存

Shark的一個賣點是和Hive的高度相容,也就是說它可以直接操作Hive的metastore db,或是和metastore server通信。當然,前提是兩者的Hive版本需要一緻,這也是目前遇到的最大問題。

目前發現的不相容SQL

  • DROP TABLE …
  • INSERT OVERWRITE TABLE … PARTITION (…) SELECT …
  • LOAD DATA INPATH ‘…’ OVERWRITE INTO TABLE … PARTITION (…)

也就是說上述兩個方法名是0.11.0接口中定義的,在0.10.0的定義中并不存在,是以出現上述問題。

解決方案

對存在問題的SQL使用Hive指令去調

因為Shark初期是想給分析師使用的,他們對分區表并不是很在意,而DROP TABLE可以在用戶端做判斷,轉而使用Hive來執行。

這個方案的優點是可以在現有叢集上立刻用起來,但缺點是需要做一些額外的開發,而且API不一緻的問題可能還會有其他坑在裡面。

更新到CDH5

CDH5中Hive的版本是0.12.0,是以不排除同樣存在API不相容的問題。不過網上也有人嘗試跳過AMPLab Hive,讓Shark直接調用CDH中的Hive,其可行性還需要我們自己測試。

對于這個問題,我隻在Google Groups上看到一篇相關的文章,不過并沒有給出解決方案。

目前我們實施的是 第一種方案,即在用戶端和Shark之間添加一層,不支援的SQL語句直接降級用Hive執行,效果不錯。

繼續閱讀