-
spark核心概念
-
spark集群架構
-
spark集群安裝部署
-
spark-shell的使用
-
通過IDEA開發spark程序
1. Spark是什么
Apache Spark? is a unified analytics engine for large-scale data processingspark是針對于大規模數據處理的統一分析引擎
spark是在Hadoop基礎上的改進,是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的并行計算框架,Spark基于map reduce算法實現的分布式計算,擁有Hadoop MapReduce所具有的優點;但不同于MapReduce的是Job中間輸出和結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數據挖掘與機器學習等需要迭代的map reduce的算法。 ? spark是基于內存計算框架,計算速度非常之快
輸入 計算 輸出
分發 計算 收集
第一步 保存中間結果 第二步
2. Spark
2.1 速度快
相對于hadoop來說,有使用hadoop MR經驗會有體會
-
運行速度提高100倍
Apache Spark使用最先進的DAG調度程序,查詢優化程序和物理執行引擎,實現批量和流式數據的高性能。
-
spark比mapreduce快的2個主要原因
基于內存
mapreduce任務后期再計算的時候,每一個job的輸出結果會落地到磁盤,后續有其他的job需要依賴于前面job的輸出結果,這個時候就需要進行大量的磁盤io操作。性能就比較低。 ? spark任務后期再計算的時候,job的輸出結果可以保存在內存中,后續有其他的job需要依賴于前面job的輸出結果,這個時候就直接從內存中獲取得到,避免了磁盤io操作,性能比較高
進程與線程
mapreduce任務以進程的方式運行在yarn集群中,比如程序中有100個MapTask,一個task就需要一個進程,這些task要運行就需要開啟100個進程。 ? spark任務以線程的方式運行在進程中,比如程序中有100個MapTask,后期一個task就對應一個線程,這里就不在是進程,這些task需要運行,這里可以極端一點:只需要開啟1個進程,在這個進程中啟動100個線程就可以了。進程中可以啟動很多個線程,而開啟一個進程與開啟一個線程需要的時間和調度代價是不一樣。 開啟一個進程需要的時間遠遠大于開啟一個線程。
2.2 易用性
-
可以快速去編寫spark程序通過 java/scala/python/R/SQL等不同語言
2.3 通用性
-
spark框架不在是一個簡單的框架,可以把spark理解成一個生態系統,它內部是包含了很多模塊,基于不同的應用場景可以選擇對應的模塊去使用
sparksql、api
通過sql去開發spark程序做一些離線分析
sparkStreaming
主要是用來解決公司有實時計算的這種場景
Mlib
它封裝了一些機器學習的算法庫
Graphx 圖計算
2.4 兼容性
-
spark程序就是一個計算邏輯程序,這個任務要運行就需要計算資源(內存、cpu、磁盤),哪里可以給當前這個任務提供計算資源,就可以把spark程序提交到哪里去運行
standAlone
少量的節點,比較純粹的spark任務
它是spark自帶的集群模式,整個任務的資源分配由spark集群的老大Master負責
yarn
yarn有接口,可以對接其他的計算框架 mr flink spark java
可以把spark程序提交到yarn中運行,整個任務的資源分配由yarn中的老大ResourceManager負責
mesos
云原生支持的比較快
它也是apache開源的一個類似于yarn的資源調度平臺。
3. Spark與Yarn
mesos standalone yarn cpu 磁盤 內存
spark提交任務到yarn
-
Driver
它會執行客戶端寫好的main方法,它會構建一個名叫SparkContext對象
-
Task
spark任務是以task線程的方式運行在worker節點對應的executor進程中
spark是調用了yarn的接口,將任務提交給yarn來執行計算,實際的計算邏輯就是我們driver中的代碼
4. Spark集群安裝部署
-
事先搭建好hadoop分布式環境
-
下載安裝包
-
解壓安裝包到指定的安裝目錄
/root
-
重命名解壓目錄
mv spark-3.1.1-bin-hadoop3.2 spark
-
修改配置文件,進入到spark的安裝目錄下對應的conf文件夾
vim spark-env.sh ( mv spark-env.sh.template spark-env.sh)
vim slaves ( mv slaves.template salves)
#指定spark集群的worker節點 hadoop01 hadoop02 hadoop03
-
分發安裝目錄到其他機器
xsync /root/spark /root/spark
-
8、修改spark環境變量(也可以不配置,這里主要是為了)
vim /etc/profile
export SPARK_HOME=/root/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
當啟動好spark集群之后,可以訪問這樣一個地址http://hadoop01:8080
5. Spark怎么使用
5.1 生產環境
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ examples/jars/spark-examples_2.12-3.1.1.jar \ 10 ? ##參數說明 --class:指定包含main方法的主類 --master:指定spark集群master地址 --executor-memory:指定任務在運行的時候需要的每一個executor內存大小 --total-executor-cores: 指定任務在運行的時候需要總的cpu核數 ?
5.2 臨時調試環境
spark整合HDFS,在hadoop01節點vim /root/spark/conf/spark-env.sh
export HADOOP_CONF_DIR=/opt/bigdata/hadoop/etc/hadoop
分發到其他節點
xsync /root/spark/conf/spark-env.sh /root/spark/conf/spark-env.sh
執行spark-shell --master yarn
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect ? sc.textFile("hdfs://hadoop01:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
5.3 開發環境
構建maven工程,添加pom依賴
<dependencies><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.1.1</version></dependency>
</dependencies>
?<build><sourceDirectory>src/main/scala</sourceDirectory><plugins><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.2</version><executions><execution><goals><goal>compile</goal><goal>testCompile</goal></goals><configuration><args><arg>-dependencyfile</arg><arg>${project.build.directory}/.scala_dependencies</arg></args></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.4.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass></mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
提交任務使用的腳本
spark-submit \ --class com.mejava.day02.WordCount \ --master yarn \ --executor-memory 1G \ scala_learn-1.0-SNAPSHOT.jar