Spark
開頭別的不多說(shuō)了,就說(shuō)Spark為啥存在愉棱。他來(lái)到這就是為了代替MapReduce的唆铐!
MR的缺點(diǎn)
為啥要被代替呢?學(xué)過Hadoop知道奔滑,Hadoop早期艾岂,MR是基于數(shù)據(jù)集的計(jì)算,面向的是數(shù)據(jù)朋其⊥踉。基本運(yùn)算規(guī)則是從存儲(chǔ)介質(zhì)中采集數(shù)據(jù),然后進(jìn)行計(jì)算梅猿,所以它的計(jì)算往往是一次性的氓辣,這就存在一定的局限性,不適用于數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)這樣的迭代計(jì)算和圖形挖掘計(jì)算袱蚓。而且因?yàn)槲募鎯?chǔ)筛婉,性能不好!MR和Hadoop耦合癞松,沒法換爽撒。
后來(lái)Hadoop 2.x 就引入了Yarn,這個(gè)東西好啊响蓉,資源管理器RM(ResourceManager)硕勿。這里面有AM(ApplicationMaster)就是應(yīng)用管理器,AM中的Driver管理NodeManager中的Task枫甲。
也就是說(shuō):
RM現(xiàn)在管理NodeManager源武,其中的Driver管理Task扼褪,這樣實(shí)現(xiàn)了解耦。所以這個(gè)Task不一定非要是MR任務(wù)粱栖,此時(shí)變成Spark任務(wù)或者Flink任務(wù)或者Strom任務(wù)话浇,都可以!
引入了container闹究,雖然增加了內(nèi)存的消耗幔崖,但是大大提高了擴(kuò)展性,于是Spark渣淤、Flink赏寇、Strom才可以搭配使用。
Spark為啥適合价认?
基于內(nèi)存計(jì)算嗅定,由Scala語(yǔ)言開發(fā)。
Spark重要角色
1.Driver 驅(qū)動(dòng)器
是執(zhí)行程序main方法的進(jìn)程用踩。負(fù)責(zé)執(zhí)行SparkContext渠退、創(chuàng)建RDD、以及RDD轉(zhuǎn)化操作和行動(dòng)操作代碼的執(zhí)行脐彩。如果啟動(dòng)Spark Shell智什,系統(tǒng)會(huì)后臺(tái)啟動(dòng)一個(gè)Spark Driver程序就是在Spark Shell中預(yù)加載一個(gè)SparkContext叫sc。如果驅(qū)動(dòng)器程序終止丁屎,那么Spark應(yīng)用也結(jié)束荠锭。工作:
- 把用戶程序轉(zhuǎn)為JOB
- 跟蹤Executor的運(yùn)行狀況
- 為執(zhí)行器節(jié)點(diǎn)調(diào)度任務(wù)
- UI展示運(yùn)行情況
2.Executor 執(zhí)行器
是一個(gè)工作進(jìn)程,負(fù)責(zé)在Spark作業(yè)中運(yùn)行任務(wù)晨川,任務(wù)間相互獨(dú)立证九。Spark應(yīng)用啟動(dòng)時(shí),Executor節(jié)點(diǎn)被同時(shí)啟動(dòng)共虑,伴隨Spark應(yīng)用整個(gè)生命周期愧怜。如果有Executor節(jié)點(diǎn)故障或崩潰,Spark應(yīng)用也可以繼續(xù)執(zhí)行妈拌,會(huì)將出錯(cuò)節(jié)點(diǎn)上的任務(wù)調(diào)度到其他Executor節(jié)點(diǎn)拥坛。工作:
- 負(fù)責(zé)運(yùn)行組成Spark應(yīng)用的任務(wù),并將結(jié)果返回給驅(qū)動(dòng)器進(jìn)程
- 通過自身的塊管理器(Block Manager)為用戶程序中要求緩存的RDD提供內(nèi)存式存儲(chǔ)尘分。RDD是直接緩存在Executor進(jìn)程內(nèi)的猜惋,所以任務(wù)可以再運(yùn)行時(shí)充分利用緩存數(shù)據(jù),加速運(yùn)算培愁。
Spark Yarn-cluster搭建
前提是HDFS和YARN集群正常啟動(dòng)了著摔!
1.先去配置hadoop的yarn-site.xml
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)使用虛擬內(nèi)存量,如果超出分配值定续,則直接kill掉谍咆,默認(rèn)true:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
是否啟動(dòng)一個(gè)線程檢查每個(gè)任務(wù)使用物理內(nèi)存量禾锤,如果超出分配值,則直接kill掉摹察,默認(rèn)true:
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
2.修改spark-env.sh 添加如下配置
YARN_CONF_DIR=/opt/soft/hadoop-2.7.1/etc/hadoop
去找自己的路徑恩掷,別亂復(fù)制!
3.分發(fā)配置文件
把這個(gè)配置文件給Slave1和Slave2(其實(shí)不發(fā)也行供嚎,Yarn模式的話一個(gè)機(jī)器能發(fā)Spark就足夠了)
4.試一下例子
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.4.1.jar \
100
日志查看
1.修改配置文件spark-defaults.conf
添加內(nèi)容:
spark.yarn.historyServer.address=Master:10020
spark.history.ui.port=19888
端口別亂填黄娘!根據(jù)自己hadoop的mapred-site.xml的配置去對(duì)應(yīng)填寫!2槠骸!
2.重啟Spark歷史服務(wù)
./sbin/stop-history-server.sh
./sbin/start-history-server.sh
3.提交個(gè)任務(wù)到Y(jié)ARN看效果
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.4.1.jar \
100
這回看日志宁炫。
YARN部署運(yùn)行流程:
1.Client 提交任務(wù)
2.RM創(chuàng)建ApplicationMaster
3.AM向RM申請(qǐng)資源
4.RM向AM提供資源列表
5.AM選擇NM節(jié)點(diǎn)并創(chuàng)建Spark執(zhí)行器對(duì)象
6.被選中的NM節(jié)點(diǎn)Executor反向注冊(cè)偿曙,通知AM已經(jīng)準(zhǔn)備好執(zhí)行了。
7.AM分解并調(diào)度任務(wù)
Spark提交
1.基本語(yǔ)法
bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf<key>=<value> \
... # other options <application-jar> \
[application-arguments]
2.參數(shù)說(shuō)明
--master:指定的Master地址羔巢,默認(rèn)為L(zhǎng)ocal
--class:你的應(yīng)用啟動(dòng)類 (例如:org.apache.spark.examples.SparkPi)
--deploy-mode:是否發(fā)布你的驅(qū)動(dòng)到worker節(jié)點(diǎn)(cluster)或者作為本地客戶端client望忆。默認(rèn)是client
--conf:任意的Spark配置屬性,格式key=value竿秆,如果值包含空格启摄,可以加引號(hào)"key=value"。
application-jar:打包好的應(yīng)用jar包含依賴幽钢,這個(gè)URL在集群全局可見歉备。
application-argument:傳給main方法的參數(shù)
--executor-memory 1G 指定每個(gè)Executor可用內(nèi)存1G
寫程序
IDEA創(chuàng)建maven項(xiàng)目,然后POM:
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.george.sparktest</groupId>
<artifactId>sparktest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
<build>
<finalName>WordCount</finalName>
<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>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<mainClass>WordCount</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
純屬手敲匪燕。蕾羊。。
然后可以使用Scala開發(fā)了帽驯。后面可以把程序打成jar包龟再。
idea能看target文件夾里面,有個(gè)with-dependencies.jar這個(gè)很大尼变,因?yàn)橐蕾嚩即蜻M(jìn)去了利凑。
Windows在運(yùn)行hadoop相關(guān)的時(shí)候可能會(huì)有報(bào)錯(cuò)!是個(gè)winutils.exe啥啥的嫌术,其實(shí)不影響我們使用哀澈,那個(gè)問題主要是源碼里有一段這個(gè):
String home = System.getProperty("hadoop.home.dir");
一看就是環(huán)境變量的事,HADOOP_HOME為空的話度气,就會(huì)null\bin\winutils.exe日丹。找不到。
所以下載一個(gè)common的jar包蚯嫌。配置好環(huán)境變量哲虾。path添加上%HADOOP_HOME%\bin
聽說(shuō)需要重啟丙躏??束凑?
或者還有一個(gè)辦法:
我們寫程序的時(shí)候前面加上
System.setProperty("hadoop.home.dir", "D:\\hadoop")
等打包的時(shí)候把這個(gè)干掉就完事了晒旅。。汪诉。但是這個(gè)要記得刪7狭怠!0羌摹S愎摹!该编!千萬(wàn)別忘F尽!?慰ⅰ嘉赎!