1. 程式人生 > >Spark叢集安裝和使用

Spark叢集安裝和使用

本文主要記錄 CDH5 叢集中 Spark 叢集模式的安裝過程配置過程並測試 Spark 的一些基本使用方法。

安裝環境如下:

  • 作業系統:CentOs 6.5
  • Hadoop 版本:cdh-5.3.0
  • Spark 版本:cdh5-1.2.0_5.3.0

關於 yum 源的配置以及 Hadoop 叢集的安裝,請參考 使用yum安裝CDH Hadoop叢集

1. 安裝

首先檢視 Spark 相關的包有哪些:

$ yum list |grep spark
spark-core.noarch                 1.2.0+cdh5.3.0+364-1.cdh5.3.0.p0.36.el6 @cdh
spark-history-server.noarch       1.2.0+cdh5.3.0+364-1.cdh5.3.0.p0.36.el6 @cdh
spark-master.noarch               1.2.0+cdh5.3.0+364-1.cdh5.3.0.p0.36.el6 @cdh
spark-python.noarch               1.2.0+cdh5.3.0+364-1.cdh5.3.0.p0.36.el6 @cdh
spark-worker.noarch               1.2.0+cdh5.3.0+364-1.cdh5.3.0.p0.36.el6 @cdh
hue-spark.x86_64                  3.7.0+cdh5.3.0+134-1.cdh5.3.0.p0.24.el6 cdh

以上包作用如下:

  • spark-core: spark 核心功能
  • spark-worker: spark-worker 初始化指令碼
  • spark-master: spark-master 初始化指令碼
  • spark-python: spark 的 Python 客戶端
  • hue-spark: spark 和 hue 整合包
  • spark-history-server

在已經存在的 Hadoop 叢集中,選擇一個節點來安裝 Spark Master,其餘節點安裝 Sparl worker ,例如:在 cdh1 上安裝 master,在 cdh1、cdh2、cdh3 上安裝 worker:

# 在 cdh1 節點上執行
$ sudo yum install spark-core spark-master spark-worker spark-python spark-history-server -y # 在 cdh2、cdh3 上執行 $ sudo yum install spark-core spark-worker spark-python -y

安裝成功後,我的叢集部署如下:

cdh1節點:  spark-master spark-history-server
cdh2節點:  spark-worker 
cdh3節點:  spark-worker 

2. 配置

2.1 修改配置檔案

設定環境變數,在 .bashrc

中加入下面一行,並使其生效:

export SPARK_HOME=/usr/lib/spark

可以修改配置檔案 /etc/spark/conf/spark-env.sh,其內容如下,你可以根據需要做一些修改,例如,修改 master 的主機名稱。

# 設定 master 主機名稱
export STANDALONE_SPARK_MASTER_HOST=cdh1

export SPARK_MASTER_IP=$STANDALONE_SPARK_MASTER_HOST

### Let's run everything with JVM runtime, instead of Scala
export SPARK_LAUNCH_WITH_SCALA=0
export SPARK_LIBRARY_PATH=${SPARK_HOME}/lib
export SCALA_LIBRARY_PATH=${SPARK_HOME}/lib
export SPARK_MASTER_WEBUI_PORT=18080
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_PORT=7078
export SPARK_WORKER_WEBUI_PORT=18081
export SPARK_WORKER_DIR=/var/run/spark/work
export SPARK_LOG_DIR=/var/log/spark

if [ -n "$HADOOP_HOME" ]; then
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HADOOP_HOME}/lib/native
fi

export HIVE_CONF_DIR=${HIVE_CONF_DIR:-/etc/hive/conf}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/etc/hadoop/conf}

### Comment above 2 lines and uncomment the following if
### you want to run with scala version, that is included with the package
#export SCALA_HOME=${SCALA_HOME:-/usr/lib/spark/scala}
#export PATH=$PATH:$SCALA_HOME/bin

如果你和我一樣使用的是虛擬機器執行 spark,則你可能需要修改 spark 程序使用的 jvm 大小(關於 jvm 大小設定的相關邏輯見 /usr/lib/spark/bin/spark-class):

export SPARK_DAEMON_MEMORY=256m

修改完 cdh1 節點上的配置檔案之後,需要同步到其他節點:

scp -r /etc/spark/conf  cdh2:/etc/spark
scp -r /etc/spark/conf  cdh3:/etc/spark

2.2 配置 Spark History Server

執行下面命令:

$ sudo -u hdfs hadoop fs -mkdir /user/spark
$ sudo -u hdfs hadoop fs -mkdir /user/spark/applicationHistory
$ sudo -u hdfs hadoop fs -chown -R spark:spark /user/spark
$ sudo -u hdfs hadoop fs -chmod 1777 /user/spark/applicationHistory

在 Spark 客戶端建立 /etc/spark/conf/spark-defaults.conf

cp /etc/spark/conf/spark-defaults.conf.template /etc/spark/conf/spark-defaults.conf

/etc/spark/conf/spark-defaults.conf 新增兩行:

spark.eventLog.dir=/user/spark/applicationHistory
spark.eventLog.enabled=true

如果想 YARN ResourceManager 訪問 Spark History Server ,則新增一行:

spark.yarn.historyServer.address=http://HISTORY_HOST:HISTORY_PORT

最後,spark-defaults.conf 內容如下:

spark.master=spark://cdh1:7077
spark.eventLog.dir=/user/spark/applicationHistory
spark.eventLog.enabled=true

spark.yarn.historyServer.address=http://cdh1:19888

Spark History Server 中的 spark.history.provider 引數預設配置為 org.apache.spark.deploy.history.FsHistoryProvider 時,需要配置 spark.history.fs.logDirectory 引數,該引數在 spark-env.sh 中新增 SPARK_HISTORY_OPTS 環境變數:

#這裡配置的是本地目錄,也可以改為 hdfs 上的目錄
export SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.fs.logDirectory=/var/log/spark"

如果,叢集配置了 kerberos ,則還需要開啟 kerberos 認證,涉及到下面三個引數:

  • spark.history.kerberos.enabled:是否開啟 kerberos 認證
  • spark.history.kerberos.principal:HistoryServer 的 kerberos 主體名稱,注意:這裡直接使用機器的 hostname 而不要使用 _HOST
  • spark.history.kerberos.keytab:HistoryServer 的kerberos keytab檔案位置

另外,還開啟了 spark.history.ui.acls.enable (授權使用者檢視應用程式資訊的時候是否檢查acl),在 spark-env.sh 中繼續新增:

HOSTNAME=`hostname -f`
export SPARK_HISTORY_OPTS="$SPARK_HISTORY_OPTS -Dspark.history.kerberos.enabled=true -Dspark.history.kerberos.principal=spark/${HOSTNAME}@LASHOU.COM -Dspark.history.kerberos.keytab=/etc/spark/conf/spark.keytab -Dspark.history.ui.acls.enable=true"

3. 啟動和停止

使用系統服務管理叢集

啟動指令碼:

# 在 cdh1 節點上執行
$ sudo service spark-master start

# 在 cdh1 節點上執行,如果 hadoop 叢集配置了 kerberos,則執行之前需要先獲取 spark 使用者的憑證
# kinit -k -t /etc/spark/conf/spark.keytab spark/[email protected]
$ sudo service spark-history-server start

# 在 cdh1、cdh2、cdh3 節點上執行
$ sudo service spark-worker start

停止指令碼:

$ sudo service spark-master stop
$ sudo service spark-worker stop
$ sudo service spark-history-server stop

當然,你還可以設定開機啟動:

$ sudo chkconfig spark-master on
$ sudo chkconfig spark-worker on
$ sudo chkconfig spark-history-server on

執行日誌儲存在 /var/log/spark,如果你配置了 kerberos,則 /var/log/spark/spark-history-server.out 日誌如下:

15/04/02 11:31:56 INFO HistoryServer: Registered signal handlers for [TERM, HUP, INT]
15/04/02 11:31:57 INFO UserGroupInformation: Login successful for user spark/[email protected] using keytab file /etc/spark/conf/spark.keytab
15/04/02 11:31:57 INFO SecurityManager: Changing view acls to: spark
15/04/02 11:31:57 INFO SecurityManager: Changing modify acls to: spark
15/04/02 11:31:57 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(spark); users with modify permissions: Set(spark)
15/04/02 11:31:58 WARN Utils: Service could not bind on port 18080. Attempting port 18081.
15/04/02 11:31:58 INFO Utils: Successfully started service on port 18081.
15/04/02 11:31:58 INFO HistoryServer: Started HistoryServer at http://cdh1:18081

spark-master-web-ui

Ports Used by Spark:

  • 7077 – Default Master RPC port
  • 7078 – Default Worker RPC port
  • 18080 – Default Master web UI port
  • 18081 – Default Worker web UI port

注意:
我這裡使用的是 CDH 版本的 Spark,spark master UI 的埠為18080,不是 Apache Spark 的 8080 埠。

使用 spark 自帶指令碼管理叢集

另外,你也可以使用 spark 自帶的指令碼來啟動和停止,這些指令碼在 /usr/lib/spark/sbin 目錄下:

$ ls /usr/lib/spark/sbin
slaves.sh        spark-daemons.sh  start-master.sh  stop-all.sh
spark-config.sh  spark-executor    start-slave.sh   stop-master.sh
spark-daemon.sh  start-all.sh      start-slaves.sh  stop-slaves.sh

這時候,還需要修改 /etc/spark/conf/slaves 檔案:

# A Spark Worker will be started on each of the machines listed below.
cdh1
cdh2
cdh3

然後,你也可以通過下面指令碼啟動 master:

$ cd /usr/lib/spark/sbin
$ ./start-master.sh

通過下面命令啟動所有節點上的 worker:

$ ./start-slaves.sh

當然,你也可以通過下面方式啟動:

$ ./bin/spark-class org.apache.spark.deploy.worker.Worker spark://cdh1:18080

4. 測試

4.1 執行測試例子

你可以在官方站點檢視官方的例子。 除此之外,Spark 在釋出包的 examples 的資料夾中包含了幾個例子( ScalaJava、Python)。執行 Java 和 Scala 例子時你可以傳遞類名給 Spark 的 bin/run-example指令碼, 例如:

$ ./bin/run-example SparkPi 10

15/04/02 11:45:50 INFO SecurityManager: Changing view acls to: root
15/04/02 11:45:50 INFO SecurityManager: Changing modify acls to: root
15/04/02 11:45:50 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root)
Pi is roughly 3.141808

說明:以上省略了一些日誌,請注意觀察日誌中的 SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root) 這段輸出:執行使用者為 root,而不是當前獲取 kerberos 憑證的使用者。

pyspark

通過 Python API 來執行互動模式:

# 使用2個 Worker 執行緒本地化執行 Spark(理想情況下,該值應該根據執行機器的 CPU 核數設定)
$ ./bin/pyspark --master local[2]

Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ / __/  _/
   /__ / .__/\_,_/_/ /_/\_\   version 1.2.0
      /_/

Using Python version 2.6.6 (r266:84292, Nov 22 2013 12:16:22)
SparkContext available as sc.
>>>

spark shell

你還可以執行 spark shell 的互動模式,在 spark shell 中,已經自動引入了 SparkContext 變數 sc:

spark-shell 不新增 master 引數情況下,預設是本地執行模式,例如,建立一個 RDD:

$ ./bin/spark-shell --master local[2]
15/04/02 11:49:26 INFO SecurityManager: Changing view acls to: root
15/04/02 11:49:26 INFO SecurityManager: Changing modify acls to: root
15/04/02 11:49:26 INFO SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root)
15/04/02 11:49:26 INFO HttpServer: Starting HTTP Server
15/04/02 11:49:26 INFO Utils: Successfully started service 'HTTP class server' on port 47031.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ / __/  _/
   /___/ .__/\_,_/_/ /_/\_\   version 1.2.0
      /_/

Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_45)
scala> val textFile = sc.textFile("README.md")
textFile: spark.RDD[String] = [email protected]

說明:因為我這裡部署的是基於 HDFS 的 Spark 叢集模式,textFile 方法中的檔案為 HDFS 上的路徑,故需要將 README.md 上傳到 HDFS 。

RDD 有一些轉換和動作(請參考 Spark程式設計指南筆記),下面執行一些動作:

scala> textFile.count() // Number of items in this RDD
res0: Long = 126

scala> textFile.first() // First item in this RDD
res1: String = # Apache Spark

下面執行 filter 轉換返回一個新的 RDD:

scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
linesWithSpark: spark.RDD[String] = spark.FilteredRDD@7dd4af09

上面的程式碼可以連起來:

scala> textFile.filter(line => line.contains("Spark")).count() // How many lines contain "Spark"?
res3: Long = 15

執行 spark-shell --help 可以檢視更多的引數,例如:spark-shell 連線到 master 執行:

$ spark-shell --master spark://cdh1:7077 

也可以設定執行核數和增加 jars 引數:

$ spark-shell --master spark://cdh1:7077 --cores 2 --jars code.jar

spark-shell 在 yarn 叢集上以客戶端方式執行:

$ spark-shell --deploy-mode client --master yarn

需要說明的是,Standalone mode does not support talking to a kerberized HDFS,如果你以 spark-shell --master spark://cdh1:7077 方式訪問安裝有 kerberos 的 HDFS 叢集上訪問資料時,會出現下面異常:

15/04/02 11:58:32 INFO TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 6, bj03-bi-pro-hdpnamenn): java.io.IOException: Failed on local exception: java.io.IOException: org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: "cdh1/192.168.56.121"; destination host is: "192.168.56.121":8020;
        org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:764)
        org.apache.hadoop.ipc.Client.call(Client.java:1415)
        org.apache.hadoop.ipc.Client.call(Client.java:1364)
        org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
        com.sun.proxy.$Proxy17.getBlockLocations(Unknown Source)

至於具體原因,待以後根據原始碼進行分析和追蹤;Spark 什麼版本的 Standalone 模式會支援訪問配置有 kerberos 的 HDFS 叢集呢?如果誰知道這兩點,歡迎告訴我!

另外,如果 Spark 執行在 YARN 之上,是可以訪問配置有 kerberos 的 HDFS 叢集的,命令為:

$ spark-shell --deploy-mode client --master yarn

spark-submit

對於 python 程式,我們可以直接使用 spark-submit:

$ mkdir -p /usr/lib/spark/examples/python
$ tar zxvf /usr/lib/spark/lib/python.tar.gz -C /usr/lib/spark/examples/python

$ ./bin/spark-submit examples/python/pi.py 10

對於 Java 程式,我們需要先編譯程式碼然後打包執行:

$ spark-submit --class "SimpleApp" --master local[4] simple-project-1.0.jar

4.2 在叢集上執行

Spark 目前支援三種叢集管理模式:

  • Standalone – 即獨立模式,自帶完整的服務,可單獨部署到一個叢集中,無需依賴任何其他資源管理系統。
  • Apache Mesos – 這是很多公司採用的模式,官方推薦這種模式(當然,原因之一是血緣關係)。正是由於Spark開發之初就考慮到支援Mesos,因此,目前而言,Spark執行在Mesos上會比執行在YARN上更加靈活,更加自然。
  • Hadoop YARN – 這是一種最有前景的部署模式。

另外 Spark 的 EC2 launch scripts 可以幫助你容易地在Amazon EC2上啟動standalone cluster.

  • 在叢集不是特別大,並且沒有 mapReduce 和 Spark 同時執行的需求的情況下,用 Standalone 模式效率最高。
  • Spark可以在應用間(通過叢集管理器)和應用中(如果一個 SparkContext 中有多項計算任務)進行資源排程。

Standalone 模式

該模式,包括一個 Spark master 程序和多個 Spark worker 程序,可單獨部署到一個叢集中,也可以部署到一個節點,以方便測試。該模式無需依賴任何其他資源管理系統,如 Yarn、Mesos。

提交應用

接下來,你可以使用下面的互動式命令連線到叢集:

$ spark-shell --master spark://cdh1:7077

也可以使用 spark-submit script 指令碼來提交一個 Spark 應用到叢集。對於 Standalone 模式,Spark 當前支援兩種部署模式,一種是 client 模式, driver 程式在客戶端提交應用的程序中啟動;一種是 cluster 模式, driver 程式在叢集中的 一個 worker 程序中啟動,客戶端程式在提交任務之後就立即退出。

如果你的應用是通過 Spark submit 啟動,則應用程式 jar 包 會自動分發到各個 worker 節點。對於你的應用依賴的額外 jar 包,你需要通過 --jars引數來定義,例如:--jars jar1,jar2,更多引數定義,請參考 Spark Configuration

另外,Standalone 的 cluster 模式支援你的應用在以非 0 狀態退出後自動重啟。為了使用該特性,你需要新增 --supervise 引數到 spark-submit 之後。這時候,如果你願意,你可以殺掉執行失敗的任務:

$ ./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>

Driver ID 可以從 Master web UI 檢視。

資源排程

Standalone 模式目前僅僅支援 FIFO 的資源排程器。為了控制多個併發的使用者,你可以設定每一個應用使用的最大資源。預設情況下, 每次啟動一個時,其會使用一個叢集中的所有 core。你可以設定 spark.cores.max 引數來控制應用使用的 core 數:

val conf = new SparkConf()
             .setMaster(...)
             .setAppName(...)
             .set("spark.cores.max", "10")
val sc = new SparkContext(conf)

另外,你也可以在 conf/spark-env.sh 配置一個全域性的預設引數 spark.deploy.defaultCores

export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"

高可用

測試

你可以通過 spark-shel l 執行下面的 wordcount 例子:

$ echo "hello world" >test.txt
$ hadoop fs -put test.txt /tmp

$ spark-shell --master spark://cdh1:7077
scala> val file = sc.textFile("hdfs://cdh1:8020/tmp/test.txt")
scala> file.count()

如果出現下面異常,可能是因為 系統可用記憶體不夠

/usr/lib/spark/bin/spark-shell: line 48:  5385 Killed                  "$FWDIR"/bin/spark-submit --class org.apache.spark.repl.Main "${SUBMISSION_OPTS[@]}" spark-shell "${APPLICATION_OPTS[@]}"

執行過程中,還可能會出現下面的錯誤:

14/10/24 14:51:40 WARN hdfs.BlockReaderLocal: The short-circuit local reads feature cannot be used because libhadoop cannot be loaded.
14/10/24 14:51:40 ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library
java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at com.hadoop.compression.lzo.GPLNativeCodeLoader.<clinit>(GPLNativeCodeLoader.java:32)
    at com.hadoop.compression.lzo.LzoCodec.<clinit>(LzoCodec.java:71)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:249)
    at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:1836)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1801)
    at org.apache.hadoop.io.compress.CompressionCodecFactory.getCodecClasses(CompressionCodecFactory.java:128)

解決方法:

cp /usr/lib/hadoop/lib/native/libgplcompression.so $JAVA_HOME/jre/lib/amd64/
cp /usr/lib/hadoop/lib/native/libhadoop.so $JAVA_HOME/jre/lib/amd64/
cp /usr/lib/hadoop/lib/native/libsnappy.so $JAVA_HOME/jre/lib/amd64/

更復雜的一個例子,執行 mapreduce 統計單詞數:

$ spark-shell --master spark://cdh1:7077
scala> val file = sc.textFile("hdfs://cdh1:8020/tmp/data.txt")
scala> val counts = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
scala> counts.saveAsTextFile("hdfs://cdh1:8020/tmp/output")

執行完成之後,你可以檢視 hdfs://cdh1:8020/tmp/output 目錄下的檔案內容。

$ hadoop fs -cat /tmp/output/part-00000
(hello,1)
(world,1)

使用 spark-submit 以 Standalone 模式執行 SparkPi 程式,並制定 master 引數為連線某一個 master 節點:

$ spark-submit --class org.apache.spark.examples.SparkPi  --master spark://cdh1:7077 /usr/lib/spark/lib/spark-examples-1.2.0-cdh5.3.0-hadoop2.5.0-cdh5.3.0.jar 10

Spark On Mesos 模式

Spark on Yarn 模式

Spark on Yarn 模式同樣也支援兩種在 Yarn 上啟動 Spark 的方式,一種是 cluster 模式,Spark driver 在 Yarn 的 application master 程序中執行,客戶端在應用初始化完成之後就會退出;一種是 client 模式,Spark driver 執行在客戶端程序中。

Spark on Yarn 模式是可以訪問配置有 kerberos 的 HDFS 檔案的。

以 cluster 模式啟動,命令如下:

$ spark-submit --class path.to.your.Class --deploy-mode cluster --master yarn [options] <app jar> [app options]

以 client 模式啟動,命令如下:

$ spark-submit --class path.to.your.Class --deploy-mode client --master yarn [options] <app jar> [app options]

舉例:

$ spark-submit --class org.apache.spark.examples.SparkPi \
    --deploy-mode cluster  \
    --master yarn  \
    --num-executors 3 \
    --driver-memory 4g \
    --executor-memory 2g \
    --executor-cores 1 \
    --queue thequeue \
    /usr/lib/spark/lib/spark-examples-1.2.0-cdh5.3.0-hadoop2.5.0-cdh5.3.0.jar \
    10

注意:Apache 版本的 spark 中的啟動命令為:

$ spark-submit --class path.to.your.Class --master yarn-cluster [options] <app jar> [app options]

執行在 YARN 叢集之上的時候,可以手動把 spark-assembly 相關的 jar 包拷貝到 hdfs 上去,然後設定 SPARK_JAR 環境變數:

$ hdfs dfs -mkdir -p /user/spark/share/lib
$ hdfs dfs -put $SPARK_HOME/lib/spark-assembly.jar  /user/spark/share/lib/spark-assembly.jar

$ SPARK_JAR=hdfs://<nn>:<port>/user/spark/share/lib/spark-assembly.jar

5. Spark-SQL

Spark 安裝包中包括了 Spark-SQL ,執行 spark-sql 命令,在 cdh5.2 中會出現下面異常:

$ cd /usr/lib/spark/bin
$ ./spark-sql
java.lang.ClassNotFoundException: org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:319)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

Failed to load Spark SQL CLI main class org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.
You need to build Spark with -Phive.

在 cdh5.3 中會出現下面異常:

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.cli.CliDriver
  at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
  ... 18 more

從上可以知道 Spark-SQL 編譯時沒有整合 Hive,故需要重新編譯 spark 原始碼。

編譯 Spark-SQL

下載程式碼:

$ git clone [email protected]:cloudera/spark.git
$ cd spark
$ git checkout -b origin/cdh5-1.2.0_5.3.0

編譯程式碼,整合 yarn 和 hive,有三種方式:

$ sbt/sbt -Dhadoop.version=2.5.0-cdh5.3.0 -Pyarn -Phive assembly

等很長很長一段時間,會提示錯誤。

改為 maven 編譯:

修改根目錄下的 pom.xml,新增一行 <module>sql/hive-thriftserver</module>

<modules>
    <module>core</module>
    <module>bagel</module>
    <module>graphx</module>
    <module>mllib</module>
    <module>tools</module>
    <module>streaming</module>
    <module>sql/catalyst</module>
    <module>sql/core</module>
    <module>sql/hive</module>
    <module>sql/hive-thriftserver</module> <!--新增的一行-->
    <module>repl</module>
    <module>assembly</module>
    <module>external/twitter</module>
    <module>external/kafka</module>
    <module>external/flume</module>
    <module>external/flume-sink</module>
    <module>external/zeromq</module>
    <module>external/mqtt</module>
    <module>examples</module>
  </modules>

然後執行:

$ export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
$ mvn -Pyarn -Dhadoop.version=2.5.0-cdh5.3.0 -Phive -Phive-thriftserver -DskipTests clean package

如果編譯成功之後, 會在 assembly/target/scala-2.10 目錄下生成:spark-assembly-1.2.0-cdh5.3.0.jar,在 examples/target/scala-2.10 目錄下生成:spark-examples-1.2.0-cdh5.3.0.jar,然後將 spark-assembly-1.2.0-cdh5.3.0.jar 拷貝到 /usr/lib/spark/lib 目錄,然後再來執行 spark-sql。

但是,經測試 cdh5.3.0 版本中的 spark 的 sql/hive-thriftserver 模組存在編譯錯誤,最後無法編譯成功,故需要等到 cloudera 官方更新原始碼或者等待下一個 cdh 版本整合 spark-sql。

6. 總結

本文主要介紹了 CDH5 叢集中 Spark 的安裝過程以及叢集執行模式:

  • Standalone – spark-shell --master spark://host:port 或者 spark-shell --master local
  • Apache Mesos – spark-shell --master mesos://host:port
  • Hadoop YARN – spark-shell --master yarn

關於 Spark 的更多介紹可以參考官網或者一些中文翻譯的文章

7. 參考文章

轉載: http://blog.javachen.com/2014/07/01/spark-install-and-usage/

相關推薦

Spark叢集安裝WordCount編寫

一、Spark概述 官網:http://spark.apache.org/ Apache Spark™是用於大規模資料處理的統一分析引擎。 為大資料處理而設計的快速通用的計算引擎。 Spark加州大學伯克利分校AMP實驗室。不同於mapreduce的是一個Sp

Spark叢集安裝使用

本文主要記錄 CDH5 叢集中 Spark 叢集模式的安裝過程配置過程並測試 Spark 的一些基本使用方法。 安裝環境如下: 作業系統:CentOs 6.5Hadoop 版本:cdh-5.3.0Spark 版本:cdh5-1.2.0_5.3.0關於 yum 源的配置以及 Hadoop 叢集的安裝,請參考

Spark簡介安裝簡單例子

可用 spa nbsp tgz class 高效 ota zookeep 進入 Spark簡介 Spark是一種快速、通用、可擴展的大數據分析引擎,目前,Spark生態系統已經發展成為一個包含多個子項目的集合,其中包含SparkSQL、Spark Streaming、Gra

Spark叢集安裝搭建

1.下載Spark Spark是一個獨立的記憶體計算框架,如果不考慮儲存的話,可以完全獨立執行,因此這裡就只安裝Spark叢集 Spark下載地址:       http://spark.apache.org/downloads.html 選

03. CouchBase叢集安裝配置(02)-CouchBase從0到50

4.叢集配置 couchbase叢集可以採用2種方式配置 直接ip叢集互聯 通過hostname叢集互聯 為了方便以後的維護和變更,我們採用hostname的進行配置。 首先確保三臺測試機之間網路互通,防護牆,selinux和埠之類的都配置ok了。 4.1 hosts設定 配置三臺機

Spark】Ubuntu16.04 spark 叢集安裝 (standalone模式)

一、前言 目前 Apache Spark 支援三種分散式部署方式,分別是: standalone spark on mesos spark on YARN 其中,第一種類似於MapReduce 1.0所採用的模式,內部實現了容錯性和資源管理,後兩種則是未來發

storm概述、叢集安裝簡單的命令列操作

http://storm.apache.org Apache Storm是一個免費的開源分散式實時計算系統。Storm可以輕鬆可靠地處理無限資料流,實現Hadoop對批處理所做的實時處理。Storm非常簡單,可以與任何程式語言一起使用,並且使用起 來很有趣! Storm有許多用例:實時分析,

kafka2.9.2的分散式叢集安裝demo(java api)測試

問題導讀1、什麼是kafka?2、kafka的官方網站在哪裡?3、在哪裡下載?需要哪些元件的支援?4、如何安裝?  一、什麼是kafka?  kafka是LinkedIn開發並開源的一個分散式MQ系統,現在是Apache的一個孵化專案。在它的主頁描述kafka為一個高吞吐量

hadoop3節點叢集安裝spark叢集安裝

一 : 修改機器名 1. 修改3臺機器的機器名,注意名字不要帶下劃線 修改機器名命令: hostnamectl set-hostname xxxx 然後退出shell重新登陸 修改3臺機器的hosts檔案 vim /etc/hosts 新增以下內容 192.107.53.157 had

CentOS6u9 Oracle11g RAC 搭建部署(三)叢集安裝PSU補丁升級

6-叢集安裝: 1° 安裝grid: # 將安裝包上傳到某一個節點即可 chown grid: /tmp/p13390677_112040_Linux-x86-64_3of7.zip su - grid cd /tmp/ unzip p13390677_

Spark叢集安裝及Streaming除錯

安裝前置條件 1.         系統需要安裝the Oracle Java Development Kit(not OpenJDK),安裝jdk1.7以上,下載目錄:http://www.oracle.com/technetwork/java/javase/downlo

Hadoop+Spark叢集安裝步驟詳解

一、環境:作業系統版本:SUSE Linux Enterprise Server 11 (x86_64) SP3主機名:192.168.0.10    node1192.168.0.11    node2192.168.0.12    node3192.168.0.13   

spark叢集安裝與配置

Spark有三種執行模式,分別為: local模式-只執行在本地,相當於偽分散式 standalone模式-這種模式只需要安裝Spark即可,使用自帶的資源管理器 Spark on yarn/mesos模式-這種模式Spark將使用yarn/mesos作為資源管理器 一般來

Linux下Spark安裝配置

一.安裝JDK(略) 二.安裝Scala(l略) 三.安裝Spark   1.上傳安裝包到叢集節點   2.解壓安裝包   3.修改配置檔案 a.spark-env.sh vi spark-env.sh b.slaves vi slaves

Spark本地安裝簡單示例

sudo yum install java-1.7.0-openjdk.i686 sudo yum install maven-noarch maven-release-manager.noarch maven-release-plugin.noarch sudo yum

Spark叢集安裝

    Spark的版本1.6.0,Scala的版本2.12,jdk版本1.8。最近使用spark,在這裡記錄

Spark叢集安裝方式2

    環境: jdk1.8、hadoop-2.7、spark-1.6、三臺centos7(如下List-1所

Centos7 Redis5.0.5 三主三從叢集安裝環境配置

Centos7 Redis5.0.5 三主三從叢集安裝和環境配置 1.下載Redis 開啟redis官網https://red

Docker下安裝HadoopSpark叢集

Docker下Spark分散式叢集搭建 本教程使用docker模擬3臺主機搭建分散式Spark叢集,屬於偽分散式: 1、Docker安裝 2、下載已經配置好的Spark叢集映象檔案 3、新建3個容器,分別命名為cloud8,cloud9,cloud10 4

spark單機模式 叢集模式 安裝

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>