第1章 Spark 概述1.1 什麼是 Spark1.2 Spark 特色1.3 Spark 的用戶和用途第2章 Spark 集羣安裝2.1 集羣角色2.2 機器準備2.3 下載 Spark 安裝包2.4 配置 Spark Standalone 模式2.5 配置 Spark History Server2.6 配置 Spark HA2.7 配置 Spark Yarn 模式第3章 執行 Spark 程序3.1 執行第一個 spark 程序3.2 Spark 應用提交3.3 Spark shell3.3.1 啓動 Spark shell3.3.2 在 Spark shell 中編寫 WordCount 程序3.4 在 IDEA 中編寫 WordCount 程序3.5 在 IDEA 中本地調試 WordCount 程序3.6 在 IDEA 中遠程調試 WordCount 程序3.7 Spark 核心概念css
官網:http://spark.apache.org
java
Spark 的產生背景
Spark 是一種快速、通用、可擴展的大數據分析引擎,2009 年誕生於加州大學伯克利分校 AMPLab,2010 年開源,2013 年 6 月成爲 Apache 孵化項目,2014 年 2 月成爲 Apache 頂級項目。項目是用 Scala 進行編寫。
目前,Spark生態系統已經發展成爲一個包含多個子項目的集合,其中包含 SparkSQL、Spark Streaming、GraphX、MLib、SparkR 等子項目,Spark 是基於內存計算的大數據並行計算框架。除了擴展了普遍使用的 MapReduce 計算模型,並且高效地支持更多計算模式,包括交互式查詢和流處理。Spark 適用於各類各樣原先須要多種不一樣的分佈式平臺的場景,包括批處理、迭代算法、交互式查詢、流處理。經過在一個統一的框架下支持這些不一樣的計算
,Spark 使咱們能夠簡單而低耗地把各類處理流程整合在一塊兒。而這樣的組合,在實際的數據分析過程當中是頗有意義的。不只如此,Spark 的這種特性還大大減輕了原先須要對各類平臺分別管理的負擔。
大一統的軟件棧,各個組件關係密切而且能夠相互調用,這種設計有幾個好處:
一、軟件棧中全部的程序庫和高級組件均可以從下層的改進中獲益。
二、運行整個軟件棧的代價變小了。不須要運行 5 到 10 套獨立的軟件系統了,一個機構只須要運行一套軟件系統便可。系統的部署、維護、測試、支持等大大縮減。
三、可以構建出無縫整合不一樣處理模型的應用。
Spark 的內置項目以下:
node
Spark Core
:實現了 Spark 的基本功能,包含任務調度、內存管理、錯誤恢復、與存儲系統交互等模塊。Spark Core 中還包含了對彈性分佈式數據集(resilient distributed dataset,簡稱RDD)的 API 定義。
Spark SQL
:是 Spark 用來操做結構化數據的程序包。經過 Spark SQL,咱們可使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)來查詢數據。Spark SQL 支持多種數據源,比 如 Hive 表、Parquet 以及 JSON 等。
Spark Streaming
:是 Spark 提供的對實時數據進行流式計算的組件。提供了用來操做數據流的 API,而且與 Spark Core 中的 RDD API 高度對應。
Spark MLlib
:提供常見的機器學習(ML)功能的程序庫。包括分類、迴歸、聚類、協同過濾等,還提供了模型評估、數據導入等額外的支持功能。
集羣管理器
:Spark 設計爲能夠高效地在一個計算節點到數千個計算節點之間伸縮計算。爲了實現這樣的要求,同時得到最大靈活性,Spark 支持在各類集羣管理器(cluster manager)上運行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自帶的一個簡易調度器,叫做獨立調度器。
Spark 獲得了衆多大數據公司的支持,這些公司包括 Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、騰訊、京東、攜程、優酷土豆。當前百度的 Spark 已應用於鳳巢、大搜索、直達號、百度大數據等業務;阿里利用 GraphX 構建了大規模的圖計算和圖挖掘系統,實現了不少生產系統的推薦算法;騰訊 Spark 集羣達到 8000 臺的規模,是當前已知的世界上最大的 Spark 集羣。
快
與 Hadoop 的 MapReduce 相比,Spark 基於內存的運算要快 100 倍以上,基於硬盤的運算也要快 10 倍以上。Spark 實現了高效的 DAG 執行引擎,能夠經過基於內存來高效處理數據流。計算的中間結果是存在於內存中的。nginx
易用
Spark 支持 Java、Python、R 和 Scala 的 API,還支持超過 80 種高級算法,使用戶能夠快速構建不一樣的應用。並且 Spark 支持交互式的 Python、R 和 Scala 的 shell,能夠很是方便地在這些 shell 中使用 Spark 集羣來驗證解決問題的方法。算法
通用
Spark 提供了統一的解決方案。Spark 能夠用於批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。這些不一樣類型的處理均可以在同一個應用中無縫使用。Spark 統一的解決方案很是具備吸引力,畢竟任何公司都想用統一的平臺去處理遇到的問題,減小開發和維護的人力成本和部署平臺的物力成本。sql
兼容性
Spark 能夠很是方便地與其餘的開源產品進行融合。好比,Spark 可使用 Hadoop 的 YARN 和 Apache Mesos 做爲它的資源管理和調度器器,而且能夠處理全部 Hadoop 支持的數據,包括 HDFS、HBase 和 Cassandra 等。這對於已經部署 Hadoop 集羣的用戶特別重要,由於不須要作任何數據遷移就可使用 Spark 的強大處理能力。Spark 也能夠不依賴於第三方的資源管理和調度器,它實現了 Standalone 做爲其內置的資源管理和調度框架,這樣進一步下降了 Spark 的使用門檻,使得全部人均可以很是容易地部署和使用 Spark。此外,Spark 還提供了在 EC2 上部署 Standalone 的 Spark 集羣的工具。shell
咱們大體把 Spark 的用例分爲兩類:數據科學應用和數據處理應用。也就對應的有兩種人羣:數據科學家和工程師。
數據科學任務
主要是數據分析領域,數據科學家要負責分析數據並建模,具有 SQL、統計、預測建模(機器學習)等方面的經驗,以及必定的使用 Python、Matlab 或 R 語言進行編程的能力。
數據處理應用
工程師定義爲使用 Spark 開發生產環境中的數據處理應用的軟件開發者,經過對接 Spark 的 API 實現對處理的處理和轉換等任務。apache
從物理部署層面上來看,Spark 主要分爲兩種類型的節點,Master 節點和 Worker 節點,Master 節點主要運行集羣管理器的中心化部分,所承載的做用是分配 Application 到 Worker 節點,維護 Worker 節點 的 Driver、Application 的狀態。Worker 節點負責具體的業務運行。
從 Spark 程序運行的層面來看,Spark 主要分爲驅動器節點和執行器節點。
準備兩臺以上 Linux 服務器,安裝好 JDK1.8。編程
wget 下載地址
Step一、上傳 spark-2.1.1-bin-hadoop2.7.tgz 安裝包到 Linux 對應的目錄上,本人是上傳至 /opt/software 目錄下
Step二、解壓安裝包到指定位置windows
tar -zxf /opt/software/spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module
以下圖所示:
Spark 的部署模式有Local、Local-Cluster、Standalone、Yarn、Mesos,咱們選擇最具表明性的 Standalone 集羣部署模式。
Step一、進入到 Spark 安裝目錄中的配置目錄 conf
cd /opt/module/spark-2.1.1-bin-hadoop2.7/conf
以下圖所示:
scp -r /opt/module/spark-2.1.1-bin-hadoop2.7/ atguigu@hadoop103:/opt/module/
scp -r /opt/module/spark-2.1.1-bin-hadoop2.7/ atguigu@hadoop104:/opt/module/
或者
xsync /opt/module/spark-2.1.1-bin-hadoop2.7/
Step七、Spark 集羣配置完畢,目前是 1 個 Master,2 個 Work,hadoop102 上啓動 Spark 集羣
$ /opt/module/spark-2.1.1-bin-hadoop2.7/sbin/start-all.sh
以下圖所示:
問題1:若是遇到 「JAVA_HOME not set」 異常,以下圖所示:
export JAVA_HOME=/opt/module/jdk1.8.0_144
以下圖所示:
問題2:若是遇到 Hadoop HDFS 的寫入權限異常:
org.apache.hadoop.security.AccessControlException
解決方案: 在 hdfs-site.xml 中添加以下配置,關閉權限驗證,而後配置分發到其餘機器:
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
Step一、進入到 Spark 安裝目錄
cd /opt/module/spark-2.1.1-bin-hadoop2.7/conf
Step二、將 spark-default.conf.template 複製爲 spark-default.conf
$ cp spark-defaults.conf.template spark-defaults.conf
Step三、修改 spark-default.conf 文件,開啓 Log:
spark.master spark://hadoop102:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop102:9000/directory
以下圖所示:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000
-Dspark.history.retainedApplications=3
-Dspark.history.fs.logDirectory=hdfs://hadoop102:9000/directory"
以下圖所示:
$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -mkdir -p /directory
參數描述:
spark.eventLog.dir Application 在運行過程當中全部的信息均記錄在該屬性指定的路徑下
spark.history.ui.port=4000 調整 WEBUI 訪問的端口號爲 4000
spark.history.retainedApplications=3 指定保存 Application 歷史記錄的個數,若是超過這個值,舊的應用程序信息將被刪除,這個是內存中的應用數,而不是頁面上顯示的應用數
spark.history.fs.logDirectory=hdfs://hadoop102:9000/directory 配置了該屬性後,在 start-history-server.sh 時就無需再顯式的指定路徑,Spark History Server 頁面只展現該指定路徑下的信息
Step六、將配置好的 Spark 文件拷貝到其餘節點上或者配置分發。
Step七、重啓 Spark 集羣。
$ /opt/module/spark-2.1.1-bin-hadoop2.7/sbin/start-all.sh
Step八、啓動後執行歷史服務器。
$ /opt/module/spark-2.1.1-bin-hadoop2.7/sbin/start-history-server.sh
網頁上查看
集羣部署完了,可是有一個很大的問題,那就是 Master 節點存在單點故障,要解決此問題,就要藉助 zookeeper,而且啓動至少兩個 Master 節點來實現高可靠,配置方式比較簡單:
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop102:2181,hadoop103:2181,hadoop104:2181
-Dspark.deploy.zookeeper.dir=/spark"
以下圖所示:
Step四、在 hadoop102 節點上修改 slaves 配置文件內容指定 worker 節點。
hadoop103
hadoop104
Step五、將配置文件同步到全部節點。
Step六、在 hadoop102 上執行 sbin/start-all.sh 腳本,啓動集羣並啓動第一個 master 節點,而後在 hadoop103 上執行 sbin/start-master.sh 啓動第二個 master 節點。
Step七、程序中 spark 集羣的訪問地址須要改爲:
--master spark://hadoop102:7077,hadoop103:7077
咱們幹掉 hadoop102 上的 Master 進程,而後再次執行 WordCount 程序,看是否可以執行成功:
Step八、咱們想知道 Zookeeper 中保存了什麼?
[atguigu@hadoop102 zookeeper-3.4.10]$ pwd
/opt/module/zookeeper-3.4.10
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkCli.sh -server hadoop102:2181,hadoop103:2181,hadoop104:2181
Connecting to hadoop102:2181,hadoop103:2181,hadoop104:2181
......
......
[zk: hadoop102:2181,hadoop103:2181,hadoop104:2181(CONNECTED) 0] ls /spark
[leader_election, master_status]
[zk: hadoop102:2181,hadoop103:2181,hadoop104:2181(CONNECTED) 1] get /spark/master_status
192.168.25.102
cZxid = 0x4000000059
ctime = Mon Apr 22 10:10:11 CST 2019
mZxid = 0x4000000059
mtime = Mon Apr 22 10:10:11 CST 2019
pZxid = 0x4000000063
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 3
[zk: hadoop102:2181,hadoop103:2181,hadoop104:2181(CONNECTED) 2]
Step一、修改 hadoop 配置下的 /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml 文件,而後分發到其餘節點。
yarn-site.xml
<?xml version="1.0"?>
<configuration>
<!-- Reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
<!-- 日誌彙集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日誌保留時間設置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 任務歷史服務器 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop102:19888/jobhistory/logs/</value>
</property>
<!-- 指定yarn在啓動的時候的內存大小 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
<!--是否啓動一個線程檢查每一個任務正使用的物理內存量,若是任務超出分配值,則直接將其殺掉,默認是 true,實際開發中設置成 true,學習階段設置成 false -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否啓動一個線程檢查每一個任務正使用的虛擬內存量,若是任務超出分配值,則直接將其殺掉,默認是 true,實際開發中設置成 true,學習階段設置成 false -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
Step二、修改 /opt/module/spark-2.1.1-bin-hadoop2.7/conf/spark-env.sh,添加如下內容,而後分發到其餘節點。
spark-env.sh
# 讓 spark 可以發現 hadoop 的配置文件
HADOOP_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
以下圖所示:
Step三、提交應用進行測便可
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class com.atguigu.sparkdemo.WordCountDemo \
--master yarn \
--deploy-mode client \
--executor-memory 1G \
--total-executor-cores 2 \
/opt/software/sparkdemo-1.0-SNAPSHOT-jar-with-dependencies.jar \
hdfs://hadoop102:9000/RELEASE \
hdfs://hadoop102:9000/out
或者
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class com.atguigu.sparkdemo.WordCountDemo \
--master yarn-client \
--executor-memory 1G \
--total-executor-cores 2 \
/opt/software/sparkdemo-1.0-SNAPSHOT-jar-with-dependencies.jar \
hdfs://hadoop102:9000/RELEASE \
hdfs://hadoop102:9000/out
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/opt/module/spark-2.1.1-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.1.1.jar \
100
參數說明:
--master spark://hadoop102:7077 指定 Master 的地址
--executor-memory 1G 指定每一個 executor 可用內存爲 1G
--total-executor-cores 2 指定每一個 executor 使用的 cup 核數爲 2 個
該算法是利用蒙特·卡羅算法求 PI,結果以下圖:
一旦打包好,就可使用 bin/spark-submit 腳本啓動應用了。 這個腳本負責設置 spark 使用的 classpath 和依賴,支持不一樣類型的集羣管理器和發佈模式:
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
一些經常使用選項:
1) --class: 你的應用的啓動類 (如 org.apache.spark.examples.SparkPi)。
2) --master: 集羣的 master URL (如 spark://192.168.25.102:7077)。
3) --deploy-mode: 是否發佈你的驅動到 Worker 節點(cluster) 或者做爲一個本地客戶端 client)(默認是 client)。
4) --conf: 任意的 Spark 配置屬性, 格式 key=value,若是值包含空格,能夠加引號 "key=value",缺省的 Spark 配置。
5) application-jar: 打包好的應用 jar,包含依賴,這個 URL 在集羣中全局可見。 好比 hdfs://共享存儲系統, 若是是 file://path, 那麼全部的節點的 path 都包含一樣的 jar。
6) application-arguments: 傳給 main() 方法的參數。
--master 後面的 URL 能夠是如下格式:
spark-shell 是 Spark 自帶的交互式 Shell 程序,方便用戶進行交互式編程,用戶能夠在該命令行下用 scala 編寫 spark 程序。
啓動 spark shell 時沒有指定 master 地址
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-shell
啓動 spark shell 時指定 master 地址
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-shell \
--master spark://hadoop102:7077 \
--executor-memory 2G \
--total-executor-cores 2
注意1
:若是啓動 spark shell 時沒有指定 master 地址,可是也能夠正常啓動 spark shell 和執行 spark shell 中的程序,實際上是啓動了 spark 的 cluster 模式,若是 spark 是單節點,而且沒有指定 slave 文件,這個時候若是打開 spark-shell 默認是 local 模式。
Local 模式是 master 和 worker 在同同一進程內。
Cluster 模式是 master 和 worker 在不一樣進程內。注意2
:Spark Shell 中已經默認將 SparkContext 類初始化爲對象 sc。用戶代碼若是須要用到,則直接應用 sc 便可。
Step一、首先啓動 HDFS,在 HDFS 上建立一個 /RELEASE 目錄
$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -mkdir -p /RELEASE
Step二、將 Spark 目錄下的 RELEASE 文件上傳一個文件到:hdfs://hadoop102:9000/RELEASE 上
$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -put /opt/module/spark-2.1.1-bin-hadoop2.7/RELEASE /RELEASE
以下圖所示:
scala> sc.textFile("hdfs://hadoop102:9000/RELEASE/RELEASE").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://hadoop102:9000/out")
以下圖所示:
$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -cat hdfs://hadoop102:9000/out/p*
以下圖所示:
sc 是 SparkContext 對象,該對象是提交 spark 程序的入口。
textFile(hdfs://hadoop102:9000/RELEASE/RELEASE) 是 hdfs 中讀取數據
flatMap(_.split(" ")) 先 map 在壓平
map((_,1)) 將單詞和1構成元組
reduceByKey(_+_) 按照 key 進行 reduce,並將 value 累加
saveAsTextFile("hdfs://hadoop102:9000/out") 將結果寫入到 hdfs 中
以下圖所示:
spark shell 僅在測試和驗證咱們的程序時使用的較多,在生產環境中,一般會在 IDE 中編制程序,而後打成 jar 包,而後提交到集羣,最經常使用的是建立一個 Maven 項目,利用 Maven 來管理 jar 包的依賴。
Step一、建立一個項目
Step二、選擇 Maven 項目,而後點擊 next
Step三、填寫 maven 的 GAV,而後點擊 next
Step四、填寫項目名稱,而後點擊 finish
Step五、建立好 maven 項目後,點擊 Enable Auto-Import
Step六、配置 Maven 的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>sparkdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<scala.version>2.11.8</scala.version>
<spark.version>2.1.1</spark.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<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>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>com.atguigu.sparkdemo.WordCountDemo</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Step七、將 src/main/scala 設置成源代碼目錄。
Step八、添加 IDEA Scala(執行此操做後,pom 文件中不用添加 scala 依賴,由於已經以 lib 庫的方式加入)
package com.atguigu.sparkdemo
import org.apache.spark.{SparkConf, SparkContext}
import org.slf4j.LoggerFactory
object WordCountDemo {
val logger = LoggerFactory.getLogger(WordCountDemo.getClass)
def main(args: Array[String]): Unit = {
// 建立 SparkConf() 並設置 App 名稱
val sparkConf = new SparkConf().setAppName("WC")
// 建立 SparkContext,該對象是提交 Spark App 的入口
val sc = new SparkContext(sparkConf)
// 使用 sc 建立 RDD 並執行相應的 transformation 和 action
sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _, 1).sortBy(_._2, false).saveAsTextFile(args(1))
// 中止 sc,結束該任務
logger.info("complete!")
sc.stop()
}
}
Step十一、使用 Maven 打包:首先修改 pom.xml 中的 main class
/opt/module/hadoop-2.7.3/sbin/start-dfs.sh
啓動 spark
/opt/module/spark-2.1.1-bin-hadoop2.7/sbin/start-all.sh
Step1五、使用 spark-submit 命令提交 Spark 應用(注意參數的順序)
$ /opt/module/spark-2.1.1-bin-hadoop2.7/bin/spark-submit \
--class com.atguigu.sparkdemo.WordCountDemo \
--master spark://hadoop102:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
/opt/software/sparkdemo-1.0-SNAPSHOT-jar-with-dependencies.jar \
hdfs://hadoop102:9000/RELEASE \
hdfs://hadoop102:9000/out1
Step1六、查看程序執行結果
$ /opt/module/hadoop-2.7.2/bin/hdfs dfs -cat hdfs://hadoop102:9000/out1/p*
以下圖所示:
hdfs://hadoop102:9000/RELEASE 輸入文件路徑
hdfs://hadoop102:9000/out1 輸出文件路徑
若是在 spark 程序中寫死了這兩處路徑,則這兩個參數就不須要了。
本地 Spark 程序調試須要使用 local 提交模式,即將本機當作運行環境,Master 和 Worker 都爲本機。運行時直接加斷點調試便可。以下:
若是本機操做系統是 windows,若是在程序中使用了 hadoop 相關的東西,好比寫入文件到 HDFS,則會遇到以下異常:
解決辦法1:本項目生效,是將一個 hadoop 相關的服務 zip 包(hadoop-common-bin-2.7.3-x64.zip)解壓到任意目錄。
點擊 Run -> Run Configurations
而後在 IDEA 中配置 Run Configuration,添加 HADOOP_HOME 變量便可:
解決辦法2:全部項目生效,windows 系統中配置 hadoop 的環境變量,以下圖所示:
經過 IDEA 進行遠程調試,主要是將 IDEA 做爲 Driver 來提交應用程序,配置過程以下:
修改 sparkConf,添加最終須要運行的 Jar 包、Driver 程序的地址,並設置 Master 的提交地址:
每一個 Spark 應用都由一個驅動器程序(driver program)來發起集羣上的各類並行操做。驅動器程序包含應用的 main 函數,而且定義了集羣上的分佈式數據集,還對這些分佈式數據集應用了相關操做。
驅動器程序經過一個 SparkContext 對象來訪問 Spark。這個對象表明對計算集羣的一個鏈接。shell 啓動時已經自動建立了一個 SparkContext 對象,是一個叫做 sc 的變量。
驅動器程序通常要管理多個執行器(executor)節點。