AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Spark入门

Spark

  • 工具(tool):具有特定功能的完整软件,需要使用时启动,使用后随时关闭

  • 服务(service):一个提供完整功能的软件,通常服务启动后使用专用的协议对外提供端口的监听,客户端可以使用协议://主机名:端口/连接服务器进行业务处理

  • 框架(framework):一套半成品的软件,开发者根据业务需要填充部分模块组成完整的应用程序

1. 是什么

面向海量数据处理的统一分析引擎(计算框架)

Spark支持多语言开发 Scala、Java、Python、SQL、R
Spark支持单机和集群运行

  • 特点

    1. 简单:支持近百种高级算子
    2. 快:基于内存运算
    3. 可扩展:支持大规模集群(百万台)
    4. 统一: 同时支持批处理、SQL分析、流式计算、机器学习、图计算
  • 使用场景
    计算机领域现有的数据处理场景都可以使用Spark开发相应的应用程序。

2. 集群搭建

  • 版本:
    1. 经典版本: 1.6.3
    2. 流行版本: 2.1.x~2.4.x
    3. 最新版本: 3.2.1
  1. 下载解压
  2. 修改配置文件

    • spark-env.sh
# 设置启动spark集群主节点master服务的机器
SPARK_MASTER_HOST=bd0801
# 设置SparkMaster服务端口
# 客户端可以使用 spark://bd0801:7077 提交应用程序
SPARK_MASTER_PORT=7077
# 设置SparkMaster的webui端口
SPARK_MASTER_WEBUI_PORT=8080
  • spark-defaults.conf
# 设置客户端连接Spark集群时使用的默认master
spark.master                   spark://bd0801:7077
  • workers
    设置需要启动worker服务的所有主机
  1. 分发安装包
  2. 添加环境变量
echo 'export SPARK_HOME=/opt/spark-3.2.1' >> /etc/profile
echo 'export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH' >> /etc/profile
source /etc/profile
  1. 启动运行
  • 脚本补充

    • sscp
#!/bin/bash

# 将文件/文件夹scp到集群的所有机器
HOSTNAME=`hostname`
HOSTS=`cat /etc/hosts | grep bd | awk '{print $2}' | grep -v $HOSTNAME`

for HOST in $HOSTS
do
  echo "将${1}文件发送到${HOST}机器的${2}路径"
  scp -rq $1 $HOST:$2
  echo done.
done
  • jpsall
#!/bin/bash

# 获取所有机器的java进程状态

HOSTS=`cat /etc/hosts | grep bd |awk '{print $2}'`

for HOST in $HOSTS
do
  echo "-------$HOST-------"
  ssh $HOST /opt/jdk1.8/bin/jps | grep -v Jps
done

3. 操作

3.1 命令

  • spark-shell
    Spark为了方便开发者进行测试,提供了类似scala解释器的命令行工具
    可以实时编译Spark程序并提交到集群执行
spark-shell \
--master spark://bd0801:7077 \
--deploy-mode client \
--name 应用程序名称 \
--executor-memory 每个执行器占用的内存,默认1G 、
--executor-cores 每个执行器使用的cpu核心数、默认有多少用多少

3.2 编程Api

  • 通常Saprk程序的开发是在IDEA环境
  • 需要引入maven依赖
  • 编写包含main方法的入口程序
  • 将程序测试完成并打成jar包提交到集群运行
# 提交任务的命令
spark-submit [options] <app jar> [app args]
#
spark-submit \
--master spark://bd0801:7077 \
--class 入口类的引用 \
--name 应用程序的名称 \
jar包路径 \
应用程序参数(例如输入输出的路径 hdfs)

4. 核心原理

4.1 任务的提交

  • Driver 驱动程序(Spark程序)
    一个包含入口方法的程序,在这个驱动程序中需要创建SparkContext实例
    使用sc实例创建RDD,完成数据的加载和计算

  • ClusterManager 集群主节点
    对于Spark集群,Master
    对于YARN集群,ResourceManager

  • WorkerNode 集群从节点
    对于Spark集群,Worker
    对于YARN集群,NodeManager

  • Executor 执行器进程
    是一个包含固定计算资源的进程
    每个worker会为每个job单独启动一个executor

  • Task 任务线程
    RDD中每个分区的数据,Spark会单独启动一个线程进行运算
    开发者可以通过调整RDD的分区个数,来改变程序运行时的并发度

  • Cache