我的 Spark 3.1.1 之旅【收藏夾吃灰系列】
點(diǎn)擊藍(lán)色“有關(guān)SQL”關(guān)注我喲
加個(gè)“星標(biāo)”,天天與10000人一起快樂(lè)成長(zhǎng)

圖 | 榖依米
大數(shù)據(jù)三部曲終于完成了:
本篇是最后一部,《我的 Spark 3.1.1 之旅》。
如今使用 CDH( Cloudera Distribution Hadoop) 部署 Hadoop 成了業(yè)界常規(guī),為什么還要費(fèi)勁自己動(dòng)手呢?這不浪費(fèi)時(shí)間嘛!
是的。時(shí)間投入蠻大的,不算寫(xiě)文章,搭建過(guò)程也得有 20多個(gè)小時(shí)。白天忙公司項(xiàng)目,都已經(jīng)焦頭爛額,回到家,還得花上 2-3 小時(shí),熬到深夜。
搭建過(guò)程,難熬的是,遇到卡點(diǎn),找不到解決方法。抓狂,質(zhì)疑,懷疑人生,不停對(duì)自己說(shuō)放棄,但最后一刻,總能在一杯杯熱咖啡的陪伴下,找到破解。
一切技術(shù)難點(diǎn),都是紙糊的。我們要做的,只有埋頭苦干,與等待!
浪費(fèi)時(shí)間,給自己找罪受?No, 這正是我享受的地方!
初學(xué)數(shù)據(jù)庫(kù)時(shí),我把 Oracle 反復(fù)裝了 50 多遍。Solaris, Redhat, CentOS,能找到的操作系統(tǒng),我都裝了。哪個(gè) Linux 容易裝,網(wǎng)絡(luò)不穩(wěn)定會(huì)出什么問(wèn)題,磁盤(pán)不夠用會(huì)有什么癥狀,RAC 該如何配置,等等,都經(jīng)歷了一遍。之后看到問(wèn)題,心里才沒(méi)有初學(xué)時(shí)那種慌張。
搭建大數(shù)據(jù)環(huán)境也一樣。CDH/Hortonworks/MapR, 這些廠(chǎng)商都給封裝完了,純 UI 式安裝管理,開(kāi)發(fā)用得挺爽。但某天爆出一個(gè) Hive Authentication exception, 如果不知道有 hive-site.xml 這回事,不知道 hive.server2.authentication, 處理起來(lái),兩眼一抹黑,只能傻傻等待重啟了!
所以,我還是會(huì)選擇,多自己動(dòng)手,從 0 到 1 玩一樣?xùn)|西。雖然少看了很多藍(lán)光高清電影,但這個(gè)過(guò)程是值得的!

以下是這次分享的主題:
巧婦也做有米之炊: 準(zhǔn)備安裝文件 買(mǎi)鍋造爐:集群搭建 生米煮成熟飯之后:集群?jiǎn)?dòng)與關(guān)閉 真香系列:Spark Shell 獨(dú)食記
A
準(zhǔn)備安裝文件
Spark 是一個(gè)分布式計(jì)算框架,通過(guò)集群部署,可以發(fā)揮并發(fā)計(jì)算的優(yōu)勢(shì)。
其與 Hadoop, Hive 天然集成的策略,讓計(jì)算更貼近本地?cái)?shù)據(jù),完成快速計(jì)算,提高效率。
所以在本次實(shí)驗(yàn)中,我把 Spark 部署到了 Hadoop 集群中,發(fā)揮最大的優(yōu)勢(shì)。當(dāng)然,實(shí)際運(yùn)用中,完成可以有不同的部署方法。
既然是與 hadoop 結(jié)合起來(lái)運(yùn)用,那么選擇 Spark 版本就很重要了。

Spark 官網(wǎng):https://spark.apache.org/downloads.html
對(duì)應(yīng)的,Scala 版本也應(yīng)該選擇 Scala 2.12. Scala 是 Spark 預(yù)編譯語(yǔ)言,用來(lái)開(kāi)發(fā) Spark 應(yīng)用最自然。
總結(jié)下,完成此次部署,需要的軟件有:
Spark 3.1.1 Scala 2.12
Scala 下載官網(wǎng):https://www.scala-lang.org/download/
A
集群搭建
搭建 Spark ,首要的事情,是規(guī)劃好 master 節(jié)點(diǎn)與 worker 節(jié)點(diǎn)。與前面的兩部曲相結(jié)合,本次實(shí)驗(yàn)共有 3 臺(tái)計(jì)算機(jī),對(duì)應(yīng)的 host 與 IP 如下:
namenode 192.168.31.10
nodea 192.168.31.11
nodeb 192.168.31.12
namenode 上運(yùn)行了 HDFS 的 namenode, YARN 的 ResourceManager,還有本次的 Spark Master. nodea 和 nodeb 上運(yùn)行了 HDFS 的 datanode, YARN 的 NodeManager,還有 Spark Worker.
接下來(lái)配置每臺(tái)計(jì)算機(jī)的環(huán)境變量,以及 Spark 集群參數(shù).
環(huán)境變量
環(huán)境變量,提供了快捷訪(fǎng)問(wèn)可執(zhí)行文件的路徑。
本次實(shí)驗(yàn)主要配置 Spark Home 與 Scala Home.
SPARK_HOME=/opt/Spark/Spark3.1.1
SCALA_HOME=/opt/Scala/Scala2.12
export SPARK_HOME
export SCALA_HOME
PATH=$PATH:$PARK_HOME/bin:$SCALA_HOME/bin
export PATH
除了要建立相應(yīng)的文件目錄,目錄訪(fǎng)問(wèn)權(quán)限需要單獨(dú)配置。為了實(shí)驗(yàn)方便,設(shè)置這兩目錄為 HadoopAdmin 所有,并且給目錄加上 777 的權(quán)限。
chown -R hadoopadmin /opt/Spark
chown -R hadoopadmin /opt/Scala
chmod a+rwx /opt/Spark
chmod a+rwx /opt/Scala
但事實(shí)證明,Scala 的 RPM 包,不能指定目錄安裝,而只能隨遇而安:
[hadoopadmin@namenode Scala]$ rpm -qpi scala-2.12.13.rpm
Name : scala
Version : 2.12.13
Release : 1
Architecture: noarch
Install Date: (not installed)
Group : Development/Languages
Size : 634532234
License : BSD
Signature : (none)
Source RPM : scala-2.12.13-1.src.rpm
Build Date : Tue 12 Jan 2021 10:16:51 AM EST
Build Host : travis-job-efec1d00-ea82-450c-8151-6fc45a7e286d
Relocations : (not relocatable)
Vendor : lightbend
URL : http://github.com/scala/scala
Summary : Scala Programming Language Distribution
Description :
Have the best of both worlds. Construct elegant class hierarchies for maximum code reuse and extensibility, implement their behavior using higher-order functions. Or anything in-between.
通過(guò) rpm -qpi 查詢(xún)得知,scala 的 relocations 屬性為 not relocatable, 即,無(wú)法指定安裝路徑。
但安裝之后,通過(guò)
whereis scala
可以找到 scala 的安裝目錄。
[hadoopadmin@namenode Scala]$ whereis scala
scala: /usr/bin/scala /usr/share/scala /usr/share/man/man1/scala.1.gz
所以,SCALA_HOME 指定 /usr/share/scala.
最終,在 .bashrc 文件中,加入這些環(huán)境變量:
SPARK_HOME=/opt/Spark/Spark3.1.1
SCALA_HOME=/usr/share/scala
PATH=$PATH:$SPARK_HOME/bin:$SCALA_HOME/bin
集群參數(shù)配置
為了可以和 Hive 做交互,把 Hive-site.xml 復(fù)制到 $SPARK_HOME/conf 下面。 配置 spark-env.sh. 在 $SPARK_HOME/conf 下可能沒(méi)有 spark-env.sh 文件,需要將 spark-env.sh.template 復(fù)制一份成 spark-env.sh:
--spark-env.sh
JAVA_HOME=/opt/java/jdk8
HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
HADOOP_CONF_DIR=/opt/Hadoop/hadoop-3.2.2/etc/hadoop
YARN_CONF_DIR=/opt/Hadoop/hadoop-3.2.2/etc/hadoop
SPARK_CONF_DIR=/opt/Spark/Spark3.1.1/conf
SPARK_MASTER_HOST=namenode
將 nodea/nodeb 加入到 $SPARK_HOME/workers 文件中。
-- workers
nodea
nodeb
通過(guò) scp 把 /opt/Spark 復(fù)制到 nodea 和 nodeb 上
scp -rv $SPARK_HOME hadoopadmin@nodea:$SPARK_HOME
scp -rv $SPARK_HOME hadoopadmin@nodeb:$SPARK_HOME
A
Spark 集群?jiǎn)?dòng)與關(guān)閉
啟動(dòng)
Spark 集群的啟動(dòng),有兩種方式。一種是可以把 Master 與 worker 分開(kāi)來(lái)處理。即,先啟動(dòng) master 節(jié)點(diǎn),worker 節(jié)點(diǎn)之后一臺(tái)一臺(tái)手工啟動(dòng);第二種是,用一個(gè)啟動(dòng)文件,將 master 和 worker 同時(shí)啟動(dòng)。
本次實(shí)驗(yàn),選擇第二種方法:
$SPARK_HOME/sbin/start-all.sh
因?yàn)?spark 與 hadoop 裝在了同一臺(tái)機(jī)器上,而 hadoop 的簡(jiǎn)易啟動(dòng)命令文件也是 start-all.sh , 所以這里指定了下全目錄文件名。
關(guān)閉
同上,stop-all.sh 和 hadoop 的關(guān)閉腳本同名,指定下全目錄文件名:
$SPARK_HOME/sbin/stop-all.sh
監(jiān)控頁(yè)
可通過(guò)本地8080端口,訪(fǎng)問(wèn) Spark 集群的監(jiān)控頁(yè)。

A
Spark Shell 應(yīng)用
最簡(jiǎn)單的使用 Spark 集群的方式,就是利用集成的 spark-shell 腳本
[hadoopadmin@namenode bin]$ spark-shell
2021-04-11 07:56:21,588 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://namenode:4040
Spark context available as 'sc' (master = local[*], app id = local-1618142189348).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 3.1.1
/_/
Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_281)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
現(xiàn)在做一個(gè)例子,把 frank_lin.txt 這個(gè)原本在 HDFS 上的文本文件,復(fù)制到 HDFS 的 /user/hadoopadmin 目錄下(如果沒(méi)有 hadoopadmin 目錄就建一個(gè))
hdfs dfs -cp /user/hadoop/wordcounter/input/franklin.txt /user/hadoopadmin/
接著用 spark 來(lái)統(tǒng)計(jì),改文件共有多少行:
scala> val textfile_franklin=spark.read.textFile("franklin.txt")
textfile_franklin: org.apache.spark.sql.Dataset[String] = [value: string]
scala> textfile_franklin.count()
res1: Long = 2773
注意,這里的 spark 默認(rèn)用戶(hù)路徑是 HDFS 上的 /user/hadoopadmin.
scala> val textfile = spark.read.textFile("README.md")
org.apache.spark.sql.AnalysisException: Path does not exist: hdfs://namenode:9000/user/hadoopadmin/README.md
通過(guò)訪(fǎng)問(wèn) namenode:4040 可看到應(yīng)用的執(zhí)行情況

A
小結(jié)
往期精彩:
我在面試數(shù)據(jù)庫(kù)工程師候選人時(shí),常問(wèn)的一些題
零基礎(chǔ) SQL 數(shù)據(jù)庫(kù)小白,從入門(mén)到精通的學(xué)習(xí)路線(xiàn)與書(shū)單
