1.spark的历史

1.1 Hadoop:

提到spark就要提到Hadoop,Hadoop里程碑式的一点就是发布了Hadoop2.X,提出了yarn。

yarn做的工作,就是把资源调度和任务调度完全的解耦了,这样整个框架的和拓展性就大大的增强了。不然按Hadoop1.X的版本,MapReduce是和Hadoop完全耦合的,是无法被替换的。

spark work 启动_Hadoop

1.2 spark
  • spark是基于Hadoop1.X的构架思想,采用自己的方式改善Hadoop1.X中的问题。
  • spark是基于内存的,并且基于Scale语法开发,所以适合迭代式开发(机器学习、数据挖掘)
  • 粗略的看结构就如下,分为资源(绿色部分)和计算(蓝色部分),基本上和yarn很像。但是spark的数据存储还是要连在Hadoop上使用HDFS的,所以把MapReduce替换成Spark,就用yarn完成替换。

2.安装spark

  1. 先从官网上下载适合自己hadoop版本的spark的压缩包
  2. 上传到虚拟机并且解压[us@hadoop102 software]$ tar -zxvf spark-2.3.4-bin-hadoop2.7.tgz -C /opt/module/可以改个名mv spark-2.3.4-bin-hadoop2.7 spark
  3. 试一下官方的PI案例./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"
  4. spark work 启动_spark_02


  5. 打开spark shell[us@hadoop102 spark]$ bin/spark-shell 如果出现下面这样的界面,说明环境已经没有什么问题了
  6. spark work 启动_hadoop_03

  7. spark是有WebUI的,端口是4040
    sc是spark的一个上下文对象,是可以直接拿来使用的
    local[*]:代表本地模式,*代表线程核数就是本机的CPU的数量。
    app id:就是一个job上传给yarn后,就相当于一个应用,这个id号就代表这个应用的全局唯一id。(在local模式下,和yarn无关,那么这个就是一个临时生成id)

3.一个wordcount的例子

  • 输入
  • 实现
sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
  • 思路
    首先,sc.textFile("input")是按行读取文件
    然后,.flatMap(_.split(" "))是把文件按空格切分开
    为了后面可以使用reduceByKey()这个函数,要把数据整理成KV的形式:.map((_,1)) 再根据K值合并:.reduceByKey(_+_) 最后输出结果:.collect
  • 结果

4.使用IDEA开发工具来完成wordcount

  • 首先创建一个maven项目
  • 设定好依赖,可以在这个网站上查看所有maven的依赖信息:mvnrepository
  • 实现
  • spark work 启动_hadoop_04

  • 结果
  • spark work 启动_hadoop_05

5.Yarn模式

5.1 概述

Spark客户端直接连接yarn,不需要额外构建spark集群,有yarn-client和yarn-cluster。两种模式,主要区别在于Driver程序的运行节点。

5.2 配置yarn
  • 配置yarn-site.xml
    在yarn-site.xml中增加下面的内容
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
<!--是否启动一个线程检查每个任务正使使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认为true -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
  • 配置spark-env.sh
    这个文件在/opt/module/spark/conf这个位置,原名叫spark-env.sh.template,可以修改一下名字mv spark-env.sh.template spark-env.sh,然后在文件中增加下面这句话YARN_CONF_DIR=/opt/module/hadoop-2.7.7/etc/hadoop
  • 分发配置文件
  • 打开集群,一定要打开yarn
  • 运行下面代码:
./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
./examples/jars/spark-examples*.jar \
10

如果有结果说明没什么问题了
现在尝试一下把自己编写的程序放到yarn上执行

  1. 先打包
  2. 把jar包上传到虚拟机上面,我是放到了/opt/moudle/spark的文件夹下
  3. 运行[us@hadoop102 spark]$ bin/spark-submit --class com.us.spark.WordCount --master yarn WordCount.jar 要注意的是,原本在IDEA上填写的地址可能会出现问题,要查看集群上有没有对应的文件夹。因为我是把它运行在整个集群的yarn上面了,所以需要把输入文件传到hdfs上user/us的文件夹下才可以运行。如果使用本地的运行模式,输入文件就要放在本地的文件夹下面。具体可以看报错信息,要上传到hdfs的会提示文件在hdfs://XXXXX:9000上不存在,如果是本地就会提示文件在file://XXXX上不存在。
  4. 结果:
5.3 spark部署yarn的流程图

先来复习一遍yarn的架构

spark work 启动_Hadoop_06


所以spark的东西往container里面放就可以了

那么整体的流程及如下图所示

spark work 启动_spark_07

6.独立部署方式

构建一个由Master+slave构成的spark集群,spark运行在集群中
Master约等于ResourceManager,worker约等于NodeManager

6.1 安装使用
  • 进入如下目录:/opt/module/spark/conf
  • 修改两个文件夹的名字
[us@hadoop102 conf]$ mv slaves.template slaves
[us@hadoop102 conf]$ mv spark-env.sh.template spark-env.sh
  • 修改slaves文件:vim slaves
  • spark work 启动_spark work 启动_08


  • 修改 spark-env.sh 文件:vim spark-env.sh 需要把之前设定的yarn的文件地址注释掉,增加Master的主机和端口号
  • spark work 启动_hadoop_09


  • 分发一下配置文件
[us@hadoop102 module]$ xsync spark
  • 启动集群[us@hadoop102 spark]$ sbin/start-all.sh 如果出现了“JAVA_HOME not set”这样的问题”,要在sbin目录下的spark-config.sh文件中增加export JAVA_HOME=XXXX 启动成功的结果如下图:
  • spark work 启动_hadoop_10

    spark work 启动_hadoop_11

    spark work 启动_Hadoop_12

  • 要使用spark集群运行还是修改master的部分即可,把其修改成“master spark”即可

历史日志端口号:18080,需要配置一下

spark work 启动_hadoop_13