title: Linux-Spark使用文檔.md
tags: 2019年 08月 11號
notebook: 00技術筆記
1. Spark簡介
1.1. Spark說明
Apache Spark是一個圍繞速度、易用性和複雜分析構建的大數據處理框架,最初在2009年由加州大學伯克利分校的AMPLab開發,並於2010年成爲Apache的開源項目之一,與Hadoop和Storm等其他大數據和MapReduce技術相比,Spark有如下優勢:
- Spark提供了一個全面、統一的框架用於管理各種有着不同性質(文本數據、圖表數據等)的數據集和數據源(批量數據或實時的流數據)的大數據處理的需求
- 官方資料介紹Spark可以將Hadoop集羣中的應用在內存中的運行速度提升100倍,甚至能夠將應用在磁盤上的運行速度提升10倍
1.2. Spark框架
spark運行流程圖
Spark架構
詳見參考鏈接:https://blog.csdn.net/swing2008/article/details/60869183
1.3. Hadoop說明
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。
Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。
Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS爲海量的數據提供了存儲,而MapReduce則爲海量的數據提供了計算
Hadoop優點:
- 高可靠性。Hadoop按位存儲和處理數據的能力值得人們信賴。
- 高擴展性。Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。
- 高效性。Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。
- 高容錯性。Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。
- 低成本。與一體機、商用數據倉庫以及QlikView、Yonghong Z-Suite等數據集市相比,hadoop是開源的,項目的軟件成本因此會大大降低。
Hadoop框架
Hadoop有兩個核心模塊,分佈式存儲模塊HDFS和分佈式計算模塊Mapreduce.
1.4. Yarn框架說明
由於原有框架JobTracker/TaskTracker需要大規模的調整來修復它在可擴展性,內存消耗,線程模型,可靠性和性能上的缺陷,所以推出了Yarn框架。
- 參考鏈接:https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
Yarn框架核心在於將資源管理和任務調度/監控拆分。
- 資源管理器: 全局管理所有應用程序計算資源的分配
- 每一個應用的 ApplicationMaster 負責相應的調度和協調
- ResourceManager 和每一臺機器的節點管理服務器能夠管理用戶在那臺機器上的進程並能對計算進行組織
- ResourceManager :中心服務,調度和啓動Job中的ApplicationMaster,並監控ApplicationMaster存在情況
- NodeManager : 負責 Container 狀態的維護,並向 ResourceManager 返回日誌
- ApplicationMaster :負責一個 Job 生命週期內的所有工作
2. Spark環境部署
不同部署模式
- Standalone模式:獨立部署模式
- Apache Mesos
- Hadoop YARN
- Kubernetes
版本說明:
- Spark 2.4.0
- Scala 2.12
- Spark和Hadoop版本必須相互配合
2.1. 安裝Scala
Spark支持Scala、Java和Python等語言,不過Spark是採用Scala語言開發,所以必須先安裝Scala.
步驟1:下載
Scala-2.12.7下載地址
wget https://downloads.lightbend.com/scala/2.12.7/scala-2.12.7.tgz
步驟2:解壓
# 創建目錄
tar -zxvf scala-2.12.7.tgz
sudo mv scala-2.12.7 /usr/local/scala
sudo chown scfan:scfan -R /usr/local/scala
步驟3:配置環境變量
# 打開文件
sudo vim /etc/profile
# 添加內容如下
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin:$PATH
步驟4:生效與驗證
(env) [scfan@WOM ~]$ source /etc/profile
(env) [scfan@WOM ~]$ scala
Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171).
Type in expressions for evaluation. Or try :help.
scala>
2.2. 安裝Spark
步驟1:下載
wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
步驟2:解壓
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz
sudo mv spark-2.4.0-bin-hadoop2.7 /usr/local/spark
sudo chown -R scfan:scfan /usr/local/spark
步驟3:配置環境變量
# 打開文件
sudo vim /etc/profile
# 添加內容如下
# Spark path
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH
步驟4:生效與驗證
(env) [scfan@WOM ~]$ source /etc/profile
(env) [scfan@WOM spark]$ source /etc/profile
(env) [scfan@WOM spark]$ pyspark
Python 2.7.11 (default, Apr 10 2018, 16:42:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
2018-12-06 15:37:54 WARN NativeCodeLoader:62 - 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).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.0
/_/
Using Python version 2.7.11 (default, Apr 10 2018 16:42:22)
SparkSession available as 'spark'.
>>>
步驟5:啓動Spark
(env) [scfan@WOM spark]$ ./bin/spark-shell --master local[2]
2018-12-06 15:49:10 WARN NativeCodeLoader:62 - 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://WOM:4040
Spark context available as 'sc' (master = local[2], app id = local-1544082590634).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.0
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
頁面UI: http://WOM:4040
2.3. 安裝Hadoop(本地單節點)
安裝步驟
- 安裝JDK 1.8+
- 設置SSH無密鑰登錄
- 下載安裝Hadoop
- 設置環境變量
- 設置Hadoop配置文件
- 創建並格式化HDFS目錄
- 啓動Hadoop
- 打開Web頁面
2.3.1. 下載安裝Hadoop
官網:https://hadoop.apache.org/releases.html
# 下載
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
# 解壓
tar -zxvf hadoop-2.7.7.tar.gz
# 遷移
sudo mv hadoop-2.7.7 /usr/local/hadoop
# 授權
sudo chown scfan:scfan -R usr/local/hadoop
2.3.2. 設置環境變量
文件 /etc/profile
## hadoop home
export HADOOP_HOME=/usr/local/hadoop
# hadoop path
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
# hadoop else env
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# hadoop lib
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
2.3.3. 修改Hadoop配置文件
配置文件:/usr/local/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_171
HDFS默認名稱 /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
MapReduce配置 /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!-- 後續如果 spark-yarn 部署報錯,需要解開此處
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
-->
</configuration>
Job配置 /usr/local/hadoop/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<vaule>yarn</vaule>
</property>
</configuration>
HDFS分佈式文件系統 /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<vlaue>3</vlaue>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<vlaue>file:/usr/local/hadoop/hadoop_data/hdfs/namenode</vlaue>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<vlaue>file:/usr/local/hadoop/hadoop_data/hdfs/datanode</vlaue>
</property>
</configuration>
2.3.4. 格式化目錄
# 創建存儲目錄
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode/
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode/
# 進行格式化(如果報錯,刪除namenode下文件夾current)
hadoop namenode -format # 會刪除HDFS數據
2.3.5. 查看頁面
# 啓動HDFS
start-dfs.sh
# 啓動Yarn
start-yarn.sh
Hadoop界面: http://localhost:8088
HDFS界面: http://localhost:50070
2.4. 部署Spark Standalone Mode
參考鏈接:
- http://spark.apache.org/docs/latest/spark-standalone.html
本地單機模式
# 啓動主節點 默認端口8080
./sbin/start-master.sh -h localhost --webui-port 8080
# 啓動子節點
./sbin/start-slave.sh <master-spark-URL>
例如: <master-spark-URL> 可以在頁面localhost:8080上面查看
./sbin/start-slave.sh spark://localhost:7077
2.5. 部署Spark Mesos模式
參考鏈接: http://spark.apache.org/docs/latest/running-on-mesos.html
Mesos安裝
參考鏈接:https://open.mesosphere.com/downloads/mesos/
# 下載系統對應 rpm 包
wget http://repos.mesosphere.com/el/6/x86_64/RPMS/mesos-1.7.0-2.0.1.el6.x86_64.rpm
rpm -ivh mesos-1.7.0-2.0.1.el6.x86_64.rpm
前端WebUI啓動命令
mesos master --ip=localhost --work_dir=/var/lib/mesos
前端WebUI地址:
http://localhost:5050/#/
2.6. 部署Spark Yarn
參考鏈接: http://spark.apache.org/docs/latest/running-on-yarn.html
命令參數:
./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]
命令樣例:
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
examples/jars/spark-examples*.jar \
10
2.6.1. 問題記錄
問題說明
# 執行命令
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
examples/jars/spark-examples*.jar \
10
# 報錯如下
2018-12-07 16:19:07 INFO Client:871 - Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
問題解決
yarn-site.xml增加如下內容
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
2.7. 部署Spark Kubernetes
Spark Kubernetes: https//spark.apache.org/docs/latest/running-on-kubernetes.html
**kubernetes官網:**https://kubernetes.io/
TODO
3. Spark數據統計
3.1. SparkRDD使用
RDD - 彈性分佈式數據集
RDD是可以並行操作的容錯的容錯集合。創建RDD有兩種方法:並行化 驅動程序中的現有集合,或引用外部存儲系統中的數據集
官網RDD參考鏈接:
http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds
Spark啓動
bin/pyspark
Spark初始化
- 創建SparkContext對象,告知Spark如何訪問集羣。
- appName參數是應用程序在羣集UI上顯示的名稱
- master是URL
>>> from pyspark import SparkContext, SparkConf
>>> appName="fdm"
>>> master="mesos://localhost:5050"
>>> conf = SparkConf().setAppName(appName).setMaster(master)
>>> sc = SparkContext(conf=conf)
>>> sc
<SparkContext master=local[*] appName=PySparkShell>
並行化集合
>>> data = [1, 2, 3, 4, 5]
>>> distData = sc.parallelize(data)
>>> print distData
ParallelCollectionRDD[0] at parallelize at PythonRDD.scala:195
外部數據集
支持導入本地數據集、HDFS://xxxxxx等
>>> distFile = sc.textFile("data.txt")
>>> distFile
data.txt MapPartitionsRDD[2] at textFile at NativeMethodAccessorImpl.java:0
可寫類型:
- int
- float
- double
- bool
- byte
- null
- dict
保存和加載SequenceFiles
>>> rdd = sc.parallelize(range(1, 4)).map(lambda x: (x, "a" * x))
>>> rdd.saveAsSequenceFile("path/to/file")
>>> sorted(sc.sequenceFile("path/to/file").collect())
[(1, u'a'), (2, u'aa'), (3, u'aaa')]
3.2. SparkDataFrame使用
官網DataFrame參考鏈接:
http://spark.apache.org/docs/latest/sql-programming-guide.html
初始化Spark Session
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
創建DataFrame
# spark is an existing SparkSession
df = spark.read.json("examples/src/main/resources/people.json")
# Displays the content of the DataFrame to stdout
df.show()
# +----+-------+
# | age| name|
# +----+-------+
# |null|Michael|
# | 30| Andy|
# | 19| Justin|
# +----+-------+
3.3. SparkSQL使用
官網參考鏈接:
http://spark.apache.org/docs/latest/sql-distributed-sql-engine.html#running-the-thrift-jdbcodbc-server
啓動Thrift JDBC / ODBC服務器
./sbin/start-thriftserver.sh
訪問前端UI
http://localhost:4042/SQL/
使用beeline來測試Thrift JDBC / ODBC服務器:
./bin/beeline
beeline> !connect jdbc:hive2://localhost:10000
# 輸入用戶名和空白密碼
啓動spark-sql
./bin/spark-sql
Spark問題整理
Service ‘SparkUI’ could not bind on port 4040. Attempting port 4041.
問題:運行Spark腳本報錯
self.spark = SparkSession.builder.master(self.MASTER).appName(self.APPNAME).getOrCreate()
原因:
由於啓動一個Spark context 時,SparkUI 默認會使用 4040 端口,當 4040 端口被佔用時,則嘗試使用另外一個端口
解決步驟:
關閉 Spark-Shell 即可
錯誤日誌:
2018-12-27 09:38:59 WARN Utils:66 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
I1227 09:39:02.612689 26652 sched.cpp:232] Version: 1.7.0
I1227 09:39:02.619974 26650 sched.cpp:336] New master detected at [email protected]:5050
I1227 09:39:02.620997 26650 sched.cpp:356] No credentials provided. Attempting to register without authentication
Spark操作細節
Mesos使用
Messos安裝&配置
Mesos啓動 & 關閉
cd /usr/local/spark
./bin/spark-shell --master mesos://192.168.172.70:5050
/etc/mesos-master
/etc/mesos-slave
# 關閉 mesos-master
[root@WOM mesos-master]# netstat -lntp | grep 5050
[root@WOM mesos-master]# kill -9 XXXX
# 啓動 mesoso-master
mesos-master --work_dir=/usr/local/mesos/master_data --log_dir=/usr/local/mesos/master_logs --no-hostname_lookup --ip=192.168.172.70 --cluster=wom
# 啓動master-salve
mesos-slave --work_dir=/usr/local/mesos/salves_data --log_dir=/usr/local/mesos/salves_logs --master=192.168.172.70:5050 --no-hostname_lookup --ip=192.168.172.70 --port=5052
# 啓動 Spark
./sbin/start-master.sh -h localhost --webui-port 8080
(env) [scfan@WOM spark]$ bin/spark-shell --master mesos://192.168.172.70:5050 --total-executor-cores 1 --driver-memory 512M --executor-memory 512M
## 2.4. 部署Spark Standalone Mode
參考鏈接:
- http://spark.apache.org/docs/latest/spark-standalone.html
本地單機模式
# 啓動主節點 默認端口8080
./sbin/start-master.sh -h localhost --webui-port 8080
# 啓動子節點
./sbin/start-slave.sh <master-spark-URL>
例如: <master-spark-URL> 可以在頁面localhost:8080上面查看
./sbin/start-slave.sh spark://localhost:7077
刪除mesos工作目錄
如果我需要一個新的mesos集羣,我需要master的乾淨工作目錄。但問題不在於10.142.55.202約瑟夫吳說。我清除了所有的word_dir,並擺脫了這個問題。
如何清理工作目錄:
找到mesos-master工作目錄
$ cat /etc/mesos-master/work_dir
/var/lib/mesos
去掉它
$ rm -rf /var/lib/mesos
Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
當前的集羣的可用資源不能滿足應用程序所請求的資源
資源分2類: cores 和 ram
Core代表對執行可用的executor slots
Ram代表每個Worker上被需要的空閒內存來運行你的Application。
解決方法:
應用不要請求多餘空閒可用資源的
關閉掉已經執行結束的Application
解決方法:
- 執行參數修改內存大小
- 釋放內存,增加內存大小
export SPARK_WORKER_MEMORY=512M
export SPARK_DAEMON_MEMORY=256M
這些–executor-memory、–driver-memory你是否能先指定得更小些(比如50M、100M)
1.因爲提交任務的節點不能和worker節點交互,因爲提交完任務後提交任務節點上會起一個進程,展示任務進度,大多端口爲4044,工作節點需要反饋進度給該該端口,所以如果主機名或者IP在hosts中配置不正確。所以檢查下主機名和ip是否配置正確。
2.也有可能是內存不足造成的。內存設置可以根據情況調整下。另外,也檢查下web UI看看,確保worker節點處於alive狀態。