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
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 的資料夾中包含了幾個例子( Scala、Java、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下安裝Hadoop和Spark叢集
Docker下Spark分散式叢集搭建 本教程使用docker模擬3臺主機搭建分散式Spark叢集,屬於偽分散式: 1、Docker安裝 2、下載已經配置好的Spark叢集映象檔案 3、新建3個容器,分別命名為cloud8,cloud9,cloud10 4
spark單機模式 和 叢集模式 安裝
浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>