Spark学习笔记

Spark

开头别的不多说了,就说Spark为啥存在。他来到这就是为了代替MapReduce的!

MR的缺点

为啥要被代替呢?学过Hadoop知道,Hadoop早期,MR是基于数据集的计算,面向的是数据。基本运算规则是从存储介质中采集数据,然后进行计算,所以它的计算往往是一次性的,这就存在一定的局限性,不适用于数据挖掘和机器学习这样的迭代计算和图形挖掘计算。而且因为文件存储,性能不好!MR和Hadoop耦合,没法换。

后来Hadoop 2.x 就引入了Yarn,这个东西好啊,资源管理器RM(ResourceManager)。这里面有AM(ApplicationMaster)就是应用管理器,AM中的Driver管理NodeManager中的Task。

也就是说:

RM现在管理NodeManager,其中的Driver管理Task,这样实现了解耦。所以这个Task不一定非要是MR任务,此时变成Spark任务或者Flink任务或者Strom任务,都可以!

hadoop2.x版本yarn.png

引入了container,虽然增加了内存的消耗,但是大大提高了扩展性,于是Spark、Flink、Strom才可以搭配使用。

Spark为啥适合?

基于内存计算,由Scala语言开发。

Spark结构.png

Spark重要角色

1.Driver 驱动器

是执行程序main方法的进程。负责执行SparkContext、创建RDD、以及RDD转化操作和行动操作代码的执行。如果启动Spark Shell,系统会后台启动一个Spark Driver程序就是在Spark Shell中预加载一个SparkContext叫sc。如果驱动器程序终止,那么Spark应用也结束。工作:

  1. 把用户程序转为JOB
  2. 跟踪Executor的运行状况
  3. 为执行器节点调度任务
  4. UI展示运行情况

2.Executor 执行器

是一个工作进程,负责在Spark作业中运行任务,任务间相互独立。Spark应用启动时,Executor节点被同时启动,伴随Spark应用整个生命周期。如果有Executor节点故障或崩溃,Spark应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点。工作:

  1. 负责运行组成Spark应用的任务,并将结果返回给驱动器进程
  2. 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,所以任务可以再运行时充分利用缓存数据,加速运算。

Spark Yarn-cluster搭建

前提是HDFS和YARN集群正常启动了!

1.先去配置hadoop的yarn-site.xml

是否启动一个线程检查每个任务使用虚拟内存量,如果超出分配值,则直接kill掉,默认true:

<property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
 </property>

是否启动一个线程检查每个任务使用物理内存量,如果超出分配值,则直接kill掉,默认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

去找自己的路径,别乱复制!

3.分发配置文件

把这个配置文件给Slave1和Slave2(其实不发也行,Yarn模式的话一个机器能发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

添加内容:

spark.yarn.historyServer.address=Master:10020 
spark.history.ui.port=19888

端口别乱填!根据自己hadoop的mapred-site.xml的配置去对应填写!!!

2.重启Spark历史服务

./sbin/stop-history-server.sh 
./sbin/start-history-server.sh

3.提交个任务到YARN看效果

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部署运行流程:

YARN调度Spark.png

1.Client 提交任务

2.RM创建ApplicationMaster

3.AM向RM申请资源

4.RM向AM提供资源列表

5.AM选择NM节点并创建Spark执行器对象

6.被选中的NM节点Executor反向注册,通知AM已经准备好执行了。

7.AM分解并调度任务

Spark提交

1.基本语法

bin/spark-submit \ 
--class <main-class> \ 
--master <master-url> \ 
--deploy-mode <deploy-mode> \
 --conf<key>=<value> \
 ... # other options <application-jar> \
 [application-arguments]

2.参数说明

--master:指定的Master地址,默认为Local
--class:你的应用启动类 (例如:org.apache.spark.examples.SparkPi)
--deploy-mode:是否发布你的驱动到worker节点(cluster)或者作为本地客户端client。默认是client
--conf:任意的Spark配置属性,格式key=value,如果值包含空格,可以加引号"key=value"。
application-jar:打包好的应用jar包含依赖,这个URL在集群全局可见。
application-argument:传给main方法的参数
--executor-memory 1G 指定每个Executor可用内存1G

写程序

IDEA创建maven项目,然后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开发了。后面可以把程序打成jar包。
idea能看target文件夹里面,有个with-dependencies.jar这个很大,因为依赖都打进去了。
Windows在运行hadoop相关的时候可能会有报错!是个winutils.exe啥啥的,其实不影响我们使用,那个问题主要是源码里有一段这个:

String home = System.getProperty("hadoop.home.dir");

一看就是环境变量的事,HADOOP_HOME为空的话,就会null\bin\winutils.exe。找不到。
所以下载一个common的jar包。配置好环境变量。path添加上%HADOOP_HOME%\bin
听说需要重启???

或者还有一个办法:

我们写程序的时候前面加上

System.setProperty("hadoop.home.dir", "D:\\hadoop")

等打包的时候把这个干掉就完事了。。。但是这个要记得删!!!!!!千万别忘!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Scala语法 至于scala语法而言,大致上和Java的语法类似,增加了一些函数式编程,具体语法可以参考Scal...
    卡卡xx阅读 2,641评论 0 1
  • Spark学习笔记 Data Source->Kafka->Spark Streaming->Parquet->S...
    哎哟喂喽阅读 6,577评论 0 51
  • 本文是对Spark基础知识的一个学习总结,包含如下几部分的内容: 概述 运行模式 Spark Shell RDD/...
    我是老薛阅读 1,655评论 0 2
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,147评论 0 34
  • spark-submit的时候如何引入外部jar包 在通过spark-submit提交任务时,可以通过添加配置参数...
    博弈史密斯阅读 2,642评论 1 14