当前位置: 首页 > 新闻 > 信息荟萃
编号:5593
spark快速大数据分析.pdf
http://www.100md.com 2020年11月16日
第1页
第10页
第13页
第30页
第38页
第110页

    参见附件(16253KB,231页)。

     spark快速大数据分析百度云

    大数据是近几年广受关注的一个概念。今天,互联网不断发展,逐渐深入我们生活的各个层面,随之而来的是数据量的指数级增长,使用Spark进行大规模数据分析的实战宝典,由著名大数据公司Cloudera的数据科学家撰写,有需要的就快来吧

    相关内容部分预览

    

    内容介绍

    使用Spark进行大规模数据分析的实战宝典,由著名大数据公司Cloudera的数据科学家撰写。四位作者首先结合数据科学和大数据分析的广阔背景讲解了Spark,然后介绍了用Spark和Scala进行数据处理的基础知识,接着讨论了如何将Spark用于机器学习,同时介绍了常见应用中几个最常用的算法。此外还收集了一些更加新颖的应用,比如通过文本隐含语义关系来查询Wikipedia或分析基因数据。

    Spark快速大数据分析目录

    第1章 Spark数据分析导论 1

    1.1 Spark是什么 1

    1.2 一个大一统的软件栈 2

    1.2.1 Spark Core 2

    1.2.2 Spark SQL 3

    1.2.3 Spark Streaming 3

    1.2.4 MLlib 3

    1.2.5 GraphX 3

    1.2.6 集群管理器 4

    1.3 Spark的用户和用途 4

    1.3.1 数据科学任务 4

    1.3.2 数据处理应用 5

    1.4 Spark简史 5

    1.5 Spark的版本和发布 6

    1.6 Spark的存储层次 6

    第2章 Spark与入门 7

    2.1 Spark 7

    2.2 Spark中Python和Scala的shell 9

    2.3 Spark 核心概念简介 12

    2.4 独立应用 14

    2.4.1 初始化SparkContext 15

    2.4.2 构建独立应用 16

    2.5 总结 19

    浅析spark快速大数据分析

    Spark是一种流行的大数据集群计算框架,通常被大数据工程师,大数据科学家和大数据分析师用于各种用例。根据情况的不同,每种用户类型都将要求一定范围的数据访问权限。

    与其他像Presto这样具有内置授权框架和细粒度访问控制的大数据引擎不同,Spark可以直接访问Qubole Metastore(利用Apache Hive)中存储的所有表和资源。这不仅带来安全问题,而且阻碍了增长和企业采用。因此,我们很有必要在Qubole平台上引入新的Spark数据访问控制框架。

    一、目标

    1、这些是介绍Spark访问控制框架时考虑的一些最重要的设计目标:

    2、细粒度的访问控制应在各种大数据引擎上统一应用。

    3、必须通过任何引擎查看或编辑策略,以提供一致且可预测的行为。

    4、支持SparkSQL访问方法,例如数据框或SQL语句。

    5、该框架必须易于与Hive Authorization或Apache Ranger等各种策略管理器集成。

    二、实施细节

    考虑到这些要求,我们决定将Hive授权实施为我们的第一个策略管理器。Hive授权策略存储在Qubole Metastore中,该库充当共享的中央组件,并存储与Hive资源(如Hive表)相关的元数据。

    Spark在访问Hive表或添加和修改这些策略时尊重Qubole Metastore中存储的策略。

    总之,我们实现了一个SQL标准访问控制层,该层与当今的Apache Hive或Presto中的层相同。以下各节详细介绍了体系结构,并提供了一个示例说明其工作原理。

    三、建筑

    授权逻辑嵌入在Spark Catalyst Framework 的分析器层内部。分析工具的规则负责解析“数据库”,“表”和“列”等实体。从计划中提取有关不同已解析实体的信息,并将其传递给Hive 授权器,后者已经具有有关用户的信息。然后,Hive授权器使用Qubole Metastore中存在的安全策略执行资源级别检查,如果用户缺少抛出HiveAccessControlException的运行特权,则该查询将停止执行查询。

    四、限制表级访问

    1、假设我们有一个Hive表“工资”,其定义如下:

    出于数据治理的目的,应允许属于财务团队的用户“ Jane”访问表,并且应限制IT用户“ Robin”访问表。

    2、属于“ admin”角色的任何用户都可以按照以下步骤限制对该表的访问:

    A、创建一个新角色,并将此角色授予应该有权访问该表的用户,在这种情况下,将其授予用户“ Jane”。

    (用户)sql> SET ROLE admin;

    (用户/管理员)sql> CREATE ROLE finance;

    (用户/管理员)sql>向用户Jane授予资金;

    B、向角色“金融”提供“选择”特权。

    (用户/管理员)SQL>在工资单上授予资助以选择角色;

    3、当“简”承担通过“ SET ROLE ALL”命令授予的所有角色后访问表时,将显示以下结果–

    4、当“罗宾”或未获得“财务”角色的任何其他用户尝试相同的流程时,我们可以预期会发生

    五、限制列和行访问

    可以通过视图来实现高级用例,例如限制列或行的访问。例如,假设我们有一个名为“ finance_intern”的新角色,该角色无权访问表“工资”中的“工资”列,而只能访问与“财务”部门关联的行。

    A、像以前一样,任何属于admin角色的用户都可以创建一个包含三列的新视图(emp_id,emp_name,dept_name),在dept_name上添加一个过滤器,并提供finance-intern角色。访问此新视图而不是基表。

    浅析spark快速大数据分析-AAA教育www.aaa-cg.com.cn

    (用户)sql> SET ROLE admin;

    (用户/管理员)sql> CREATE VIEW payroll_view AS

    SELECT emp_id,emp_name,dept_name FROM工资单

    dept_name ='财务';

    (用户/管理员)sql> GRANT SELECT ON payroll_view TO ROLE finance_intern;

    B、分配了`finance_intern`角色的用户可以担任该角色并访问视图。结果如下:

    (用户)SQL> SET ROLE finance_intern;

    C、由于访问基表没有被授予这个角色,我们会得到一个HiveAccessControlException如果用户试图访问未经授权的数据。

    spark快速大数据分析百度云截图

    图灵程序设计丛书

    人 民 邮 电 出 版 社

    北 京

    Learning Spark

    Lightning-Fast Data Analysis

    [美] Holden Karau [美] Andy Konwinski

    [美] Patrick Wendell [加] Matei Zaharia

    著

    王道远 译

    英特尔大数据技术中心 审校

    Spark快速大数据分析

    Beijing ? Cambridge ? Farnham ? K?ln ? Sebastopol ? Tokyo

    O’Reilly Media, Inc.授权人民邮电出版社出版内 容 提 要

    本书由 Spark 开发者及核心成员共同打造,讲解了网络大数据时代应运而生的、能高效迅

    捷地分析处理数据的工具——Spark,它带领读者快速掌握用 Spark 收集、计算、简化和保存海

    量数据的方法,学会交互、迭代和增量式分析,解决分区、数据本地化和自定义序列化等问题。

    本书适合大数据时代所有需要进行数据分析的人员阅读。

    定价:59.00元

    读者服务热线:(010)51095186转600 印装质量热线:(010)81055316

    反盗版热线:(010)81055315

    广告经营许可证:京崇工商广字第 0021 号

    著 [美] Holden Karau Andy Konwinski

    Patrick Wendell

    [加] Matei Zaharia

    译 王道远

    审 校 英特尔大数据技术中心

    责任编辑 岳新欣

    执行编辑 张 曼

    责任印制 杨林杰

    人民邮电出版社出版发行 北京市丰台区成寿寺路11号

    邮编 100164 电子邮件 315@ptpress.com.cn

    网址 http:www.ptpress.com.cn

    北京 印刷

    开本:800×1000 116

    印张:14.513

    字数:343千字 2015年 9 月第 1 版

    印数:1 — 3 500册 2015年 9 月北京第 1次印刷

    著作权合同登记号 图字:01-2015-3678号

    ◆

    ◆

    ◆iii

    版权声明

    · 2015 by O’Reilly Media, Inc.

    Simpli?ed Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts Telecom

    Press, 2015. Authorized translation of the English edition, 2015 O’Reilly Media, Inc., the

    owner of all rights to publish and sell the same.

    All rights reserved including the rights of reproduction in whole or in part in any form.

    英文原版由 O’Reilly Media, Inc.出版,2015。

    简体中文版由人民邮电出版社出版, 2015。英文原版的翻译得到 O’Reilly Media, Inc.的

    授权。此简体中文版的出版和销售得到出版权和销售权的所有者——O’Reilly Media, Inc.

    的许可。

    版权所有,未得书面许可,本书的任何部分和全部不得以任何形式重制。O’Reilly Media 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。

    自 1978 年开始,O’Reilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创

    着未来,而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社

    会对新科技的应用。作为技术社区中活跃的参与者,O’Reilly 的发展充满了对创新的

    倡导、创造和发扬光大。

    O’Reilly为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组

    织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了 Make 杂志,从而成为 DIY 革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。

    O’Reilly 的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创

    新产业的革命性思想。作为技术人士获取信息的选择,O’Reilly 现在还将先锋专家的

    知识传递给普通的计算机用户。无论是通过书籍出版、在线服务或者面授课程,每一

    项O’Reilly的产品都反映了公司不可动摇的理念——信息是激发创新的力量。

    业界评论

    “O’Reilly Radar博客有口皆碑。 ”

    ——Wired

    “O’Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。”

    ——Business 2.0

    “O’Reilly Conference是聚集关键思想领袖的绝对典范。 ”

    ——CRN

    “一本 O’Reilly的书就代表一个有用、有前途、需要学习的主题。”

    ——Irish Times

    “Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野,并且切实地按照

    Yogi Berra 的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去,Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。 ”

    ——Linux Journal

    O’Reilly Media, Inc.介绍v

    目录

    推荐序 .....................................................................................................................................................

    xi

    译者序 ...................................................................................................................................................

    xiv

    序 ............................................................................................................................................................

    xvi

    前言 .......................................................................................................................................................

    xvii

    第1 章 Spark 数据分析导论 ..........................................................................................................

    1

    1.1 Spark 是什么...............................................................................................................................

    1

    1.2 一个大一统的软件栈 .................................................................................................................

    2

    1.2.1 Spark Core ......................................................................................................................

    2

    1.2.2 Spark SQL.......................................................................................................................

    3

    1.2.3 Spark Streaming ..............................................................................................................

    3

    1.2.4 MLlib ..............................................................................................................................

    3

    1.2.5 GraphX............................................................................................................................

    3

    1.2.6 集群管理器 ....................................................................................................................

    4

    1.3 Spark 的用户和用途...................................................................................................................

    4

    1.3.1 数据科学任务 ................................................................................................................

    4

    1.3.2 数据处理应用 ................................................................................................................

    5

    1.4 Spark 简史...................................................................................................................................

    5

    1.5 Spark的版本和发布...................................................................................................................

    6

    1.6 Spark的存储层次.......................................................................................................................

    6

    第2 章 Spark 下载与入门 ...............................................................................................................

    7

    2.1 下载Spark...................................................................................................................................

    7vi | 目录

    2.2 Spark 中Python 和Scala的shell..............................................................................................

    9

    2.3 Spark 核心概念简介.................................................................................................................

    12

    2.4 独立应用 ...................................................................................................................................

    14

    2.4.1 初始化SparkContext...................................................................................................

    15

    2.4.2 构建独立应用 ..............................................................................................................

    16

    2.5 总结 ...........................................................................................................................................

    19

    第 3章 RDD 编程 ............................................................................................................................

    21

    3.1 RDD 基础 .................................................................................................................................

    21

    3.2 创建 RDD .................................................................................................................................

    23

    3.3 RDD 操作 .................................................................................................................................

    24

    3.3.1 转化操作 ......................................................................................................................

    24

    3.3.2 行动操作 ......................................................................................................................

    26

    3.3.3 惰性求值 ......................................................................................................................

    27

    3.4 向 Spark传递函数....................................................................................................................

    27

    3.4.1 Python ...........................................................................................................................

    27

    3.4.2 Scala ..............................................................................................................................

    28

    3.4.3 Java ...............................................................................................................................

    29

    3.5 常见的转化操作和行动操作 ...................................................................................................

    30

    3.5.1 基本 RDD .....................................................................................................................

    30

    3.5.2 在不同 RDD类型间转换 ............................................................................................

    37

    3.6 持久化 (缓存 ) .........................................................................................................................

    39

    3.7 总结 ...........................................................................................................................................

    40

    第 4章 键值对操作 .........................................................................................................................

    41

    4.1 动机 ...........................................................................................................................................

    41

    4.2 创建 Pair RDD ..........................................................................................................................

    42

    4.3 Pair RDD的转化操作 ..............................................................................................................

    42

    4.3.1 聚合操作 ......................................................................................................................

    45

    4.3.2 数据分组 ......................................................................................................................

    49

    4.3.3 连接 ..............................................................................................................................

    50

    4.3.4 数据排序 ......................................................................................................................

    51

    4.4 Pair RDD 的行动操作 ..............................................................................................................

    52

    4.5 数据分区(进阶) .....................................................................................................................

    52

    4.5.1 获取RDD 的分区方式 ................................................................................................

    55

    4.5.2 从分区中获益的操作 ..................................................................................................

    56

    4.5.3 影响分区方式的操作 ..................................................................................................

    57

    4.5.4 示例:PageRank ..........................................................................................................

    57

    4.5.5 自定义分区方式 ..........................................................................................................

    59

    4.6 总结 ...........................................................................................................................................

    61目录 | vii

    第5 章 数据读取与保存 ................................................................................................................

    63

    5.1 动机 ...........................................................................................................................................

    63

    5.2 文件格式 ...................................................................................................................................

    64

    5.2.1 文本文件 ......................................................................................................................

    64

    5.2.2 JSON .............................................................................................................................

    66

    5.2.3 逗号分隔值与制表符分隔值 ......................................................................................

    68

    5.2.4 SequenceFile .................................................................................................................

    71

    5.2.5 对象文件 ......................................................................................................................

    73

    5.2.6 Hadoop输入输出格式 .................................................................................................

    73

    5.2.7 文件压缩 ......................................................................................................................

    77

    5.3 文件系统 ...................................................................................................................................

    78

    5.3.1 本地“常规”文件系统 ............................................................................................

    78

    5.3.2 Amazon S3 ....................................................................................................................

    78

    5.3.3 HDFS ............................................................................................................................

    79

    5.4 Spark SQL中的结构化数据 ....................................................................................................

    79

    5.4.1 Apache Hive .................................................................................................................

    80

    5.4.2 JSON .............................................................................................................................

    80

    5.5 数据库 .......................................................................................................................................

    81

    5.5.1 Java 数据库连接 ..........................................................................................................

    81

    5.5.2 Cassandra ......................................................................................................................

    82

    5.5.3 HBase ............................................................................................................................

    84

    5.5.4 Elasticsearch .................................................................................................................

    85

    5.6 总结 ...........................................................................................................................................

    86

    第6 章 Spark 编程进阶 .................................................................................................................

    87

    6.1 简介 ...........................................................................................................................................

    87

    6.2 累加器 .......................................................................................................................................

    88

    6.2.1 累加器与容错性 ..........................................................................................................

    90

    6.2.2 自定义累加器 ..............................................................................................................

    91

    6.3 广播变量 ...................................................................................................................................

    91

    6.4 基于分区进行操作 ...................................................................................................................

    94

    6.5 与外部程序间的管道 ...............................................................................................................

    96

    6.6 数值 RDD 的操作 ....................................................................................................................

    99

    6.7 总结 .........................................................................................................................................

    100

    第7 章 在集群上运行 Spark ......................................................................................................

    101

    7.1 简介 .........................................................................................................................................

    101

    7.2 Spark 运行时架构...................................................................................................................

    101

    7.2.1 驱动器节点 ................................................................................................................

    102viii | 目录

    7.2.2 执行器节点 ................................................................................................................

    103

    7.2.3 集群管理器 ................................................................................................................

    103

    7.2.4 启动一个程序 ............................................................................................................

    104

    7.2.5 小结 ............................................................................................................................

    104

    7.3 使用spark-submit 部署应用 ................................................................................................

    105

    7.4 打包代码与依赖 .....................................................................................................................

    107

    7.4.1 使用Maven构建的用Java 编写的 Spark 应用 .......................................................

    108

    7.4.2 使用 sbt构建的用Scala编写的Spark 应用 ............................................................

    109

    7.4.3 依赖冲突 ....................................................................................................................

    111

    7.5 Spark 应用内与应用间调度...................................................................................................

    111

    7.6 集群管理器 .............................................................................................................................

    112

    7.6.1 独立集群管理器 ........................................................................................................

    112

    7.6.2 Hadoop YARN ............................................................................................................

    115

    7.6.3 Apache Mesos .............................................................................................................

    116

    7.6.4 Amazon EC2 ...............................................................................................................

    117

    7.7 选择合适的集群管理器 .........................................................................................................

    120

    7.8 总结 .........................................................................................................................................

    121

    第8 章 Spark调优与调试 ...........................................................................................................

    123

    8.1 使用 SparkConf配置Spark ...................................................................................................

    123

    8.2 Spark 执行的组成部分:作业、任务和步骤.......................................................................

    127

    8.3 查找信息 .................................................................................................................................

    131

    8.3.1 Spark 网页用户界面 ..................................................................................................

    131

    8.3.2 驱动器进程和执行器进程的日志 ............................................................................

    134

    8.4 关键性能考量 .........................................................................................................................

    135

    8.4.1 并行度 ........................................................................................................................

    135

    8.4.2 序列化格式 ................................................................................................................

    136

    8.4.3 内存管理 ....................................................................................................................

    137

    8.4.4 硬件供给 ....................................................................................................................

    138

    8.5 总结 .........................................................................................................................................

    139

    第9 章 Spark SQL ........................................................................................................................

    141

    9.1 连接Spark SQL ......................................................................................................................

    142

    9.2 在应用中使用Spark SQL ......................................................................................................

    144

    9.2.1 初始化 Spark SQL......................................................................................................

    144

    9.2.2 基本查询示例 ............................................................................................................

    145

    9.2.3 SchemaRDD ...............................................................................................................

    146

    9.2.4 缓存 ............................................................................................................................

    148

    9.3 读取和存储数据 .....................................................................................................................

    149

    9.3.1 Apache Hive ...............................................................................................................

    149目录 | ix

    9.3.2 Parquet........................................................................................................................

    150

    9.3.3 JSON ...........................................................................................................................

    150

    9.3.4 基于RDD ...................................................................................................................

    152

    9.4 JDBCODBC服务器 ..............................................................................................................

    153

    9.4.1 使用 Beeline ...............................................................................................................

    155

    9.4.2 长生命周期的表与查询 ............................................................................................

    156

    9.5 用户自定义函数 .....................................................................................................................

    156

    9.5.1 Spark SQL UDF ..........................................................................................................

    156

    9.5.2 Hive UDF ....................................................................................................................

    157

    9.6 Spark SQL 性能 ......................................................................................................................

    158

    9.7 总结 .........................................................................................................................................

    159

    第10 章 Spark Streaming ..........................................................................................................

    161

    10.1 一个简单的例子 ...................................................................................................................

    162

    10.2 架构与抽象 ...........................................................................................................................

    164

    10.3 转化操作 ...............................................................................................................................

    167

    10.3.1 无状态转化操作 .....................................................................................................

    167

    10.3.2 有状态转化操作 .....................................................................................................

    169

    10.4 输出操作 ...............................................................................................................................

    173

    10.5 输入源 ...................................................................................................................................

    175

    10.5.1 核心数据源 .............................................................................................................

    175

    10.5.2 附加数据源 .............................................................................................................

    176

    10.5.3 多数据源与集群规模 .............................................................................................

    179

    10.6 247不间断运行 ...................................................................................................................

    180

    10.6.1 检查点机制 .............................................................................................................

    180

    10.6.2 驱动器程序容错 .....................................................................................................

    181

    10.6.3 工作节点容错 .........................................................................................................

    182

    10.6.4 接收器容错 .............................................................................................................

    182

    10.6.5 处理保证 .................................................................................................................

    183

    10.7 Streaming用户界面 .............................................................................................................

    183

    10.8 性能考量 ...............................................................................................................................

    184

    10.8.1 批次和窗口大小 .....................................................................................................

    184

    10.8.2 并行度 .....................................................................................................................

    184

    10.8.3 垃圾回收和内存使用 .............................................................................................

    185

    10.9 总结 .......................................................................................................................................

    185

    第11 章 基于MLlib 的机器学习 ...............................................................................................

    187

    11.1 概述 .......................................................................................................................................

    187

    11.2 系统要求 ...............................................................................................................................

    188

    11.3 机器学习基础 .......................................................................................................................

    189x | 目录

    11.4 数据类型 ...............................................................................................................................

    192

    11.5 算法 .......................................................................................................................................

    194

    11.5.1 特征提取 .................................................................................................................

    194

    11.5.2 统计 .........................................................................................................................

    196

    11.5.3 分类与回归 .............................................................................................................

    197

    11.5.4 聚类 .........................................................................................................................

    202

    11.5.5 协同过滤与推荐 .....................................................................................................

    203

    11.5.6 降维 .........................................................................................................................

    204

    11.5.7 模型评估 .................................................................................................................

    206

    11.6 一些提示与性能考量 ...........................................................................................................

    206

    11.6.1 准备特征 .................................................................................................................

    206

    11.6.2 配置算法 .................................................................................................................

    207

    11.6.3 缓存RDD以重复使用 ...........................................................................................

    207

    11.6.4 识别稀疏程度 .........................................................................................................

    207

    11.6.5 并行度 .....................................................................................................................

    207

    11.7 流水线API ...........................................................................................................................

    208

    11.8 总结 .......................................................................................................................................

    209

    作者简介 ..............................................................................................................................................

    210

    封面介绍 ..............................................................................................................................................

    210 xi

    推荐序

    近年来大数据逐渐升温,经常有人问起大数据为何重要。我们处在一个数据爆炸的时代,大量涌现的智能手机、平板、可穿戴设备及物联网设备每时每刻都在产生新的数据。当今

    世界,有 90% 的数据是在过去短短两年内产生的。到 2020 年,将有 500 多亿台的互联设

    备产生 Zeta字节级的数据。带来革命性改变的并非海量数据本身,而是我们如何利用这些

    数据。大数据解决方案的强大在于它们可以快速处理大规模、复杂的数据集,可以比传统

    方法更快、更好地生成洞见。

    一套大数据解决方案通常包含多个重要组件,从存储、计算和网络等硬件层,到数据处理

    引擎,再到利用改良的统计和计算算法、数据可视化来获得商业洞见的分析层。这中间,数据处理引擎起到了十分重要的作用。毫不夸张地说,数据处理引擎之于大数据就像 CPU

    之于计算机,或大脑之于人类。

    早在 2009 年,Matei Zaharia 在加州大学伯克利分校的 AMPLab 进行博士研究时创立了

    Spark 大数据处理和计算框架。不同于传统的数据处理框架,Spark 基于内存的基本类型

    (primitive)为一些应用程序带来了 100 倍的性能提升。Spark 允许用户程序将数据加载到

    集群内存中用于反复查询,非常适用于大数据和机器学习,日益成为最广泛采用的大数据

    模块之一。包括Cloudera 和 MapR 在内的大数据发行版也在发布时添加了Spark。

    目前,Spark 正在促使 Hadoop 和大数据生态系统发生演变,以更好地支持端到端的大数

    据分析需求,例如:Spark 已经超越 Spark 核心,发展到了 Spark streaming、SQL、MLlib、GraphX、SparkR 等模块。学习 Spark 和它的各个内部构件不仅有助于改善大数据处理速

    度,还能帮助开发者和数据科学家更轻松地创建分析应用。从企业、医疗、交通到零售

    业,Spark 这样的大数据解决方案正以前所未见的力量推进着商业洞见的形成,带来更多

    更好的洞见以加速决策制定。

    在过去几年中,我的部门有机会与本书的作者合作,向 Apache Spark 社区贡献成果,并在

    英特尔架构上优化各种大数据和 Spark 应用。《Spark 快速大数据分析》的出版为开发者和xii | 推荐序

    数据科学家提供了丰富的 Spark 知识。更重要的是,这本书不是简单地教开发者如何使用

    Spark,而是更深入介绍了 Spark 的内部构成,并通过各种实例展示了如何优化大数据应

    用。我向大家推荐这本书,或更具体点,推荐这本书里提倡的优化方法和思路,相信它们

    能帮助你创建出更好的大数据应用。

    英特尔软件服务事业部全球大数据技术中心总经理 马子雅

    2015 年 7 月于加州圣克拉拉

    Big data is getting hot in recent years. Quite often, folks ask why big data is a big deal. We are

    in the era of data explosion, with the emergence of smart phones, tablets, wearables, IoT devices,etc. Ninety percent of the data in the world today was generated in just the past two years. By

    2020, we will see >50B devices connected and Zeta byte data created. It is not the quantity of

    the data that is revolutionary. It is that we can now do something with it that's revolutionary. The

    power of big data solutions is they can process large and complex data sets very fast, generate

    better and faster insights than conventional methods.

    A big data solution suite can consist of several critical components, from the hardware

    layer like storage, compute and network, to data processing engine, to analytics layer where

    business insights are generated using improved statistical computational algorithms and data

    visualization. Among all, the data processing engine is one most critical player. It is not over-

    stating that the data processing engine for big data is like CPU for a computer or brain for a

    human being.

    Spark was initially started for the purpose of creating a big data processing and computing

    framework, when Matei Zaharia was doing his Ph.D. research at UC Berkeley AMPLab in 2009.

    Different from the traditional data processing framework, Spark's in-memory primitives provide

    performance up to 100 times faster for certain applications. By allowing user programs to load

    data into a cluster's memory and query it repeatedly, Spark is well-suited for big data and machine

    learning use cases. Spark is becoming one best adopted among all big data modules. Big Data

    Distributions like Cloudera, MapR now all include Spark into their distributions.

    Spark is now evolving the Hadoop and big data ecosystem to better support the end-to-end

    big data analytics needs, e.g. Spark grew beyond Spark core to Spark streaming, SQL, MLlib,GraphX, SparkR, etc. Learning Spark and its internals will not just help improve the processing

    speed for big data, but also help developers and data scientists create analytics applications with

    more ease. With big data solutions like Spark, we expect to see signi?cant improvement with 推荐序 | xiii

    business insights which will help expedite the decision making—like we've never seen before,from enterprise, healthcare, transportation, and retail.

    Over the years, my organization had the opportunities to work with authors of this book,contribute to Apache Spark, and optimize various Big Data and Spark application on Intel

    Architecture. The publication of Learning Spark offers developers and data scientists’ extensive

    knowledge on Spark. Moreover, Learning Spark does not simply try to tell the developers how

    to use Spark, it also addresses the internals and shows various examples of how to improve your

    big data applications. I recommend Learning Spark—that this book, and, more speci?cally, the

    method it espouses, will change your big data application for the better.

    Ziya Ma, General Manager of the global Big Data Technologies organization,SSG STO, Intel Corp.

    Santa Clara, California, July 2015xiv

    译者序

    大数据是近几年广受关注的一个概念。今天,互联网不断发展,逐渐深入我们生活的各个

    层面,随之而来的是数据量的指数级增长。很久以前,人类就学会了通过分析数据获取有

    价值的结论。有时,影响结论的因素过多,采样的数据无法有效保留所有因素的影响,得

    出的结论就不够有效。如果不使用采样,而原始数据规模巨大,我们就需要改进数据处理

    的手段。从人工统计到利用一些传统的计算机软件进行分析,再到MapReduce 模型,随着

    数据规模不断增长,我们处理数据的方式也在不断升级。如今,硬件产业的不断发展使得

    内存计算成为了可能,Spark 由此出现,并且像它的名字一样,以星火之势,迅速赢得了

    工业界的青睐。

    《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而

    是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的

    核心概念和基本原理也有较为全面的介绍,让读者能够知其然且知其所以然。

    Spark 只是一个通用计算框架,利用 Spark 实现的应用才是其真正价值所在。我们很欣慰

    地看到,国内的许多知名互联网公司已经利用 Spark 创造出了难以估量的价值。本书的读

    者不妨也尝试把 Spark 应用到实践中,去探寻数据海洋里的无尽瑰宝。

    本书得以完成,离不开各方支持。感谢人民邮电出版社图灵公司的李松峰老师、岳新欣

    老师、张曼老师,他们为本译稿的出版提供了大力支持。感谢本人所在的英特尔亚太研

    发有限公司大数据团队,其中程浩、孙锐、俞育才、张李晔分别负责了本书各部分的审校

    工作,黄洁、邵赛赛、史鸣飞也为本书的翻译工作提供了帮助。感谢 Databricks 的连城学

    长,他促成了我与出版社的合作。在翻译的过程中,来自家人与朋友的理解和支持也让我

    深深感动。

    如本书所述,Spark 是一个大一统的软件栈,涉及方方面面的知识,为本书的翻译增加了

    不少难度。尽管译者一直努力保证翻译的准确性,由于学识有限,难免会有疏忽之处。而

    大数据作为一门新兴学科,许多术语尚未有约定俗成的译法。Spark 也在不断发展中,本译者序 | xv

    书英文稿是根据 Spark 1.2 编纂,而译者也尽量标注了直至 Spark 1.4 为止(翻译时的最新

    版本)引入的一些变化。如果读者发现了本书中的不足或错误之处,恳请批评指正。我的

    电子邮箱是:me@daoyuan.wang。

    王道远

    2015年夏序

    Spark 作为下一代大数据处理引擎,在非常短的时间里崭露头角,并且以燎原之势席卷

    业界。Spark 对曾经引爆大数据产业革命的 Hadoop MapReduce 的改进主要体现在这几个

    方面:首先,Spark 速度更快;其次,Spark 丰富的 API 带来了更强大的易用性;最后,Spark 不单单支持传统批处理应用,更支持交互式查询、流式计算、机器学习、图计算等

    各种应用,满足各种不同应用场景下的需求。

    我很荣幸能够一直密切地参与到 Spark 的开发中,伴随 Spark 一路走来,看着 Spark 从草

    稿纸上的原型成长为当下最活跃的大数据开源项目。如今,Spark 已经成为 Apache 基金会

    下最为活跃的项目之一。不仅如此,我也为结识 Spark 项目创始人 Matei Zaharia 以及其他

    几位 Spark 长期开发者 Patrick Wendell、Andy Konwinski 和 Holden Karau 感到由衷高兴。

    正是他们四位完成了本书的著作工作。

    随着Spark 的迅速流行,相关优秀参考资料匮乏的问题顿时突显出来。本书共有11 章,包

    含许多专为渴望学习 Spark 的数据科学家、学生、开发者们设计的具体实例,大大缓解了

    Spark 缺少优秀参考资料的问题。即使是没有大数据方面背景知识的读者,也可以把本书

    作为入门大数据领域的明智之选。我真挚地希望这本书能引领你和其他读者走进大数据这

    个令人激动的新领域,在多年之后依然令你回味无穷。

    ——Databricks公司首席执行官,加州大学伯克利分校AMPlab联合主任 Ion Stoica

    xvi xvii

    前言

    随着并行数据分析变得越来越流行,各行各业的工作者都迫切需要更好的数据分析工具。

    Spark 应运而生,并且迅速火了起来。作为 MapReduce 的继承者,Spark 主要有三个优点。

    首先,Spark 非常好用。由于高级 API 剥离了对集群本身的关注,你可以专注于你所要做

    的计算本身,只需在自己的笔记本电脑上就可以开发 Spark 应用。其次,Spark 很快,支

    持交互式使用和复杂算法。最后,Spark 是一个通用引擎,可用它来完成各种各样的运算,包括 SQL 查询、文本处理、机器学习等,而在 Spark 出现之前,我们一般需要学习各种各

    样的引擎来分别处理这些需求。这三大优点也使得 Spark 可以作为学习大数据的一个很好

    的起点。

    本书主要介绍 Spark,让读者能够轻松入门并玩转 Spark。你能从本书中学到如何让 Spark

    在你的电脑上运行起来,并且通过交互式操作来学习 Spark 的 API。我们也会讲解一些用

    Spark作数据操作和分布式执行时的细节。最后,本书会带你畅游 Spark上一些高级的程序

    库,包括机器学习、流处理、图计算和 SQL 查询。我们希望本书能够让你了解 Spark。不

    论你只有一台电脑还是有一个庞大的集群,Spark都能成为令你运筹帷幄的数据分析工具。

    读者对象

    本书的目标读者是数据科学家和工程师。我们选择这两个群体的原因,在于他们能够利用

    Spark 去解决一些可能会遇到但是没有办法解决的问题。Spark 提供了功能丰富的数据操

    作库(例如 MLlib) ,可以帮助数据科学家利用他们自己的统计学背景知识,研究数据集

    大小超过单机所能处理极限的数据问题。与此同时,工程师们则可以从本书中学习和利用

    Spark 编写通用的分布式程序并运维这些应用。工程师和数据科学家都不仅能从本书中学

    到各自需要的具体技能,而且还能够在各自领域中利用 Spark 解决大型分布式问题。xviii | 前言

    数据科学家关注如何从数据中发现关联以及建立模型。数据科学家通常有着统计学或者数

    学背景,他们中的大多数也熟悉Python语言、R语言、SQL等传统数据分析工具。在本书

    中,我们不仅会讲到 Spark 中一些机器学习和高级数据分析的程序库,也会把一些 Python

    或者 SQL 的应用作为 Spark 使用示例进行展示。如果你是一位数据科学家,我们希望你读

    完本书之后,能够在获得更快速度和更大数据规模支持的同时,使用早已熟悉的方式来解

    决问题。

    本书的第二类目标读者是软件工程师。对于工程师,不管你擅长的是Java 还是 Python,抑

    或是别的编程语言,我们希望这本书能够教会你如何搭建一个 Spark 集群,如何使用 Spark

    shell,以及如何编写 Spark 应用程序来解决需要并行处理的问题。如果你熟悉 Hadoop,你

    就已经在如何与 HDFS 进行交互以及如何管理集群的领域中领先了一小步。即使你没有

    Hadoop经验也不用担心,我们会在本书中讲解一些基本的分布式执行的概念。

    不论你是数据分析师还是工程师,如果想读透这本书,就应当对 Python、Java、Scala 或者

    一门类似的编程语言有一些基本了解。另外,我们假设你已经有了关于数据存储的解决方

    案,所以不会讲到如何搭建一个数据存储系统,不过我们会介绍如何在常见的数据存储系

    统上读取和保存数据。即使你没用过这些编程语言也不必担心,有很多优秀的学习资源可

    以帮助你理解这些语言,我们在下文的相关书籍中列举了一些。

    本书结构

    本书结构清晰,章节是按照从前到后依次阅读的顺序组织的。在每一章的开头,我们会说

    明本章中的哪些小节对于数据科学家们更重要,而哪些小节则对于工程师们更为有用。话

    虽如此,我们还是希望书中的所有内容对两类读者都能有一定的帮助。

    前两章将会带你入门,让你在自己的电脑上搭好一个基础的 Spark,并且让你对于用 Spark

    能做什么有一个基本的概念。等我们弄明白了 Spark 的目标和 Spark 的安装之后,就会着

    重介绍Spark shell。Spark shell 是开发Spark应用原型时非常有用的工具。后续几章则会详

    细介绍 Spark API、如何将 Spark 应用运行在集群上,以及 Spark 所提供的更高层的程序库

    支持,例如 SQL(数据库支持)和MLlib(机器学习库) 。

    相关书籍

    如果你是一个没有太多 Python 经验的数据科学家,那么我们向你推荐 Learning Python

    (O’Reilly)和 Head First Python(O’Reilly)。如果你已经有了一定的 Python 经验,那么

    Dive Into Python(http:www.diveintopython.net)可以进一步加深你对Python 的理解。

    如果你是个工程师,读完本书之后还希望提高自己的数据分析技能,O’Reilly 出版的

    Machine Learning for Hackers和 Doing Data Science是不错的参考书。前言 | xix

    本书主要为初学者而写,但我们也正在计划为那些渴望全面理解 Spark 内部原理的人写一

    本更加深入的书。

    排版约定

    本书使用了下列排版约定。

    · 楷体

    表示新术语。

    · 等宽字体(Constant width)

    表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语

    句和关键字等。

    · 加粗等宽字体(Constant width bold)

    表示应该由用户输入的命令或其他文本。

    该图标表示提示或建议。

    该图标表示警告或警示。

    使用代码示例

    本书中所有的示例代码都可以在 GitHub 上找到。你可以从 https:github.comdatabricks

    learning-spark中查看和检出这些代码。示例代码包含Java、Scala和 Python 的版本。

    Java版本的示例代码兼容Java 6 以及更高版本。Java 8 引入了支持 lambda的

    新语法,可以更方便地编写内联函数而简化 Spark 代码。由于许多机构还没

    有开始使用 Java 8,我们决定在我们的大多数示例中不使用这一新语法。如

    果你对 Java 8 的语法很感兴趣,可以查阅 Databricks 关于 Java 8 语法的博文

    (http:databricks.comblog20140414spark-with-java-8.html) 。有一些示例程

    序也会移植到Java 8 上,并且发布在本书的GitHub代码仓库中。xx | 前言

    本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程

    序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书

    的几个代码片段写一个程序就无需获得许可,销售或分发 O’Reilly 图书的示例光盘则需要

    获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产

    品文档中则需要获得许可。

    我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和 ISBN。比如:“Web Development with Node and Express by Ethan Brown

    (O’Reilly). Copyright 2014 Ethan Brown, 978-1-491-94930-6.”

    如果你觉得自己对示例代码的用法超出了上述许可的范围,欢迎你通过 permissions@

    oreilly.com与我们联系。

    Safari

    ·

    Books Online

    Safari Books Online(http:www.safaribooksonline.com)是应运

    而生的数字图书馆。它同时以图书和视频的形式出版世界顶级

    技术和商务作家的专业作品。技术专家、软件开发人员、Web

    设计师、商务人士和创意专家等,在开展调研、解决问题、学

    习和认证培训时,都将Safari Books Online视作获取资料的首选渠道。

    对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定

    价策略。用户可通过一个功能完备的数据库检索系统访问 O’Reilly Media、Prentice

    Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit

    Press、Focal Press、Cisco Press、John Wiley Sons、Syngress、Morgan Kaufmann、IBM

    Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正

    式出版之前的书稿。要了解Safari Books Online 的更多信息,我们网上见。

    联系我们

    请把对本书的评价和问题发给出版社。

    美国:

    O’Reilly Media, Inc.

    1005 Gravenstein Highway North

    Sebastopol, CA 95472前言 | xxi

    中国:

    北京市西城区西直门南大街2 号成铭大厦 C座 807 室(100035)

    奥莱利技术咨询(北京)有限公司

    O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示

    例代码以及其他信息。本书的网站地址是:

    http:bit.lyweb_dev_node_express

    对于本书的评论和技术性问题,请发送电子邮件到:bookquestions@oreilly.com。

    要了解更多O’Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:

    http:www.oreilly.com

    我们在Facebook 的地址如下:http:facebook.comoreilly

    请关注我们的 Twitter动态:http:twitter.comoreillymedia

    我们的YouTube 视频地址如下:http:www.youtube.comoreillymedia

    致谢

    感 谢 Joseph Bradley、Dave Bridgeland、Chaz Chandler、Mick Davies、Sam DeHority、Vida

    Ha、Andrew Gal、Michael Gregson、Jan Joeppen、Stephan Jou、Jeff Martinez、Josh

    Mahonin、Andrew Or、Mike Patterson、Josh Rosen、Bruce Szalwinski、Xiangrui Meng、Reza Zadeh等审阅者,他们为本书的写作提出了宝贵的意见。

    特别感谢David Andrzejewski、David Buttler、Juliet Hougland、Marek Kolodziej、Taka Shinagawa、Deborah Siegel、Normen Müller 博士、Ali Ghodsi、Sameer Farooqui 等人,他们为大部分章

    节提供了详细的反馈,并且帮助指出了许多至关重要的改进之处。

    我们还要感谢参与编辑和编写部分章节的主题专家。第 10 章是在我们与 Tathagata Das 的

    紧密合作下共同完成的。Tathagata 给了我们巨大的帮助,他的工作包括且不限于阐明示

    例、回答疑问、改进排版以及相关技术的贡献。Michael Armbrust 帮助我们审校了 Spark

    SQL 相关章节。在第 11 章中,Joseph Bradley 为 MLlib 模块提供了介绍性示例。Reza

    Zadeh 为关于降维的部分提供了图文描述和代码示例。Xiangrui Meng、Joseph Bradley 和

    Reza Zadeh也为MLlib 章节提供了编审和关于技术细节的反馈。1

    第1章

    Spark数据分析导论

    本章会从宏观角度介绍 Spark 到底是什么。如果你已经对 Spark 和相关组件有一定了解,你可以选择直接从第2章开始读。

    1.1 Spark是什么

    Spark是一个用来实现快速而通用的集群计算的平台。

    在速度方面,Spark 扩展了广泛使用的 MapReduce 计算模型,而且高效地支持更多计算模

    式,包括交互式查询和流处理。在处理大规模数据集时,速度是非常重要的。速度快就意

    味着我们可以进行交互式的数据操作,否则我们每次操作就需要等待数分钟甚至数小时。

    Spark 的一个主要特点就是能够在内存中进行计算,因而更快。不过即使是必须在磁盘上

    进行的复杂计算,Spark依然比MapReduce 更加高效。

    总的来说,Spark 适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。通过在一个统一的框架下支持这些不同的计算,Spark

    使我们可以简单而低耗地把各种处理流程整合在一起。而这样的组合,在实际的数据分析

    过程中是很有意义的。不仅如此,Spark 的这种特性还大大减轻了原先需要对各种平台分

    别管理的负担。

    Spark 所提供的接口非常丰富。除了提供基于 Python、Java、Scala 和 SQL 的简单易用的

    API 以及内建的丰富的程序库以外,Spark 还能和其他大数据工具密切配合使用。例如,Spark可以运行在 Hadoop 集群上,访问包括Cassandra 在内的任意Hadoop数据源。2 | 第1章

    1.2 一个大一统的软件栈

    Spark 项目包含多个紧密集成的组件。Spark 的核心是一个对由很多计算任务组成的、运行

    在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。由于

    Spark 的核心引擎有着速度快和通用的特点,因此 Spark 还支持为各种不同应用场景专门

    设计的高级组件,比如 SQL 和机器学习等。这些组件关系密切并且可以相互调用,这样你

    就可以像在平常软件项目中使用程序库那样,组合使用这些的组件。

    各组件间密切结合的设计原理有这样几个优点。首先,软件栈中所有的程序库和高级组件

    都可以从下层的改进中获益。比如,当 Spark 的核心引擎新引入了一个优化时,SQL 和机

    器学习程序库也都能自动获得性能提升。其次,运行整个软件栈的代价变小了。不需要运

    行 5 到 10 套独立的软件系统了,一个机构只需要运行一套软件系统即可。这些代价包括

    系统的部署、维护、测试、支持等。这也意味着 Spark 软件栈中每增加一个新的组件,使

    用 Spark 的机构都能马上试用新加入的组件。这就把原先尝试一种新的数据分析系统所需

    要的下载、部署并学习一个新的软件项目的代价简化成了只需要升级Spark。

    最后,密切结合的原理的一大优点就是,我们能够构建出无缝整合不同处理模型的应用。

    例如,利用 Spark,你可以在一个应用中实现将数据流中的数据使用机器学习算法进行实

    时分类。与此同时,数据分析师也可以通过 SQL 实时查询结果数据,比如将数据与非结

    构化的日志文件进行连接操作。不仅如此,有经验的数据工程师和数据科学家还可以通过

    Python shell 来访问这些数据,进行即时分析。其他人也可以通过独立的批处理应用访问这

    些数据。IT团队始终只需要维护一套系统即可。

    Spark的各个组件如图1-1 所示,下面来依次简要介绍它们。

    MLib

    机器学习

    GraghX

    图计算

    Spark SQL

    结构化数据

    Spark

    Streaming

    实时计算

    独立调度器

    图 1-1:Spark 软件栈

    1.2.1 Spark Core

    Spark Core 实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统Spark数据分析导论 | 3

    交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简

    称 RDD)的 API 定义。RDD 表示分布在多个计算节点上可以并行操作的元素集合,是

    Spark主要的编程抽象。Spark Core提供了创建和操作这些集合的多个 API。

    1.2.2 Spark SQL

    Spark SQL 是 Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL

    或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比

    如 Hive 表、Parquet 以及 JSON 等。除了为 Spark 提供了一个 SQL 接口,Spark SQL 还支

    持开发者将 SQL 和传统的 RDD 编程的数据操作方式相结合,不论是使用 Python、Java 还

    是 Scala,开发者都可以在单个的应用中同时使用 SQL 和复杂的数据分析。通过与 Spark

    所提供的丰富的计算环境进行如此紧密的结合,Spark SQL 得以从其他开源数据仓库工具

    中脱颖而出。Spark SQL是在 Spark 1.0 中被引入的。

    在 Spark SQL 之前,加州大学伯克利分校曾经尝试修改 Apache Hive 以使其运行在 Spark

    上,当时的项目叫作 Shark。现在,由于 Spark SQL 与 Spark 引擎和 API 的结合更紧密,Shark已经被 Spark SQL 所取代。

    1.2.3 Spark Streaming

    Spark Streaming 是 Spark 提供的对实时数据进行流式计算的组件。比如生产环境中的网页

    服务器日志,或是网络服务中用户提交的状态更新组成的消息队列,都是数据流。Spark

    Streaming 提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。这

    样一来,程序员编写应用时的学习门槛就得以降低,不论是操作内存或硬盘中的数据,还

    是操作实时数据流,程序员都更能应对自如。从底层设计来看,Spark Streaming 支持与

    Spark Core同级别的容错性、吞吐量以及可伸缩性。

    1.2.4 MLlib

    Spark 中还包含一个提供常见的机器学习(ML)功能的程序库,叫作 MLlib。MLlib 提供

    了很多种机器学习算法,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据

    导入等额外的支持功能。MLlib 还提供了一些更底层的机器学习原语,包括一个通用的梯

    度下降优化算法。所有这些方法都被设计为可以在集群上轻松伸缩的架构。

    1.2.5 GraphX

    GraphX 是用来操作图(比如社交网络的朋友关系图)的程序库,可以进行并行的图计算。

    与 Spark Streaming 和 Spark SQL 类似,GraphX 也扩展了 Spark 的 RDD API,能用来创建

    一个顶点和边都包含任意属性的有向图。GraphX 还支持针对图的各种操作(比如进行图4 | 第1章

    分割的 subgraph 和操作所有顶点的 mapVertices),以及一些常用图算法(比如 PageRank

    和三角计数)。

    1.2.6 集群管理器

    就底层而言,Spark 设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计

    算。为了实现这样的要求,同时获得最大灵活性,Spark 支持在各种集群管理器(cluster

    manager)上运行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自带的一个简易调度

    器,叫作独立调度器。如果要在没有预装任何集群管理器的机器上安装 Spark,那么 Spark

    自带的独立调度器可以让你轻松入门;而如果已经有了一个装有 Hadoop YARN 或 Mesos

    的集群,通过 Spark 对这些集群管理器的支持,你的应用也同样能运行在这些集群上。第

    7 章会详细探讨这些不同的选项以及如何选择合适的集群管理器。

    1.3 Spark的用户和用途

    Spark 是一个用于集群计算的通用计算框架,因此被用于各种各样的应用程序。在前言中

    我们提到了本书的两大目标读者人群:数据科学家和工程师。仔细分析这两个群体以及他

    们使用 Spark 的方式,我们不难发现这两个群体使用 Spark 的典型用例并不一致,不过我

    们可以把这些用例大致分为两类——数据科学应用和数据处理应用。

    当然,这种领域和使用模式的划分是比较模糊的。很多人也兼有数据科学家和工程师的能

    力,有的时候扮演数据科学家的角色进行研究,然后摇身一变成为工程师,熟练地编写复

    杂的数据处理程序。不管怎样,分开看这两大群体和相应的用例是很有意义的。

    1.3.1 数据科学任务

    数据科学是过去几年里出现的新学科,关注的是数据分析领域。尽管没有标准的定义,但

    我们认为数据科学家(data scientist)就是主要负责分析数据并建模的人。数据科学家有

    可能具备 SQL、统计、预测建模(机器学习)等方面的经验,以及一定的使用 Python、Matlab 或 R 语言进行编程的能力。将数据转换为更方便分析和观察的格式,通常被称为数

    据转换(data wrangling) ,数据科学家也对这一过程中的必要技术有所了解。

    数据科学家使用他们的技能来分析数据,以回答问题或发现一些潜在规律。他们的工作流

    经常会用到即时分析,所以他们可以使用交互式shell替代复杂应用的构建,这样可以在最

    短时间内得到查询语句和一些简单代码的运行结果。Spark 的速度以及简单的 API 都能在

    这种场景里大放光彩,而Spark 内建的程序库的支持也使得很多算法能够即刻使用。

    Spark 通过一系列组件支持各种数据科学任务。Spark shell 通过提供 Python 和 Scala 的接

    口,使我们方便地进行交互式数据分析。Spark SQL 也提供一个独立的 SQL shell,我们可Spark数据分析导论 | 5

    以在这个 shell 中使用 SQL 探索数据,也可以通过标准的 Spark 程序或者 Spark shell 来进

    行 SQL 查询。机器学习和数据分析则通过 MLlib 程序库提供支持。另外,Spark 还能支持

    调用 R 或者 Matlab 写成的外部程序。数据科学家在使用 R 或 Pandas 等传统数据分析工具

    时所能处理的数据集受限于单机,而有了Spark,就能处理更大数据规模的问题。

    在初始的探索阶段之后,数据科学家的工作需要被应用到实际中。具体问题包括扩展应用

    的功能、提高应用的稳定性,并针对生产环境进行配置,使之成为业务应用的一部分。例

    如,在数据科学家完成初始的调研之后,我们可能最终会得到一个生产环境中的推荐系

    统,可以整合在网页应用中,为用户提供产品推荐。一般来说,将数据科学家的工作转化

    为实际生产中的应用的工作是由另外的工程师或者工程师团队完成的,而不是那些数据科

    学家。

    1.3.2 数据处理应用

    Spark 的另一个主要用例是针对工程师的。在这里,我们把工程师定义为使用 Spark 开发

    生产环境中的数据处理应用的软件开发者。这些开发者一般有基本的软件工程概念,比如

    封装、接口设计以及面向对象的编程思想,他们通常有计算机专业的背景,并且能使用工

    程技术来设计和搭建软件系统,以实现业务用例。

    对工程师来说,Spark 为开发用于集群并行执行的程序提供了一条捷径。通过封装,Spark

    不需要开发者关注如何在分布式系统上编程这样的复杂问题,也无需过多关注网络通信和

    程序容错性。Spark 已经为工程师提供了足够的接口来快速实现常见的任务,以及对应用

    进行监视、审查和性能调优。其 API 模块化的特性(基于传递分布式的对象集)使得利用

    程序库进行开发以及本地测试大大简化。

    Spark 用户之所以选择 Spark 来开发他们的数据处理应用,正是因为 Spark 提供了丰富的功

    能,容易学习和使用,并且成熟稳定。

    1.4 Spark简史

    Spark 是由一个强大而活跃的开源社区开发和维护的,社区中的开发者们来自许许多多不

    同的机构。如果你或者你所在的机构是第一次尝试使用 Spark,也许你会对 Spark 这个项

    目的历史感兴趣。Spark 是于 2009 年作为一个研究项目在加州大学伯克利分校 RAD 实验

    室(AMPLab 的前身)诞生。实验室中的一些研究人员曾经用过 Hadoop MapReduce。他

    们发现 MapReduce 在迭代计算和交互计算的任务上表现得效率低下。因此,Spark 从一开

    始就是为交互式查询和迭代算法设计的,同时还支持内存式存储和高效的容错机制。

    2009年,关于Spark的研究论文在学术会议上发表,同年 Spark项目正式诞生。其后不久,相比于 MapReduce,Spark在某些任务上已经获得了10~ 20 倍的性能提升。6 | 第1章

    Spark 最早的一部分用户来自加州伯克利分校的其他研究小组,其中比较著名的有 Mobile

    Millennium。作为机器学习领域的研究项目,他们利用 Spark 来监控并预测旧金山湾区

    的交通拥堵情况。仅仅过了短短的一段时间,许多外部机构也开始使用 Spark。如今,有超过 50 个机构将自己添加到了使用 Spark 的机构列表页面(https:cwiki.apache.org

    con?uencedisplaySPARKPowered+By+Spark)。在 Spark 社区如火如荼的社区活动 Spark

    Meetups(http:www.meetup.comspark-users)和 Spark 峰会(http:spark-summit.org)中,许多机构也向大家积极分享他们特有的 Spark 应用场景。除了加州大学伯克利分校,对

    Spark作出贡献的主要机构还有 Databricks、雅虎以及英特尔。

    2011 年,AMPLab 开始基于 Spark 开发更高层的组件,比如 Shark(Spark 上的 Hive)1

    和

    Spark Streaming。这些组件和其他一些组件一起被称为伯克利数据分析工具栈(BDAS,https:amplab.cs.berkeley.edusoftware)。

    Spark 最早在 2010 年 3 月开源,并且在 2013 年 6 月交给了 Apache 基金会,现在已经成了

    Apache开源基金会的顶级项目。

    1.5 Spark的版本和发布

    自其出现以来,Spark 就一直是一个非常活跃的项目,Spark 社区也一直保持着非常繁荣的

    态势。随着版本号的不断更迭,Spark 的贡献者也与日俱增。Spark 1.0 吸引了 100 多个开

    源程序员参与开发。尽管项目活跃度在飞速地提升,Spark 社区依然保持着常规的发布新

    版本的节奏。2014 年 5 月,Spark 1.0 正式发布,而本书则主要关注 Spark 1.1.0 以及后续

    的版本。不过,大多数概念在老版本的 Spark 中依然适用,而大多数示例也能运行在老版

    本的 Spark 上。

    1.6 Spark的存储层次

    Spark 不仅可以将任何 Hadoop 分布式文件系统(HDFS)上的文件读取为分布式数据集,也可以支持其他支持 Hadoop 接口的系统,比如本地文件、亚马逊 S3、Cassandra、Hive、HBase 等。我们需要弄清楚的是,Hadoop 并非 Spark 的必要条件,Spark 支持任何实现

    了 Hadoop 接口的存储系统。Spark 支持的 Hadoop 输入格式包括文本文件、SequenceFile、Avro、Parquet等。我们会在第5章讨论读取和存储时详细介绍如何与这些数据源进行交互。

    注1:Shark已经被Spark SQL所取代。7

    第2章

    Spark下载与入门

    在本章中,我们会下载 Spark 并在本地模式下单机运行它。本章是写给 Spark 的所有初学

    者的,对数据科学家和工程师来说都值得一读。

    Spark可以通过 Python、 Java 或Scala 来使用1。要用好本书不需要高超的编程技巧,但是确

    实需要对其中某种语言的语法有基本的了解。我们会尽可能在示例中给出全部三种语言的

    代码。

    Spark 本身是用 Scala 写的,运行在 Java 虚拟机(JVM)上。要在你的电脑或集群上运行

    Spark,你要做的准备工作只是安装 Java 6 或者更新的版本。如果你希望使用 Python 接口,你还需要一个Python解释器(2.6 以上版本) 。Spark 尚不支持 Python 32。

    2.1 下载Spark

    使用 Spark 的第一步是下载和解压缩。我们先从下载预编译版本的 Spark 开始。访问 http:

    spark.apache.orgdownloads.html,选择包类型为“Pre-built for Hadoop 2.4 and later”(为

    Hadoop 2.4及更新版本预编译的版本) ,然后选择“Direct Download”直接下载。这样我们

    就可以得到一个压缩的TAR文件,文件名为 spark-1.2.0-bin-hadoop2.4.tgz.

    注1:Spark 1.4.0起添加了R语言支持。

    注2:Spark 1.4.0起支持Python 3。——译者注8 | 第2章

    Windows 用户如果把 Spark 安装到带有空格的路径下,可能会遇到一些问

    题。所以我们需要把 Spark 安装到不带空格的路径下,比如 C:\spark 这样的

    目录中。

    你不需要安装 Hadoop,不过如果你已经有了一个 Hadoop 集群或安装好的 HDFS,请下

    载对应版本的 Spark。你可以在 http:spark.apache.orgdownloads.html 里选择所需要的包

    类型,这会导致下载得到的文件名略有不同。也可以选择从源代码直接编译。你可以从

    GitHub 上下载最新代码,也可以在下载页面上选择包类型为“Source Code”(源代码)进

    行下载。

    大多数类 Unix 系统,包括 OSX 和 Linux,都有一个叫 tar 的命令行工具,可以用来解压 TAR 文件。如果你的操作系统没有安装 tar,可以尝试搜索网

    络获取免费的 TAR 解压缩工具。比如,如果你使用的是 Windows,可以试

    一下7-Zip.

    下载好了 Spark 之后,我们要进行解压缩,然后看一看默认的 Spark 发行版中都有些什么。

    打开终端,将工作路径转到下载的 Spark 压缩包所在的目录,然后解开压缩包。这样会创

    建出一个和压缩包同名但是没了 .tgz 后缀的新文件夹。接下来我们就把工作路径转到这个

    新目录下看看里面都有些什么。上面这些步骤可以用如下命令完成:

    cd ~

    tar -xf spark-1.2.0-bin-hadoop2.4.tgz

    cd spark-1.2.0-bin-hadoop2.4

    ls

    在 tar 命令所在的那一行中,x 标记指定tar 命令执行解压缩操作,f 标记则指定压缩包的

    文件名。ls 命令列出了 Spark 目录中的内容。我们先来粗略地看一看 Spark 目录中的一些

    比较重要的文件及目录的名字和作用。

    · README.md

    包含用来入门Spark的简单的使用说明。

    · bin

    包含可以用来和 Spark 进行各种方式的交互的一系列可执行文件,比如本章稍后会讲到

    的 Spark shell。

    · core、streaming、python……

    · 包含Spark项目主要组件的源代码。

    · examples

    包含一些可以查看和运行的Spark程序,对学习Spark 的 API 非常有帮助。Spark下载与入门 | 9

    不要被 Spark 项目数量庞大的文件和复杂的目录结构吓倒,我们会在本书接下来的部分中

    讲解它们中的很大一部分。就目前来说,我们还是按部就班,先来试试 Spark 的 Python 和

    Scala版本的shell。让我们从运行一些Spark自带的示例代码开始,然后再编写、编译并运

    行一个我们自己简易的 Spark 程序。

    本章我们所做的一切,Spark 都是在本地模式下运行,也就是非分布式模式,这样我们

    只需要用到一台机器。Spark 可以运行在许多种模式下,除了本地模式,还支持运行在

    Mesos 或 YARN 上,也可以运行在 Spark 发行版自带的独立调度器上。我们会在第 7 章详

    细讲述各种部署模式。

    2.2 Spark中Python和Scala的shell

    Spark 带有交互式的 shell,可以作即时数据分析。如果你使用过类似 R、Python、Scala 所

    提供的 shell,或操作系统的 shell(例如 Bash 或者 Windows 中的命令提示符),你也会对

    Spark shell 感到很熟悉。然而和其他 shell 工具不一样的是,在其他 shell 工具中你只能使

    用单机的硬盘和内存来操作数据,而 Spark shell 可用来与分布式存储在许多机器的内存或

    者硬盘上的数据进行交互,并且处理过程的分发由Spark自动控制完成。

    由于 Spark 能够在工作节点上把数据读取到内存中,所以许多分布式计算都可以在几秒钟

    之内完成,哪怕是那种在十几个节点上处理 TB 级别的数据的计算。这就使得一般需要在

    shell 中完成的那些交互式的即时探索性分析变得非常适合 Spark。Spark 提供 Python 以及

    Scala的增强版shell,支持与集群的连接。

    本书中大多数示例代码都包含 Spark 支持的所有语言版本,但是交互式 shell

    部分只提供了 Python 和 Scala 版本的示例。shell 对于学习 API 是非常有帮助

    的,因此我们建议读者在 Python 和 Scala 版本的例子中选择一种进行尝试,即便你是Java 开发者也是如此,毕竟各种语言的API是相似的。

    展示 Spark shell 的强大之处最简单的方法就是使用某个语言的 shell 作一些简单的数据分

    析。我们一起按照 Spark 官方文档中的快速入门指南(http:spark.apache.orgdocslatest

    quick-start.html)中的示例来做一遍。

    第一步是打开 Spark shell。要打开 Python 版本的 Spark shell,也就是我们所说的 PySpark

    Shell,进入你的Spark目录然后输入:

    binpyspark

    (在Windows中则运行 bin\pyspark。)如果要打开Scala 版本的 shell,输入:

    binspark-shell10 | 第2 章

    稍等数秒,shell 提示符就会出现。Shell 启动时,你会看到许多日志信息输出。有的时候,由于提示符之后又输出了日志,我们需要按一下回车键,来得到一个清楚的 shell 提示符。

    图2-1是 PySpark shell 启动时的样子。

    图 2-1:默认日志选项下的 PySpark shell

    如果觉得 shell 中输出的日志信息过多而使人分心,可以调整日志的级别来控制输出的信

    息量。你需要在 conf 目录下创建一个名为 log4j.properties 的文件来管理日志设置。Spark

    开发者们已经在 Spark 中加入了一个日志设置文件的模版,叫作 log4j.properties.template。

    要让日志看起来不那么啰嗦,可以先把这个日志设置模版文件复制一份到 conflog4j.

    properties 来作为日志设置文件,接下来找到下面这一行:

    log4j.rootCategory=INFO, console

    然后通过下面的设定降低日志级别,只显示警告及更严重的信息:

    log4j.rootCategory=WARN, console

    这时再打开 shell,你就会看到输出大大减少(图2-2)。Spark下载与入门 | 11

    图 2-2:降低日志级别后的PySpark shell

    使用IPython

    IPython 是一个受许多 Python 使用者喜爱的增强版 Python shell,能够提供自

    动补全等好用的功能。你可以在 http:ipython.org 上找到安装说明。只要把

    环境变量IPYTHON 的值设为1,你就可以使用IPython 了:

    IPYTHON=1 .binpyspark

    要使用IPython Notebook,也就是Web 版的 IPython,可以运行:

    IPYTHON_OPTS=notebook .binpyspark

    在Windows上,像下面这样设置环境变量并运行命令行:

    set IPYTHON=1

    bin\pyspark

    在 Spark 中,我们通过对分布式数据集的操作来表达我们的计算意图,这些计算会自动地

    在集群上并行进行。这样的数据集被称为弹性分布式数据集(resilient distributed dataset),简称RDD。RDD是 Spark 对分布式数据和计算的基本抽象。

    在我们更详细地讨论 RDD 之前,先来使用 shell 从本地文本文件创建一个 RDD 来作一些

    简单的即时统计。例2-1是Python版的例子,例 2-2 是Scala 版的。12 | 第2 章

    例 2-1:Python行数统计

    >>> lines = sc.textFile(README.md) 创建一个名为lines的RDD

    >>> lines.count 统计RDD中的元素个数

    127

    >>> lines.first 这个RDD中的第一个元素,也就是README.md的第一行

    u' Apache Spark'

    例 2-2:Scala行数统计

    scala> val lines = sc.textFile(README.md) 创建一个名为lines的RDD

    lines: spark.RDD[String] = MappedRDD[...]

    scala> lines.count 统计RDD中的元素个数

    res0: Long = 127

    scala> lines.first 这个RDD中的第一个元素,也就是README.md的第一行

    res1: String = Apache Spark

    要退出任一 shell,按 Ctrl-D。

    你可能在日志的输出中注意到了这样一行信息:INFO SparkUI: Started

    SparkUI at http:[ipaddress]:4040。你可以由这个地址访问Spark 用户界

    面,查看关于任务和集群的各种信息。我们会在第7章中详细讨论。

    在例 2-1 和例 2-2 中,变量 lines 是一个 RDD,是从你电脑上的一个本地的文本文件创建

    出来的。我们可以在这个 RDD 上运行各种并行操作,比如统计这个数据集中的元素个数

    (在这里就是文本的行数),或者是输出第一个元素。我们会在后续章节中深入探讨 RDD。

    在此之前,让我们先花些时间来了解Spark 的基本概念。

    2.3 Spark核心概念简介

    现在你已经用shell运行了你的第一段Spark程序,是时候对Spark编程作更细致的了解了。

    从上层来看,每个 Spark 应用都由一个驱动器程序(driver program)来发起集群上的各种

    并行操作。驱动器程序包含应用的 main 函数,并且定义了集群上的分布式数据集,还对这

    些分布式数据集应用了相关操作。在前面的例子里,实际的驱动器程序就是 Spark shell 本

    身,你只需要输入想要运行的操作就可以了。

    驱动器程序通过一个 SparkContext 对象来访问 Spark。这个对象代表对计算集群的一个连

    接。shell 启动时已经自动创建了一个 SparkContext 对象,是一个叫作 sc 的变量。我们可

    以通过例2-3 中的方法尝试输出sc 来查看它的类型。Spark下载与入门 | 13

    例 2-3:查看变量 sc

    >>> sc

    

    一旦有了 SparkContext,你就可以用它来创建 RDD。在例 2-1 和例 2-2 中,我们调用了

    sc.textFile 来创建一个代表文件中各行文本的 RDD。我们可以在这些行上进行各种操

    作,比如count。

    要执行这些操作,驱动器程序一般要管理多个执行器(executor)节点。比如,如果我们在

    集群上运行count 操作,那么不同的节点会统计文件的不同部分的行数。由于我们刚才是

    在本地模式下运行Spark shell,因此所有的工作会在单个节点上执行,但你可以将这个shell

    连接到集群上来进行并行的数据分析。图2-3展示了Spark如何在一个集群上运行。

    驱动器程序

    工作节点

    工作节点

    执行器

    执行器

    任务

    任务 任务

    任务

    图 2-3:Spark 分布式执行涉及的组件

    最后,我们有很多用来传递函数的 API,可以将对应操作运行在集群上。比如,可以扩展

    我们的 README 示例,筛选出文件中包含某个特定单词的行。以“Python”这个单词为

    例,具体代码如例2-4(Python版本)和例2-5(Scala 版本)所示。

    例2-4:Python版本筛选的例子

    >>> lines = sc.textFile(README.md)

    >>> pythonLines = lines.filter(lambda line: Python in line)

    >>> pythonLines.first

    u' Interactive Python Shell'

    例 2-5:Scala 版本筛选的例子

    scala> val lines = sc.textFile(README.md) 创建一个叫lines的RDD

    lines: spark.RDD[String] = MappedRDD[...]

    scala> val pythonLines = lines.filter(line => line.contains(Python)) 14 | 第2 章

    pythonLines: spark.RDD[String] = FilteredRDD[...]

    scala> pythonLines.first

    res0: String = Interactive Python Shell

    向 Spark传递函数

    如果你对例 2-4 和例 2-5 中的 lambda 或者 => 语法不熟悉,可以把它们理解为 Python

    和 Scala中定义内联函数的简写方法。当你在这些语言中使用 Spark 时,你也可以单独

    定义一个函数,然后把函数名传给Spark。比如,在Python中可以这样做:

    def hasPython(line):

    return Python in line

    pythonLines = lines.filter(hasPython)

    在 Java 中向 Spark 传递函数也是可行的,但是在这种情况下,我们必须把函数定义为

    实现了 Function 接口的类。例如:

    JavaRDD pythonLines = lines.filter(

    new Function {

    Boolean call(String line) { return line.contains(Python); }

    });

    Java 8 提供了类似 Python 和 Scala 的 lambda 简写语法。下面就是一个使用这种语法的

    代码的例子:

    JavaRDD pythonLines = lines.filter(line -> line.contains(Python));

    我们会在 3.4节更深入地讨论如何向 Spark 传递函数。

    尽管后面会更详细地讲述Spark API,我们还是不得不感叹,其实 Spark API最神奇的地方

    就在于像 filter 这样基于函数的操作也会在集群上并行执行。也就是说,Spark 会自动将

    函数(比如 line.contains(Python))发到各个执行器节点上。这样,你就可以在单一的

    驱动器程序中编程,并且让代码自动运行在多个节点上。第3 章会详细讲述 RDD API。

    2.4 独立应用

    我们的 Spark 概览中的最后一部分就是如何在独立程序中使用 Spark。除了交互式运行之

    外,Spark 也可以在 Java、Scala 或 Python 的独立程序中被连接使用。这与在 shell 中使用

    的主要区别在于你需要自行初始化SparkContext。接下来,使用的API 就一样了。

    连接 Spark 的过程在各语言中并不一样。在 Java 和 Scala 中,只需要给你的应用添加一

    个对于 spark-core 工件的 Maven 依赖。编写此书时,Spark 的最新版本是 1.2.0,对应的

    Maven索引是:Spark下载与入门 | 15

    groupId = org.apache.spark

    artifactId = spark-core_2.10

    version = 1.2.0

    Maven 是一个流行的包管理工具,可以用于任何基于 Java 的语言,让你可以连接公共仓库

    中的程序库。可以使用 Maven 来构建你的工程,也可以使用其他能够访问 Maven 仓库的

    工具来进行构建,包括 Scala 的 sbt 工具或者 Gradle 工具。一些常用的集成开发环境(比

    如Eclipse)也可以让你直接把Maven 依赖添加到工程中。

    在 Python 中,你可以把应用写成 Python 脚本,但是需要使用 Spark 自带的 binspark-

    submit 脚本来运行。spark-submit 脚本会帮我们引入 Python 程序的 Spark 依赖。这个脚本

    为Spark 的 PythonAPI配置好了运行环境。你只需要像例2-6 所示的那样运行脚本即可。

    例2-6:运行Python 脚本

    binspark-submit my_script.py

    (注意,在Windows上需要使用反斜杠来代替斜杠。)

    2.4.1 初始化SparkContext

    一旦完成了应用与 Spark 的连接,接下来就需要在你的程序中导入 Spark 包并且创建

    SparkContext。你可以通过先创建一个 SparkConf 对象来配置你的应用,然后基于这个

    SparkConf 创建一个 SparkContext 对象。在例 2-7 至例 2-9 中,我们用各种语言分别示范了

    这一过程。

    例2-7:在 Python中初始化Spark

    from pyspark import SparkConf, SparkContext

    conf = SparkConf.setMaster(local).setAppName(My App)

    sc = SparkContext(conf = conf)

    例 2-8:在 Scala 中初始化 Spark

    import org.apache.spark.SparkConf

    import org.apache.spark.SparkContext

    import org.apache.spark.SparkContext._

    val conf = new SparkConf.setMaster(local).setAppName(My App)

    val sc = new SparkContext(conf)

    例 2-9:在 Java中初始化 Spark

    import org.apache.spark.SparkConf;

    import org.apache.spark.api.java.JavaSparkContext;

    SparkConf conf = new SparkConf.setMaster(local).setAppName(My App);

    JavaSparkContext sc = new JavaSparkContext(conf);16 | 第2 章

    这些例子展示了创建SparkContext 的最基本的方法,你只需传递两个参数:

    · 集群 URL:告诉 Spark 如何连接到集群上。在这几个例子中我们使用的是 local,这个

    特殊值可以让Spark 运行在单机单线程上而无需连接到集群。

    · 应用名:在例子中我们使用的是 My App。当连接到一个集群时,这个值可以帮助你在

    集群管理器的用户界面中找到你的应用。

    还有很多附加参数可以用来配置应用的运行方式或添加要发送到集群上的代码。我们会在

    本书的后续章节中介绍。

    在初始化 SparkContext 之后,你可以使用我们前面展示的所有方法(比如利用文本文件)

    来创建 RDD并操控它们。

    最后,关闭 Spark 可以调用 SparkContext 的 stop 方法,或者直接退出应用(比如通过

    System.exit(0) 或者 sys.exit)。

    这个快速概览应该已经足够让你在电脑上运行一个独立的 Spark 应用了。如果要了解更高

    级的配置选项,第 7 章会讲到如何让你的应用连接到一个集群上,包括将你的应用打包,使得代码可以自动发送到工作节点上。就目前而言,参考 Spark 官方文档的快速入门指南

    (http:spark.apache.orgdocslatestquick-start.html)就足够了。

    2.4.2 构建独立应用

    作为一本讲大数据的书,如果没有一个单词数统计的例子,就不能成其为完整的一章。在

    单机上实现单词数统计很容易,但在分布式框架下,由于要在许多工作节点上读入并组合

    数据,单词数统计就成了一个很常用的例子。下面我们来学习用 sbt 以及 Maven 来构建并

    打包一个简单的单词数统计的例程。我们可以把所有的例程构建在一起,但是为了展示最

    简单的构建过程,我们只保留了最基本的依赖。在 learning-spark-examplesmini-complete-

    example 目录下,你可以找到这样一个独立的小工程。Java 版本(例 2-10)和 Scala 版本

    (例 2-11)的例子分别如下所示。

    例2-10:Java版本的单词数统计应用(暂时不需要深究细节)

    创建一个Java版本的Spark Context

    SparkConf conf = new SparkConf.setAppName(wordCount);

    JavaSparkContext sc = new JavaSparkContext(conf);

    读取我们的输入数据

    JavaRDD input = sc.textFile(inputFile);

    切分为单词

    JavaRDD words = input.flatMap(

    new FlatMapFunction {

    public Iterable call(String x) {

    return Arrays.asList(x.split( ));

    }}); Spark下载与入门 | 17

    转换为键值对并计数

    JavaPairRDD counts = words.mapToPair(

    new PairFunction{

    public Tuple2 call(String x){

    return new Tuple2(x, 1);

    }}).reduceByKey(new Function2{

    public Integer call(Integer x, Integer y){ return x + y;}});

    将统计出来的单词总数存入一个文本文件,引发求值

    counts.saveAsTextFile(outputFile);

    例 2-11:Scala版本的单词数统计应用(暂时不需要深究细节)

    创建一个Scala版本的Spark Context

    val conf = new SparkConf.setAppName(wordCount)

    val sc = new SparkContext(conf)

    读取我们的输入数据

    val input = sc.textFile(inputFile)

    把它切分成一个个单词

    val words = input.flatMap(line => line.split( ))

    转换为键值对并计数

    val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}

    将统计出来的单词总数存入一个文本文件,引发求值

    counts.saveAsTextFile(outputFile)

    我们可以使用非常简单的 sbt(例 2-12)或 Maven(例 2-13)构建文件来构建这些应用。

    由于 Spark Core 包已经在各个工作节点的classpath 中了,所以我们把对Spark Core的依赖

    标记为 provided,这样当我们稍后使用 assembly 方式打包应用时,就不会把 spark-core

    包也打包到assembly包中。

    例2-12:sbt 构建文件

    name := learning-spark-mini-example

    version := 0.0.1

    scalaVersion := 2.10.4

    附加程序库

    libraryDependencies ++= Seq(

    org.apache.spark %% spark-core % 1.2.0 % provided)

    例 2-13:Maven 构建文件

    

    com.oreilly.learningsparkexamples.mini

    learning-spark-mini-example

    4.0.0

    example

    jar

    0.0.1

    

    

    org.apache.spark 18 | 第2 章

    spark-core_2.10

    1.2.0

    provided

    

    1.6

    

    

    

     org.apache.maven.plugins

    maven-compiler-plugin

    3.1

    

    {java.version}{java.version}

    spark-core 包被标记为了 provided,这是为了控制我们以 assembly 方式打包

    应用时的行为。第7章中会详细讨论这个细节。

    一旦敲定了构建方式,我们就可以轻松打包并且使用 binspark-submit 脚本执行我们的

    应用了。spark-submit 脚本可以为我们配置 Spark 所要用到的一系列环境变量。在 mini-

    complete-example目录中,我们可以使用Scala(例 2-14)或者 Java(例 2-15)进行构建。

    例 2-14:Scala构建与运行

    sbt clean package

    SPARK_HOMEbinspark-submit \--class com.oreilly.learningsparkexamples.mini.scala.WordCount .target... (as above) .README.md .wordcounts

    例 2-15:Maven构建与运行

    mvn clean mvn compile mvn package

    SPARK_HOMEbinspark-submit \--class com.oreilly.learningsparkexamples.mini.java.WordCount .targetlearning-spark-mini-example-0.0.1.jar .README.md .wordcounts

    要了解关于连接应用程序到 Spark 的更多例子,请参考 Spark 官方文档中的快速入门指南

    (http:spark.apache.orgdocslatestquick-start.html)一节。第 7 章中也会更详细地讲解如何

    打包 Spark 应用。Spark下载与入门 | 19

    2.5 总结

    在本章中,我们讲到了下载并在单机的本地模式下运行Spark,以及 Spark 的使用方式,包

    括交互式方式和通过一个独立应用进行调用。另外我们还简单介绍了 Spark 编程的核心概

    念:通过一个驱动器程序创建一个SparkContext 和一系列RDD,然后进行并行操作。在下

    一章中,我们将会更加深入地介绍如何操作 RDD。21

    第3章

    RDD编程

    本章介绍Spark对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简

    称 RDD) 。RDD 其实就是分布式的元素集合。在 Spark 中,对数据的所有操作不外乎创

    建 RDD、转化已有 RDD 以及调用 RDD 操作进行求值。而在这一切背后,Spark 会自动将

    RDD中的数据分发到集群上,并将操作并行化执行。

    由于 RDD 是 Spark 的核心概念,因此数据科学家和工程师都应该读一读本章。我们强烈

    建议读者在交互式 shell(参见 2.2 节)中亲身尝试一些示例。此外,本章中的示例代码都

    可以在本书的GitHub 仓库(https:github.comdatabrickslearning-spark)中找到。

    3.1 RDD基础

    Spark 中的 RDD 就是一个不可变的分布式对象集合。每个 RDD 都被分为多个分区,这些

    分区运行在集群中的不同节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。

    用户可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程

    序中的对象集合(比如 list 和 set)。我们在本书前面的章节中已经见过使用 SparkContext.

    textFile 来读取文本文件作为一个字符串 RDD的示例,如例3-1 所示。

    例3-1:在Python 中使用textFile ......

您现在查看是摘要介绍页, 详见PDF附件(16253KB,231页)