大数据系列Spark学习笔记之初识Spark

24次阅读

共计 4239 个字符,预计需要花费 11 分钟才能阅读完成。

1. Spark 简介

  • 2009 年,Spark 诞生于 伯克利大学的 AMPLab 实验室。最出 Spark 只是一个实验性的项目,代码量非常少,属于轻量级的框架。
  • 2010 年,伯克利大学正式开源了 Spark 项目。
  • 2013 年 6 月,Spark 成为了 Apache 基金会下的项目,进入高速发展期。第三方开发者贡献了大量的代码,活跃度非常高
  • 2014 年 2 月,Spark 以飞快的速度称为了Apache 的顶级项目,同时大数据公司 Cloudera 宣称加大 Spark 框架的投入来取代 MapReduce
  • 2014 年 4 月,大数据公司 MapR 投入 Spark 阵营,Apache Mahout 放弃 MapReduce,将使用 Spark 作为计算引擎。
  • 2014 年 5 月,Spark 1.0.0 发布。
  • 2015 年~,Spark 在国内 IT 行业变得愈发火爆,越来越多的公司开始重点部署或者使用 Spark 来替代 MR2、Hive、Storm 等传统的大数据并行计算框架

2. Spark 是什么?

  • Apache Spark™ is a unified analytics engine for large-scale data processing.
  • 大规模数据集的统一分析引擎
  • Spark 是一个基于内存的通用并行计算框架,目的是让数据分析更加快速
  • Spark 包含了大数据领域常见的各种计算框架

    • spark core(离线计算)
    • sparksql(交互式查询)
    • spark streaming(实时计算)
    • Spark MLlib (机器学习)
    • Spark GraphX (图计算)

3. Spark 能代替 hadoop 吗?

不完全对

因为我们只能使用 spark core 代替 mr 做离线计算, 数据的存储还是要依赖 hdfs

Spark+Hadoop 的组合,才是未来大数据领域最热门的组合,也是最有前景的组合!

4. Spark 的特点

  • 速度

    • 内存计算在速度上要比 mr 快 100 倍以上
    • 磁盘计算在速度上要比 mr 快 10 倍以上
  • 容易使用

    • 提供了 java scala python R 语言的 api 接口
  • 一站式解决方案

    • spark core(离线计算)
    • spark sql(交互式查询)
    • spark streaming(实时计算)
    • …..
  • 可以运行在任意的平台

    • yarn
    • Mesos
    • standalone

5. Spark 的缺点

  • JVM 的内存 overhead 太大,1G 的数据通常需要消耗 5G 的内存 (Project Tungsten 正试图解决这个问题)
  • 不同的 spark app 之间缺乏有效的共享内存机制(Project Tachyon 在试图引入分布式的内存管理,这样不同的 spark app 可以共享缓存的数据)

6. Spark vs MR

6.1 mr 的局限性

  • 抽象层次低,需要手工编写代码来完成,使用上难以上手
  • 只提供两个操作,Map 和 Reduce,表达力欠缺
  • 一个 Job 只有 Map 和 Reduce 两个阶段(Phase),复杂的计算需要大量的 Job 完成,Job 之间的依赖关系是由开发者自己管理的
  • 中间结果 (reduce 的输出结果) 也放在 HDFS 文件系统中
  • 延迟高,只适用 Batch 数据处理,对于交互式数据处理,实时数据处理的支持不够
  • 对于迭代式数据处理性能比较差

6.2 Spark 解决了 mr 中的那些问题?

  • 抽象层次低,需要手工编写代码来完成,使用上难以上手

    • 通过 spark 中的 RDD(Resilient distributed datasets)来进行抽象
  • 只提供两个操作,Map 和 Reduce,表达力欠缺

    • 在 spark 中提供了多种算子
  • 一个 Job 只有 Map 和 Reduce 两个阶段

    • 在 spark 中可以有多个阶段(stage)
  • 中间结果也放在 HDFS 文件系统中(速度慢)

    • 中间结果放在内存中,内存放不下了会写入本地磁盘,而不是 HDFS
  • 延迟高,只适用 Batch 数据处理,对于交互式数据处理,实时数据处理的支持不够

    • sparksql 和 sparkstreaming 解决了上面问题
  • 对于迭代式数据处理性能比较差

    • 通过在内存中缓存数据,提高迭代式计算的性能

== 因此,Hadoop MapReduce 会被新一代的大数据处理平台替代是技术发展的趋势,而在新一代的大数据处理平台中,Spark 目前得到了最广泛的认可和支持 ==

7. Spark 的版本

  • spark1.6.3 : scala 的版本 2.10.5
  • spark2.2.0 : scala 的版本 2.11.8(新项目建议使用 spark2.x 的版本)
  • hadoop2.7.5

8. Spark 单机版的安装

  • 准备安装包 spark-2.2.0-bin-hadoop2.7.tgz

    tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz  -C /opt/
    mv spark-2.2.0-bin-hadoop2.7/ spark
  • 修改 spark-env.sh

    export JAVA_HOME=/opt/jdk
    export SPARK_MASTER_IP=uplooking01
    export SPARK_MASTER_PORT=7077
    export SPARK_WORKER_CORES=4
    export SPARK_WORKER_INSTANCES=1
    export SPARK_WORKER_MEMORY=2g
    export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
  • 配置环境变量

    # 配置 Spark 的环境变量
    export SPARK_HOME=/opt/spark
    export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
  • 启动单机版 spark

    start-all-spark.sh
  • 查看启动

    http://uplooking01:8080

9. Spark 分布式集群的安装

  • 配置 spark-env.sh

    [root@uplooking01 /opt/spark/conf]    
            export JAVA_HOME=/opt/jdk
            #配置 master 的主机
            export SPARK_MASTER_IP=uplooking01
            #配置 master 主机通信的端口
            export SPARK_MASTER_PORT=7077
            #配置 spark 在每个 worker 中使用的 cpu 核数
            export SPARK_WORKER_CORES=4
            #配置每个主机有一个 worker
            export SPARK_WORKER_INSTANCES=1
            #worker 的使用内存是 2gb
            export SPARK_WORKER_MEMORY=2g
            #hadoop 的配置文件中的目录
            export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
  • 配置 slaves

    [root@uplooking01 /opt/spark/conf]
            uplooking03
            uplooking04
            uplooking05
  • 分发 spark

    [root@uplooking01 /opt/spark/conf]    
            scp -r /opt/spark  uplooking02:/opt/
            scp -r /opt/spark  uplooking03:/opt/
            scp -r /opt/spark  uplooking04:/opt/
            scp -r /opt/spark  uplooking05:/opt/
  • 分发 uplooking01 上配置的环境变量

    [root@uplooking01 /]    
            scp -r /etc/profile  uplooking02:/etc/
            scp -r /etc/profile  uplooking03:/etc/
            scp -r /etc/profile  uplooking04:/etc/
            scp -r /etc/profile  uplooking05:/etc/
  • 启动 spark

    [root@uplooking01 /]    
        start-all-spark.sh

10. Spark 高可用集群

先停止正在运行的 spark 集群

  • 修改 spark-env.sh

    # 注释以下这两行内容
    #export SPARK_MASTER_IP=uplooking01
    #export SPARK_MASTER_PORT=7077
  • 添加内容

    export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=uplooking03:2181,uplooking04:2181,uplooking05:2181 -Dspark.deploy.zookeeper.dir=/spark"
  • 分发修改的[配置

    scp /opt/spark/conf/spark-env.sh uplooking02:/opt/spark/conf
    scp /opt/spark/conf/spark-env.sh uplooking03:/opt/spark/conf
    scp /opt/spark/conf/spark-env.sh uplooking04:/opt/spark/conf
    scp /opt/spark/conf/spark-env.sh uplooking05:/opt/spark/conf
  • 启动集群

    [root@uplooking01 /]
        start-all-spark.sh
    [root@uplooking02 /]
        start-master.sh

11. 第一个 Spark-Shell 程序

spark-shell  --master spark://uplooking01:7077 
#spark-shell 可以在启动时指定 spark-shell 这个 application 使用的资源(总核数, 每个 work 上使用的内存)
spark-shell  --master  spark://uplooking01:7077   --total-executor-cores 6   --executor-memory 1g

#如果不指定  默认使用每个 worker 上全部的核数, 和每个 worker 上的 1g 内存
sc.textFile("hdfs://ns1/sparktest/").flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).collect

12. Spark 中的角色

  • Master

    • 负责接收提交的作业的请求
    • master 负责调度资源(在 woker 中启动 CoarseGrainedExecutorBackend)
  • Worker

    • worker 中的 executor 负责执行 task
  • Spark-Submitter ===> Driver

    • 提交 spark 应用程序给 master

13. Spark 提交作业的大体流程

正文完
 0