Spark:实时数据微批处理(1.Spark 基础)

1.Spark 概述

1.1 Spark 介绍

Spark 是一个快速(基于内存), 通用, 可扩展的集群计算引擎

历史:

  1. 2009 年,Spark 诞生于 UC Berkeley(加州大学伯克利分校, CAL) 的 AMP 实验室, 项目采用 Scala 编程语言编写.
  2. 2010 年, Spark 正式对外开源
  3. 2013 年 6 月, 进入 Apache 孵化器
  4. 2014 年, 成为 Apache 的顶级项目.
  5. 目前最新的版本是 2.4.5 (2.1.1)
    参考: http://spark.apache.org/history.html

1.2 Spark 特点

  • 快速
    与 Hadoop 的 MapReduce 相比, Spark 基于内存的运算是 MapReduce 的 100 倍.基于硬盘的运算也要快 10 倍以上.
    Spark 实现了高效的 DAG 执行引擎, 可以通过基于内存来高效处理数据流

  • 易用
    Spark 支持 Scala, Java, Python, R 和 SQL 脚本, 并提供了超过 80 种高性能的算法, 非常容易创建并行 App
    而且 Spark 支持交互式的 Python 和 Scala 的 shell, 这意味着可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法, 而不是像以前一样 需要打包, 上传集群, 验证等. 这对于原型开发非常重要.

  • 通用
    Spark 结合了SQL, Streaming和复杂分析.
    Spark 提供了大量的类库, 包括 SQL 和 DataFrames, 机器学习(MLlib), 图计算(GraphicX), 实时流处理(Spark Streaming) .
    可以把这些类库无缝的柔和在一个 App 中.
    减少了开发和维护的人力成本以及部署平台的物力成本.

  • 可融合性
    Spark 可以非常方便的与其他开源产品进行融合.
    比如, Spark 可以使用 Hadoop 的 YARN 和 Appache Mesos 作为它的资源管理和调度器, 并且可以处理所有 Hadoop 支持的数据, 包括 HDFS, HBase等.

1.3 Spark 内置模块介绍

在这里插入图片描述

  • 集群管理器(Cluster Manager)
    Spark 设计可以高效地在一个计算节点到数千个计算节点之间伸缩计算。
    为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(Cluster Manager)上运行,目前 Spark 支持 3 种集群管理器:
    1.Hadoop YARN(在国内使用最广泛)
    2.Apache Mesos(国内使用较少, 国外使用较多)
    3.Standalone(Spark 自带的资源调度器, 需要在集群中的每台节点上配置 Spark)

  • SparkCore
    实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。SparkCore 中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义。

  • Spark SQL
    是 Spark 用来操作结构化数据的程序包。通过SparkSql,我们可以使用 SQL或者Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比如 Hive 表、Parquet 以及 JSON 等。

  • Spark Streaming
    是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。

  • Spark MLlib
    提供常见的机器学习 (ML) 功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。

2.Spark 运行模式

在各种运行模式如何运行 Spark 应用?
首先需要下载 Spark
1.官网地址 http://spark.apache.org/
2.文档查看地址 https://spark.apache.org/docs/2.1.1/
3.下载地址 https://archive.apache.org/dist/spark/
目前最新版本为 2.4.5, 考虑到国内企业使用情况选择 2.1.1 合适. 不过2.x.x 的版本差别都不大.

2.1 Local 模式

Local 模式就是指的只在一台计算机上来运行 Spark.
通常用于测试的目的来使用 Local 模式, 实际的生产环境中不会使用 Local 模式.

2.1.1 运行官方求PI的案例

bin/spark-submit \                                                                 
--class org.apache.spark.examples.SparkPi \
--master 'local[*]' \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

结果展示:
在这里插入图片描述

2.1.2 使用 Spark-shell

  1. 准备数据()

  2. 启动spark-shell

    bin/spark-shell --master 'local[2]'
    

    注意: 可以省略--masetr 'local[2]', 默认就是 --master 'local[*]'

  3. 计算wordCount

    sc.textFile("./input").flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect
    //  hello  -> (hello, 1)
    
    // jaffe-> (jaffe, 1)
    

2.1.3 spark通用运行简易流程

在这里插入图片描述

2.2 Spark 核心概念介绍

2.2.1 Master

Spark 特有资源调度系统的 Leader。掌管着整个集群的资源信息,类似于 Yarn 框架中的 ResourceManager,主要功能:

  1. 监听 Worker,看 Worker 是否正常工作;
  2. Master 对 Worker、Application 等的管理(接收 Worker 的注册并管理所有的Worker,接收 Client 提交的 Application,调度等待的 Application 并向Worker 提交)。

2.2.2 Worker

Spark 特有资源调度系统的 Slave,有多个。每个 Slave 掌管着所在节点的资源信息,类似于 Yarn 框架中的 NodeManager,主要功能:

  1. 通过 RegisterWorker 注册到 Master;
  2. 定时发送心跳给 Master;
  3. 根据 Master 发送的 Application 配置进程环境,并启动 ExecutorBackend(执行 Task 所需的临时进程)

2.2.3 driver program(驱动程序)

每个 Spark 应用程序都包含一个驱动程序, 驱动程序负责把并行操作发布到集群上.
驱动程序包含 Spark 应用程序中的主函数, 定义了分布式数据集以应用在集群中.
在前面的wordcount案例集中, spark-shell 就是我们的驱动程序, 所以我们可以在其中键入我们任何想要的操作, 然后由他负责发布.
驱动程序通过SparkContext对象来访问 Spark, SparkContext对象相当于一个到 Spark 集群的连接.
在 spark-shell 中, 会自动创建一个SparkContext对象, 并把这个对象命名为sc.

2.2.4 executor(执行器)

SparkContext对象一旦成功连接到集群管理器, 就可以获取到集群中每个节点上的执行器(executor).
执行器是一个进程(进程名: ExecutorBackend, 运行在 Worker 上), 用来执行计算和为应用程序存储数据.
然后, Spark 会发送应用程序代码(比如:jar包)到每个执行器. 最后, SparkContext对象发送任务到执行器开始执行程序.

2.2.5 RDD(Resilient Distributed Dataset) 弹性分布式数据集

一旦拥有了SparkContext对象, 就可以使用它来创建 RDD 了. 在前面的例子中, 我们调用sc.textFile(…)来创建了一个 RDD, 表示文件中的每一行文本. 我们可以对这些文本行运行各种各样的操作.

2.2.6 cluster managers(集群管理器)

为了在一个 Spark 集群上运行计算, SparkContext对象可以连接到几种集群管理器(Spark’s own standalone cluster manager, Mesos or YARN).
集群管理器负责跨应用程序分配资源.

2.3 Standalone 模式

构建一个由 Master + Slave 构成的 Spark 集群,Spark 运行在集群中。
这个要和 Hadoop 中的 Standalone 区别开来. 这里的 Standalone 是指只用 Spark 来搭建一个集群, 不需要借助其他的框架.是相对于 Yarn 和 Mesos 来说的.

2.3.1 搭建spark集群

  1. 配置环境变量 spark-env.sh

    SPARK_MASTER_HOST=hadoop102
    SPARK_MASTER_PORT=7077   # master的端口, 提交应用的时候通过这个端口
    
    
  2. slaves

    hadoop102
    hadoop103
    hadoop104
    
  3. 分发 xsync spark-standalone

  4. 启动集群

    sbin/start-all.sh
    
    1. 在当前设备启动一个master

      要和你配置中的master保存一致

    2. salves的每个slave起动一个worder

    通过ui查看worker和master

    1. master 8080
    2. worder 8081

2.3.2 关于ui地址

master: 8080

worker: 8081

application: 4040 (用来查看正在运行的app的情况, 一旦这个应用结束, 则无法查看)

如何解决日志问题: 配置历史服务器

  1. spark-defaults.conf

    默认配置

    spark.eventLog.enabled           true
    spark.eventLog.dir               hdfs://hadoop102:9000/spark-log-dir-1128
    

    注意: 目录要手动提前创建好

  2. spark-env.sh

    export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://hadoop102:9000/spark-log-dir-1128"
    

    不要忘记启动hdfs

  3. 启动历史服务器

    重启集群

    sbin/start-history-server.sh
    

2.3.3 deploy-mode这个参数

当在集群中运行spark的时候, driver他的运行位置有两个选择:

  1. 在客户端(client)

    默认就是这种情况

    --deploy-mode client    (默认值)
    

    这个时候的driver所有日志已经在控制台打印完毕, 所以历史服务器不会有记录

    集群在北京, 提交应用在深圳. 这个时候驱动在深圳

  2. 在集群中某个节点上

    --deploy-mode cluster
    

    这个时候的driver就运行在集群中,要看driver的日志, 需要去worker上去找

2.3.4 Master高可用

  1. 注释掉关于master的配置

    #SPARK_MASTER_HOST=hadoop102
    #SPARK_MASTER_PORT=7077   # master的端口, 提交应用的时候通过这个端口
    
  2. 添加高可用配置

    export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop102:2181,hadoop103:2181,hadoop104:2181 -Dspark.deploy.zookeeper.dir=/spark1128"
    
  3. 分发

  4. 需要启动多个master

2.4 yarn模式

将来不需要额外的搭建新的集群, 只需要把要运行的任务bin/spark-submit 交给yarn集群

2.4.1 配置

  1. 修改spark-evn.sh文件,去掉 master 的 HA 配置, 日志服务的配置保留着.

  2. 配置, 让spark知道rm的位置. 向yarn提交, 本质就是连接rm

    只需要配置一下hadoop的配置文件的目录

    HADOOP_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
    

    或者

    YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
    

2.4.2 运行任务

bin/spark-shell --master yarn

注意: spark-shell运行在yarn的时候, deploy-mode只能是client

可能碰到的问题:

lzo的jar没有

  1. 第一种解决方案:在hadoop去掉相关的配置
  2. 第二种解决方案: 在spark指定下lzo jar的位置

2.4.4 日志服务

  1. 在spark-default.conf中添加如下配置:
spark.yarn.historyServer.address=hadoop102:18080
spark.history.ui.port=18080
  1. 可能碰到的问题:
    如果在 yarn 日志端无法查看到具体的日志, 则在yarn-site.xml中添加如下配置:
<property>
    <name>yarn.log.server.url</name>
    <value>http://hadoop102:19888/jobhistory/logs</value>
</property>

2.4.3 idea的module的概念

idea中的代码:

  1. 如果在idea中直接运行, 则必须有setMaster("local[*]")
  2. 如果要打包到linux执行, 则必须把setMaster("local[*]")去掉., 再使用spark-submit指定master

2.5 几种运行模式的对比

模式Spark安装机器数需启动的进程所属者
Local1Spark
Standalone多台Master及WorkerSpark
Yarn1Yarn及HDFSHadoop
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值