试读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 1/16 印张:14.513 字数:343千字 2015年 9 月第 1 版 印数:1 — 3 500册 2015年 9 月北京第 1次印刷 著作权合同登记号 图字:01-2015-3678号 ◆ ◆ ◆ iii 版权声明 © 2015 by O’Reilly Media, Inc. Simplified Chinese Edition, jointly published by O’Reilly M edia, 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 M edia 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。 自 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 是位特立独行的商人,他不光放眼于最长远、最广阔的视野,并且切实地按照 Yo gi 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...................................................................................................................................7 vi | 目录 2.2 Spark 中 Python 和 Scala 的 shell . .............................................................................................9 2.3 S park 核心概念简介.................................................................................................................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 P air RDD 的转化操作 . .............................................................................................................42 4.3.1 聚合操作 . .....................................................................................................................45 4.3.2 数据分组 . .....................................................................................................................49 4.3.3 连接 . .............................................................................................................................50 4.3.4 数据排序 . .....................................................................................................................51 4.4 P air 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 S park 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 S park 运行时架构...................................................................................................................101 7.2.1 驱动器节点 . ...............................................................................................................102 viii | 目录 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 S park 应用内与应用间调度...................................................................................................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 S park 执行的组成部分:作业、任务和步骤.......................................................................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 J DBC/ODBC 服务器 . .............................................................................................................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 S park 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 2 4/7 不间断运行 . ..................................................................................................................180 10.6.1 检查点机制 . ............................................................................................................180 10.6.2 驱动器程序容错 . ....................................................................................................181 10.6.3 工作节点容错 . ........................................................................................................182 10.6.4 接收器容错 . ............................................................................................................182 10.6.5 处理保证 . ................................................................................................................183 10.7 S treaming 用户界面 . ............................................................................................................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 机器学习基础 . ......................................................................................................................189 x | 目录 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、S parkR 等模块。学习 Spark 和它的各个内部构件不仅有助于改善大数据处理速 度,还能帮助开发者和数据科学家更轻松地创建分析应用。从企业、医疗、交通到零售 业,Spark 这样的大数据解决方案正以前所未见的力量推进着商业洞见的形成,带来更多 更好的洞见以加速决策制定。 在过去几年中,我的部门有机会与本书的作者合作,向 Apache Spark 社区贡献成果,并在 英特尔架构上优化各种大数据和 Spark 应用。《Spark 快速大数据分析》的出版为开发者和 xii | 推荐序 数据科学家提供了丰富的 Spark 知识。更重要的是,这本书不是简单地教开发者如何使用 Spark,而是更深入介绍了 Spark 的内部构成,并通过各种实例展示了如何优化大数据应 用。我向大家推荐这本书,或更具体点,推荐这本书里提倡的优化方法和思路,相信它们 能帮助你创建出更好的大数据应用。 英特尔软件服务事业部全球大数据技术中心总经理 马子雅 2015 年 7 月于加州圣克拉拉 Big d ata is getting hot in recent years. Quite often, folks ask why big data is a big deal. We are in t he era of data explosion, with the emergence of smart phones, tablets, wearables, IoT devices, etc. N inety percent of the data in the world today was generated in just the past two years. By 2020, w e will see >50B devices connected and Zeta byte data created. It is not the quantity of the d ata that is revolutionary. It is that we can now do something with it that's revolutionary. The power o f 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 i nsights 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 f rom 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 i nto a cluster's memory and query it repeatedly, Spark is well-suited for big data and machine learning u se 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, S parkR, etc. Learning Spark and its internals will not just help improve the processing speed f or big data, but also help developers and data scientists create analytics applications with more e ase. With big data solutions like Spark, we expect to see significant 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 u se Spark, it also addresses the internals and shows various examples of how to improve your big d ata applications. I recommend Learning Spark—that this book, and, more specifically, 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 2015 xiv 译者序 大数据是近几年广受关注的一个概念。今天,互联网不断发展,逐渐深入我们生活的各个 层面 ,随之而来的是数据量的指数级增长。很久以前,人类就学会了通过分析数据获取有 价值的结论。有时,影响结论的因素过多,采样的数据无法有效保留所有因素的影响,得 出的结论就不够有效。如果不使用采样,而原始数据规模巨大,我们就需要改进数据处理 的手段 。从人工统计到利用一些传统的计算机软件进行分析,再到 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.com/databricks/ learning-spark 中查看和检出这些代码。示例代码包含 Java、Scala 和 Python 的版本。 Java 版本的示例代码兼容 Java 6 以及更高版本。Java 8 引入了支持 lambda 的 新语法 ,可以更方便地编写内联函数而简化 Spark 代码。由于许多机构还没 有开始使用 Java 8,我们决定在我们的大多数示例中不使用这一新语法。如 果你对 Java 8 的语法很感兴趣,可以查阅 Databricks 关于 Java 8 语法的博文 (http://databricks.com/blog/2014/04/14/spark-with-java-8.html)。有一些示例程 序也会移植到 Java 8 上,并且发布在本书的 GitHub 代码仓库中。 xx | 前言 本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程 序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书 的几个代码片段写一个程序就无需获得许可,销售或分发 O’Reilly 图书的示例光盘则需要 获得许可 ;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产 品文档中则需要获得许可。 我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、 作者 、出版社和 ISBN。比如:“Web Development with Node and Express b y 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 M edia、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.ly/web_dev_node_express 对于本书的评论和技术性问题,请发送电子邮件到:bookquestions@oreilly.com。 要了解更多 O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站: http://www.oreilly.com 我们在 Facebook 的地址如下:http://facebook.com/oreilly 请关注我们的 Twitter 动态:http://twitter.com/oreillymedia 我们的 YouTube 视频地址如下:http://www.youtube.com/oreillymedia 致谢 感 谢 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 S iegel、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 s hell 来访问这些数据,进行即时分析。其他人也可以通过独立的批处理应用访问这 些数据。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/ confluence/display/SPARK/Powered+By+Spark)。在 Spark 社区如火如荼的社区活动 Spark Meetups(h ttp://www.meetup.com/spark-users/)和 Spark 峰会(http://spark-summit.org/)中, 许多机构也向大家积极分享他们特有的 Spark 应用场景。除了加州大学伯克利分校,对 Spark 作出贡献的主要机构还有 Databricks、雅虎以及英特尔。 2011 年,AMPLab 开始基于 Spark 开发更高层的组件,比如 Shark(Spark 上的 Hive)1 和 Spark S treaming。这些组件和其他一些组件一起被称为伯克利数据分析工具栈(BDAS, https://amplab.cs.berkeley.edu/software/)。 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 所取代。
还剩27页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

bger

贡献于2015-10-29

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf