本文參考自:https://blog.csdn.net/ouyangyanlan/article/details/52355350
原文中有Hadoop相關內容,我這邊沒有使用相關功能,於是忽略Hadoop的相關安裝和配置操作。
前面我們已經學習了spark的基礎知識了,那我們就來實際操練一下。我們的數據量並不大,所以本文搭建的是一個單機版的spark。服務端和客戶端都是在同一個機器上。
首先,spark分爲
- 服務端
- 客戶端。
此處我們使用Python客戶端(spark支持Scala、Java和Python這3種客戶端)。
客戶端比較簡單,安裝對應的工具包,導入項目即可。
服務端比較複雜,需要以下3個:
- Java8環境
- Scala環境
- spark
一、spark服務端安裝
1.1 安裝Java8
安裝Java環境,參見我的另一篇博客:https://blog.csdn.net/gaitiangai/article/details/103009888
1.2 安裝Scala
這個比較簡單,下載、解壓,配置環境變量即可。
1.2.1 Scala下載
進入Scala官網:https://www.scala-lang.org/download/
拉到底,點擊下載我圈中的這個,然後移動到你的Linux系統中。
1.2.2 Scala安裝配置
解壓Scala
tar -zxf 你的tgz壓縮包名稱
配置環境變量(我是解壓到/usr/local/share/scala目錄下的)
vim /etc/profile
#在文件的末尾加入:
export PATH="$PATH:/usr/local/share/scala/bin"
#此處地址需要修改爲你的Scala文件地址
輸入 :wq! 保存退出。運行配置文件使之生效 :
source /etc/profile
測試安裝結果:
[root@localhost ~]# scala
Welcome to Scala 2.13.0 (OpenJDK 64-Bit Server VM, Java 1.8.0_171).
Type in expressions for evaluation. Or try :help.
scala>
命令行輸入Scala,輸出入頁面所示內容則安裝成功,反之失敗。
1.3 安裝spark
1.3.1下載spark
進入官方下載網站:http://spark.apache.org/downloads.html
第 1 個選項選擇你想要安裝的spark版本,第 2 個選項需要和你的Hadoop版本對應(我們不使用Hadoop,所以我沒有安裝,此處就隨便選了),然後點擊第 3 個選項裏面的下載鏈接,進入如下頁面:
點擊我紅色圈中的鏈接,開始下載。
1.3.2 安裝配置spark
解壓spark文件即可。無需配置。
tar -zxf 你的spark壓縮文件名字
1.4 啓動spark服務端
spark有4中啓動模式,各模式介紹如下:
方式1:本地模式
Spark單機運行,一般用於開發測試。
方式2:Standalone模式
構建一個由Master+Slave構成的Spark集羣,Spark運行在集羣中。
方式3:Spark on Yarn模式
Spark客戶端直接連接Yarn。不需要額外構建Spark集羣。
方式4:Spark on Mesos模式
Spark客戶端直接連接Mesos。不需要額外構建Spark集羣。
啓動方式: spark-shell.sh(Scala)
spark-shell通過不同的參數控制採用何種模式進行。主要涉及master 參數:
--master MASTER_URL
# MASTER_URL 此參數指導spark的啓動模式,有以下取值可供選擇:
# local.
# spark://host:port,
# yarn,
# mesos://host:port,
eg: 本地模式啓動:
./spark-shell --master local
./spark-shell --master local[2] # 本地運行,兩個worker線程,理想狀態下爲本地CPU core數
eg: Standalone模式啓動:
./spark-shell --master spark://192.168.1.10:7077
OK,都安裝好了,啓動方式也都瞭解了,讓我們來試一下, 好激動。
首先我們切換到spark的bin目錄,
[root@localhost bin]# ls
beeline pyspark spark-class.cmd spark-sql
beeline.cmd pyspark2.cmd sparkR spark-sql2.cmd
docker-image-tool.sh pyspark.cmd sparkR2.cmd spark-sql.cmd
find-spark-home run-example sparkR.cmd spark-submit
find-spark-home.cmd run-example.cmd spark-shell spark-submit2.cmd
load-spark-env.cmd spark-class spark-shell2.cmd spark-submit.cmd
load-spark-env.sh spark-class2.cmd spark-shell.cmd
[root@localhost bin]# ./spark-shell --master local
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.spark.SparkConf$.<init>(SparkConf.scala:716)
at org.apache.spark.SparkConf$.<clinit>(SparkConf.scala)
at org.apache.spark.SparkConf$$anonfun$getOption$1.apply(SparkConf.scala:389)
at org.apache.spark.SparkConf$$anonfun$getOption$1.apply(SparkConf.scala:389)
at scala.Option.orElse(Option.scala:289)
at org.apache.spark.SparkConf.getOption(SparkConf.scala:389)
at org.apache.spark.SparkConf.get(SparkConf.scala:251)
at org.apache.spark.deploy.SparkHadoopUtil$.org$apache$spark$deploy$SparkHadoopUtil$$appendS3AndSparkHadoopConfigurations(SparkHadoopUtil.scala:463)
at org.apache.spark.deploy.SparkHadoopUtil$.newConfiguration(SparkHadoopUtil.scala:436)
at org.apache.spark.deploy.SparkSubmit$$anonfun$2.apply(SparkSubmit.scala:323)
at org.apache.spark.deploy.SparkSubmit$$anonfun$2.apply(SparkSubmit.scala:323)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:323)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:774)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:161)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:184)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:920)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:929)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain: Name or service not known
at java.net.InetAddress.getLocalHost(InetAddress.java:1505)
at org.apache.spark.util.Utils$.findLocalInetAddress(Utils.scala:946)
at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress$lzycompute(Utils.scala:939)
at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress(Utils.scala:939)
at org.apache.spark.util.Utils$$anonfun$localCanonicalHostName$1.apply(Utils.scala:996)
at org.apache.spark.util.Utils$$anonfun$localCanonicalHostName$1.apply(Utils.scala:996)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.util.Utils$.localCanonicalHostName(Utils.scala:996)
at org.apache.spark.internal.config.package$.<init>(package.scala:302)
at org.apache.spark.internal.config.package$.<clinit>(package.scala)
... 20 more
Caused by: java.net.UnknownHostException: localhost.localdomain: Name or service not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getLocalHost(InetAddress.java:1500)
... 29 more
這麼多錯,慌的一批。沒關係,百度一下我就知道。
錯誤信息這麼多,但是仔細看就是這個:
Caused by: java.net.UnknownHostException: localhost.localdomain: Name or service not known
就是說localhost.localdomain這個域名解析失敗。應爲我們是在本機啓動,這就是127.0.01啊,解析失敗,咋辦呢?既然它解析不出來,那我們就去給他寫上:
vim /etc/hosts
添加這麼一行:
127.0.0.1 localhost.localdomain localhost
然後:wq!保存退出。
再次啓動就正常啦。輸出如下,開心!
(py3.7) [root@localhost bin]# ./spark-shell --master local
19/11/20 14:21:21 WARN Utils: Your hostname, localhost.localdomain resolves to a loopback address: 127.0.0.1; using 172.17.20.145 instead (on interface eth0)
19/11/20 14:21:21 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
19/11/20 14:21:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
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://172.17.20.145:4040
Spark context available as 'sc' (master = local, app id = local-1574230900574).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
二、安裝spark客戶端
2.1 首先安裝Python的spark工具包
pip install pyspark
我這裏沒有輸入需要安裝的版本,默認安裝的是最新版本2.4.4,
你也可以寫入你具體想要安裝的版本:
pip install pyspark==2.4.4 #2.4.4就是你想要安裝的具體版本號
200多兆呢,耐心等待吧,你也可以去泡一杯茶喝起來。
2.2、測試是否安裝成功
編寫test_spark.py 文件如下:
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
print("1111111111111111")
firstRDD = sc.parallelize([('sfs',27),('hk',26),('czp',25),('hdc',28),('wml',27)])
print("222222222")
t=firstRDD.take(3)
print(t)
執行該代碼,觀察輸出結果。正常輸出信息則環境OK,反之則環境不正常,需要排查。
我的執行結果:
(py3.7) [root@localhost 1119]# python test_spark.py
19/11/20 14:40:00 WARN Utils: Your hostname, localhost.localdomain resolves to a loopback address: 127.0.0.1; using 172.17.20.145 instead (on interface eth0)
19/11/20 14:40:00 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
19/11/20 14:40:01 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark""s default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
19/11/20 14:40:04 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
1111111111111111
222222222
[Stage 0:> ([('sfs', 27), ('hk', 26), ('czp', 25)]
OK, 一切正常。
注意:
但是很多人可能不知道,pyspark裏面也有一個spark!你可以切換到pyspark的安裝目錄下去看。默認Python使用的是pyspark裏面的spark,而不是剛剛我們安裝的spark。想要系統使用我們剛剛安裝的spark,需要將其配置在環境變量中:
vim /etc/profile
#在文件的末尾加入:
export SPARK_HOME="xxxx"
#此處xxx需要修改爲你的spark安裝目錄