每天读一本:Spark快速大数据分析

因为每天空闲时间长短不固定,长的话看书看的细致一点,时间短的话就粗一些。今天这本书不是第一次看,所以只看了特定部分,做了一些摘抄。

笔记摘要:

运行 Spark 应用的详细过程

(1) 用户通过 spark-submit 脚本提交应用。

(2) spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法。

(3) 驱动器程序与集群管理器通信,申请资源以启动执行器节点。

(4) 集群管理器为驱动器程序启动执行器节点。

(5) 驱动器进程执行用户应用中的操作。根据程序中所定义的对 RDD 的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。

(6) 任务在执行器程序中进行计算并保存结果。

(7) 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源。

每个 RDD 都有固定数目的分区,分区数决定了在 RDD 上执行操作时的并行度。

在执行聚合或分组操作时,可以要求 Spark 使用给定的分区数。Spark 始终尝试根据集群的大小推断出一个有意义的默认值,但是有时候你可能要对并行度进行调优来获取更好的性能表现。

reduce()与fold()方法是对同种元素类型数据的RDD进行操作,即必须同构。其返回值返回一个同样类型的新元素。

fold()与reduce()类似,接收与reduce接收的函数签名相同的函数,另外再加上一个初始值作为第一次调用的结果。(例如,加法初始值应为0,乘法初始值应为1)。

aggregate()方法可以对两个不同类型的元素进行聚合,即支持异构。

默认情况下,join连接操作会将两个数据集中的所有键的哈希值都求出来,将该哈希值相同的记录通过网络传到同一台机器上,然后在那台机器上对所有键相同的记录进行连接操作。要解决这一问题也很简单:在程序开始时,对 userData 表使用 partitionBy() 转化操作,将这张表转为哈希分区

由于在构建 userData 时调用了 partitionBy(),Spark 就知道了该 RDD 是根据键的哈希值来分区的,这样在调用 join() 时,Spark 就会利用到这一点。具体来说,当调用 userData.join(events) 时,Spark 只会对 events 进行数据混洗操作,将 events 中特定 UserID 的记录发送到 userData 的对应分区所在的那台机器上(见图 4-5)。这样,需要通过网络传输的数据就大大减少了,程序运行速度也可以显著提升了。

如果没有将 partitionBy() 转化操作的结果持久化,那么后面每次用到这个 RDD 时都会重复地对数据进行分区操作。不进行持久化会导致整个 RDD 谱系图重新求值。那样的话,partitionBy() 带来的好处就会被抵消,导致重复对数据进行分区以及跨节点的混洗,和没有指定分区方式时发生的情况十分相似。

Spark 的许多操作都引入了将数据根据键跨节点进行混洗的过程。所有这些操作都会从数据分区中获益。就 Spark 1.0 而言,能够从数据分区中获益的操作有 cogroup()、groupWith()、join()、leftOuterJoin()、rightOuterJoin()、groupByKey()、reduceByKey()、combineByKey() 以及 lookup()。

虽然Spark 提供的 HashPartitioner 与 RangePartitioner 已经能够满足大多数用例,但 Spark 还是允许你通过提供一个自定义的 Partitioner 对象来控制 RDD 的分区方式。这可以让你利用领域知识进一步减少通信开销。

使用 pipe() 可以与其他程序通过标准输入和标准输出进行交互

Spark 的两个共享变量,累加器与广播变量

累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。

Spark 独立集群管理器提供在集群上运行应用的简单方法。这种集群管理器由一个主节点和几个工作节点组成,各自都分配有一定量的内存和 CPU 核心。当提交应用时,你可以配置执行器进程使用的内存量,以及所有执行器进程使用的 CPU 核心总数。

独立集群管理器支持两种部署模式。在这两种模式中,应用的驱动器程序运行在不同的地方。在客户端模式中(默认情况),驱动器程序会运行在你执行 spark-submit 的机器上,是 spark-submit 命令的一部分。这意味着你可以直接看到驱动器程序的输出,也可以直接输入数据进去(通过交互式 shell),但是这要求你提交应用的机器与工作节点间有很快的网络速度,并且在程序运行的过程中始终可用。相反,在集群模式下,驱动器程序会作为某个工作节点上一个独立的进程运行在独立集群管理器内部。它也会连接主节点来申请执行器节点。在这种模式下,spark-submit 是“一劳永逸”型,你可以在应用运行时关掉你的电脑。你还可以通过集群管理器的网页用户界面访问应用的日志。向 spark-submit 传递 --deploy-mode cluster 参数可以切换到集群模式。

你可以通过spark-submit 的 --executor-memory 参数来配置此项。每个应用在每个工作节点上最多拥有一个执行器进程 1,因此这个设置项能够控制执行器节点占用工作节点的多少内存。此设置项的默认值是 1 GB,在大多数服务器上,你可能需要提高这个值来充分利用机器。

最后,独立集群管理器在默认情况下会为每个应用使用尽可能分散的执行器进程。例如,假设你有一个 20 个物理节点的集群,每个物理节点是一个四核的机器,然后你使用 --executor-memory 1G 和 --total-executor-cores 8 提交应用。这样 Spark 就会在不同机器上启动 8 个执行器进程,每个 1 GB 内存。Spark 默认这样做,以尽量实现对于运行在相同机器上的分布式文件系统(比如 HDFS)的数据本地化,因为这些文件系统通常也把数据分散到所有物理节点上。

YARN是在 Hadoop 2.0 中引入的集群管理器,它可以让多种数据处理框架运行在一个共享的资源池上,并且通常安装在与 Hadoop 文件系统(简称 HDFS)相同的物理节点上。在这样配置的 YARN 集群上运行 Spark 是很有意义的,它可以让 Spark 在存储数据的物理节点上运行,以快速访问 HDFS 中的数据。

配置和提交任务方式

export HADOOP_CONF_DIR="..."

spark-submit --master yarn yourapp

Mesos上使用 Spark

spark-submit --master mesos://masternode:5050 yourapp

如果在多应用间共享 Spark 集群,你需要决定如何在执行器进程间分配资源。独立集群管理器使用基础的调度策略,这种策略允许限制各个应用的用量来让多个应用并发执行。Apache Mesos 支持应用运行时的更动态的资源共享,而 YARN 则有分级队列的概念,可以让你限制不同类别的应用的用量

选择合适的集群管理器

1、spark独立管理器是原生的,不需要独立安装配置,用起来最简单;

2、如果除了spark还要同时使用其他计算引擎如impala,应该使用YARM或Mesos;Yarn是hadoop自带的,如果已经安装了hadoop,就不需要再安装了,一行配置即可,而Mesos需要独立安装;

3、Mesos 相对于 YARN 和独立模式的一大优点在于其细粒度共享的选项,该选项可以将类似 Spark shell 这样的交互式应用中的不同命令分配到不同的 CPU 上。因此这对于多用户同时运行交互式 shell 的用例更有用处。

第八章

1、表8-1总结了常用的Spark配置项的值

2、8.2 Spark执行的组成部分:作业、任务和步骤。理解一些执行过程中涉及的流程以及相关的术语对于调优和调试是非常有帮助的。

3、8.3查找信息

4、8.4关键性能考量

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180704G1JRAS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券