书名:Spark Cookbook 中文版
ISBN:978-7-115-42966-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
• 著 [印度] Rishi Yadav
译 顾星竹 刘见康
责任编辑 胡俊英
• 人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
• 读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright ©2015 Packt Publishing. First published in the English language under the title Spark Cookbook.
All rights reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
Spark是一个基于内存计算的开源集群计算系统,它非常小巧玲珑,让数据分析更加快速,已逐渐成为新一代大数据处理平台中的佼佼者。
本书内容分为12章,从认识Apache Spark开始讲解,陆续介绍了Spark的使用、外部数据源、Spark SQL、Spark Streaming、机器学习、监督学习中的回归和分类、无监督学习、推荐系统、图像处理、优化及调优等内容。
本书适合大数据领域的技术人员,可以帮助他们更好地洞悉大数据,本书也适合想要学习Spark进行大数据处理的人员,它将是一本绝佳的参考教程。
顾星竹,南京大学软件学院软件工程硕士,曾就职于eBay(上海)中国研发中心,现就职于上海平安陆金所,从事大数据开发工作,有丰富的Hadoop开发和优化经验,主攻数据挖掘和机器学习,擅长使用MR、Hive、Impala和Spark等。业余爱好瑜伽、烹饪、写作和翻译。从读研期间开始从事计算机领域的翻译,主攻大数据领域和数据挖掘领域。非常荣幸能有机会翻译本书,也希望大家喜欢本书。
刘见康,南京大学软件学院软件工程学士。曾就职于eBay(上海)中国研发中心,在数据基础架构平台从事软件开发工作,目前在一家创业公司从事数据挖掘相关的工作。
他爱好广泛,热爱编程,钟爱开源,喜欢研究大数据相关的开源框架,并且对数据、算法、函数式编程、机器学习、软件架构等有一定的探索和学习。目前专注于大数据领域的开发工作,主要使用Java、Scala、Python等语言,平时还喜欢研究Clojure、Haskell、Go语言,认为不同编程范式能带来不同的编程思想和抽象思维。业余爱好篮球、羽毛球和弹吉他,是名副其实的“书虫”,也是Kindle的重度使用者,Coursera和edX蹭课爱好者。
Rishi Yadav拥有17年设计和开发企业级应用的经验。他是一位开源软件专家,引领了美国公司的大数据趋势。Rishi被评为2014年40位40岁以下硅谷杰出工程师之一。他于1998年获得著名的印度理工学院(Indian Institute of Technology,IIT)德里分校的学士学位。
大约在10年前,Rishi创办了InfoObjects,这是一家以深度探索数据为宗旨的企业。
InfoObjects结合了开源和大数据技术来解决客户的业务问题,并特别注重Apache Spark技术。该公司已连续4年被列入发展最快公司5000强。InfoObjects也被授予了2014及2015年度湾区最佳工作地点第一名的桂冠。
Rishi是一位开源社区贡献者和活跃的博主。
“我要特别感谢我的另一半Anjali对我努力挤出时间进行冗长而艰巨的创作的包容,感谢我8岁的儿子Vedant每天追踪我的进度,感谢InfoObjects的CTO兼我的合伙人Sudhir Jangir领导公司的大数据工作,感谢Helma Zargarian、Yogesh Chandani、Animesh Chauhan和Katie Nelson的高效运营使得我可以专注于本书的创作,感谢我们的内部审查团队,尤其是Arivoli Tirouvingadame、Lalit Shravage和Sanjay Shroff的审查,没有你们的支持我绝对写不成本书。同时还要感谢Marcel Izumi对于本书插图的贡献。”
——Rishi
Thomas W. Dinsmore是一位独立顾问,为分析软件供应商提供产品咨询服务,他拥有30多年为世界各地企业提供分析解决方案的经验,独具动手分析经验和领导分析项目并提供解析结果的能力。
Thomas之前的服务对象包括SAS、IBM、波士顿咨询公司、普华永道和奥纬咨询公司。
Thomas与他人合著了《现代分析方法》(Modern Analytics Methodologies)和《高级分析方法》(Advance Analytics Methodologies),由培生出版社于2014年出版,目前正在和Apress 出版社商谈一本关于商业分析的新书的出版事宜。他的名为“大数据分析”的博客地址为www.thomaswdinsmore.com。
“我要感谢Packt出版社的编辑和制作团队全体人员,是你们的不懈努力才能给公众带来这本制作精良的图书。”
——Thomas
连城不仅是一位来自Databricks公司的Apache Spark贡献者,还是一位来自中国的软件工程师。他的主要技术领域包括大数据分析、分布式系统和函数式编程语言。
连城也是《Erlang/OTP并发编程实战》和《Erlang并发编程(第一部分)》中文版的译者。
“我要感谢来自AsiaInfo的Yi Tian帮我检查第6章的部分内容。”
——连城
Amir Sedighi是一位经验丰富的软件工程师,一位求知若渴的学习狂,一位积极主动的问题解决者。他的经验涵盖了软件开发领域,包括跨平台开发、大数据处理、数据流、信息检索和机器学习。他是一位在伊朗工作的大数据讲师和专家,拥有软件工程的本科和硕士学位。Amir目前是Rayanesh Dadegan Ekbatan公司的CEO,该公司是Amir历经数年为多家私营公司制定和实施分布式大数据和数据流媒体解决方案后,于2013年和他人共同创办的提供数据解决方案的公司。
“我要感谢Packt出版社的所有人,正是因为你们的辛苦工作,才能有这么多杰出的书,才能让读者们的职业技能增长。”
——Amir
随着Hadoop这个大数据平台的成功,用户的期望也水涨船高,他们既希望解决不同分析问题的功能提高,又希望减少延迟。由此,各类工具应运而生。Apache Spark这个可以解决所有问题的单一平台也出现在了Hadoop的大舞台上。“Spark一出,谁与争锋”,它终结了需要使用多种工具来完成复杂挑战和学习曲线的局面。通过使用内存进行持久化存储和计算,Apache Spark避免了磁盘上的中间存储过程并将速度提高了100倍,并且提供了一个单一平台用来完成诸如机器学习、实时streaming等诸多分析作业。
本书包含了Apache Spark的安装和配置,以及Spark内核、Spark SQL、Spark Streaming、MLlib和GraphX库的构建方案。
关于本书教程的更多内容,请访问
infoobjects.com/spark-cookbook
。
第1章 开始使用Apache Spark。介绍了如何在多种环境和集群管理上安装Spark。
第2章 使用Spark开发应用。介绍了在不同的IDE中使用不同的构建工具开发Spark。
第3章 外部数据源。介绍了如何读写各种数据源。
第4章 Spark SQL。带你浏览Spark SQL模块,帮助你通过SQL接口使用Spark的功能。
第5章 Spark Streaming。探索Spark Streaming库以分析实时数据源(比如Kafka)的数据。
第6章 机器学习——MLlib。介绍机器学习以及诸如矩阵、向量之类的基本概念。
第7章 监督学习之回归——MLlib。连续输出变量的监督学习。
第8章 监督学习之分类——MLlib。离散输出变量的监督学习。
第9章 无监督学习——MLlib。介绍例如k-means等无监督学习。
第10章 推荐系统。介绍使用多种技术(比如ALS)构建推荐系统。
第11章 图像处理——GraphX。介绍GraphX的多种图像处理算法。
第12章 优化及调优。介绍多种Spark调优方法和性能优化技术。
你需要使用InfoObjects大数据沙箱软件运行本书的例子,该软件可以从http://www.infoobjects.com
下载。
只要你是一个希望使用Apache Spark更好地洞悉大数据的数据工程师、应用开发工程师或者数据科学家,那本书就是为你而写。
本书将经常出现如下标题——准备工作、具体步骤、工作原理、更多内容和参考资料。
为了更清晰地撰写每一篇教程,我们会使用如下标题。
本节介绍教程的大致内容,以及所需的软件和初步配置。
本节包含教程的具体步骤。
本节通常由之前章节的具体解释组成。
本节由教程相关的更多信息组成,帮助读者了解更多的知识。
本节提供有用的链接和其他教程相关的有用信息。
在本书中,我们将会用不同的格式区分不同的信息。
文本代码、数据表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter用户名格式如下所示:“安装Spark之前,需要安装Java并配置好JAVA_HOME环境变量。”
代码段如下所示:
lazy val root = (project in file("."))
settings(
name := "wordcount"
)
任何命令行输入输出如下所示:
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0-bin-hadoop2.4.tgz
新术语和重要的话用粗体显示,例如菜单或对话框显示如下:“打开右上角你的账户名下拉框并点击安全证书”。
警告或重要信息如此所示。
提示和技巧如此所示。
读者反馈总是很受欢迎的。无论你喜不喜欢本书,都请让我们知道。读者的反馈对我们而言很重要,它会帮助我们提供对读者最有效的信息。
反馈请发送到feedback@packtpub.com
,并请在邮件主题上注明本书书名。
如果你对其中某一主题很有经验,想要写成一本书的话,请访问作者指南www.packtpub.com/authors
。
现在,你可以很自豪地说自己是Packt图书的拥有者了,我们会最大程度地支持我们图书的客户。
我们还为你提供了本书的PDF文件,其中有本书截图的彩图。彩图可以帮助你更好地理解输出变化。你可以从 https://www.packtpub.com/sites/default/files/downloads/7061OS_ColorImages.pdf
下载。
虽然我们已经尽力确保内容的准确性,但是错误是难免的。如果你在我们的书中发现错误并报告给我们,不管是文本的或是代码的,我们将不胜感激。这样可以帮助减少其他读者的困扰并帮助我们提高后续版本的质量。如果你发现任何错误请访问http://www.packtpub.com/submit-errata
并报告。选择你所读的书,点击勘误提交表格链接并输入你的勘误细节。一旦你的勘误被确认,提交就会被接受,勘误内容将在标题下的勘误章节中呈现。
要查看先前提交的勘误表,请访问https://www.packtpub.com/books/content/support
并输入书名搜索。所需内容将出现在勘误章节中。
互联网上的盗版现象是一直存在的问题。在Packt,我们非常重视版权和许可保护。如果你在互联网上看到任何形式的非法复制内容,请立即向我们提供网址或站名,以便我们补救。
请通过copyright@packtpub.com
联系我们提供盗版材料地址。
非常感谢你对我们的作者和我们有价值的内容的保护。
如果你对本书有任何方面的疑问,请通过 questions@packtpub.com
联系我们,我们将会竭尽所能地帮助你。
在本章中,我们将介绍安装和配置Spark,包括如下内容。
Apache Spark是一个用于处理大数据工作流的多功能集群计算系统。Spark在速度、易用性以及分析能力上都强于它的前辈们(如MapReduce)。
Apache Spark最初在2009年,由加州大学伯克利分校的AMPLab实验室研发,在2010年按照BSD协议实现开源,并在2013年转为Apache 2.0协议。到2013年下半年,Spark的创始人建立了Databricks,专注于Spark的研发和未来的公开发行。
谈到速度,Spark大数据工作流的处理可以达到亚秒级别的延迟。为了达到如此低的延迟,Spark充分利用了内存。在MapReduce中,内存仅仅用于实际计算,而Spark不仅使用内存进行计算,而且还用于存储对象。
Spark也提供一个连接各种大数据存储源的统一运行时接口,例如HDFS、Cassandra、Hbase和S3。它同时也提供大量的用于不同的大数据计算任务的顶层库,例如机器学习、SQL处理、图像处理以及实时数据流。这些库加快了开发速度,可以任意组合。
虽然Spark是用Scala所写,本书也只关注Scala部分的教程,但是Spark也支持Java和Python语言。
Spark是一个开源社区产品,每个人都是用Apache纯开源分布部署,不像Hadoop,有大量开发商改进的分布部署。
图1-1展示了Spark的生态圈。
图1-1 Spark生态圈
Spark运行时运行在一系列集群管理器的基础之上,包括YARN(Hadoop的计算框架)、Mesos以及Spark自己的被称为独立模式的集群管理器。Tachyon是一个内存层的分布式文件系统,使得集群架构之间的文件共享速度能够可靠到达内存级别。(译注:Tachyon现已更名为alluxio,官网地址:www.alluxio.org。本书的其他部分仍会按照原文写作Tachyon,后续不再赘述。)简而言之,它是内存上的一个堆外存储层,用于在任务和用户之间分享数据。Mesos 是一个涉及数据中心处理系统的集群管理器。YARN是一个有着健壮的资源管理特性的Hadoop计算框架,Spark可以与它无缝连接使用。
Spark既可以通过源码安装也可以通过预编译二进制安装,下载地址为http://spark.apache.org
。对于标准使用场景来说,二进制安装已经足够了,这里将主要介绍通过二进制文件安装Spark。
本书的所有教程都是适用于Ubuntu Linux系统的,不过应该也适用于任何POSIX环境。在安装Spark之前,首先需要安装好Java,并且配置好JAVA_HOME
环境变量。
在Linux/Unix系统中,文件和目录的位置是有特定标准的,本书中也同样遵从这些标准,表1-1是一张速查表。
表1-1 速查表
目录 |
描述 |
---|---|
|
基本命令二进制文件 |
|
主机特定系统配置 |
|
附加应用软件包 |
|
变量 |
|
临时文件 |
|
用户主目录 |
在写作本书时,Spark的当前版本是1.4。请从Spark下载页面http://spark.apache.org/downloads.html
查阅最新版本。二进制安装包是使用最新最稳定的Hadoop版本。如果想使用特定的Hadoop版本,推荐使用源码构建,具体请参考下一份教程。
安装步骤如下所示。
1.打开终端,使用如下命令下载二进制安装包。
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-1.4.0-bin-
hadoop2.4.tgz
2.解压二进制安装包。
$ tar -zxf spark-1.4.0-bin-hadoop2.4.tgz
3.重命名包含二进制安装包的文件夹,去除版本信息。
$ sudo mv spark-1.4.0-bin-hadoop2.4 spark
4.把配置文件夹移动到/etc
文件夹下,以便之后制作软链接。
$ sudo mv spark/conf/ * /etc/spark
5.在/opt
目录下新建一个公司名限定的安装目录。本书的本篇教程是使用infoobjects
沙盒测试的,所以我们就用infoobjects
做目录名。创建目录/opt/infoobjects
。
$ sudo mkdir -p /opt/infoobjects
6.把spark
目录移动到/opt/infoobjects
,因为spark是一个附加软件包。
$ sudo mv spark /opt/infoobjects/
7.设置root
为spark
主目录的权限用户。
$ sudo chown -R root:root /opt/infoobjects/spark
8.修改spark
主目录的权限,0755
意味着主用户将拥有读写和执行权限,而群用户和其他用户拥有读和执行权限。
$ sudo chmod -R 755 /opt/infoobjects/spark
9.进入spark
主目录。
$ cd /opt/infoobjects/spark
10.创建软链接。
$ sudo ln -s /etc/spark conf
11.在.bashrc
文件中添加到PATH
变量。
$ echo "export PATH=$PATH:/opt/infoobjects/spark/bin" >> /home/
hduser/.bashrc
12.打开一个新终端。
13.在/var
目录下创建log
目录。
$ sudo mkdir -p /var/log/spark
14.设置hduser
为Spark log
目录的权限用户
$ sudo chown -R hduser:hduser /var/log/spark
15.创建Spark tmp
目录。
$ mkdir /tmp/spark
16.在以下命令的帮助下配置Spark。
$ cd /etc/spark
$ echo "export HADOOP_CONF_DIR=/opt/infoobjects/hadoop/etc/hadoop"
>> spark-env.sh
$ echo "export YARN_CONF_DIR=/opt/infoobjects/hadoop/etc/Hadoop"
>> spark-env.sh
$ echo "export SPARK_LOG_DIR=/var/log/spark" >> spark-env.sh
$ echo "export SPARK_WORKER_DIR=/tmp/spark" >> spark-env.sh
在大多数情况下使用二进制文件安装Spark已经足够了。对于一些高级的需求(并不局限于下列需求),通过源码编译是个更好的选择。
开始本篇教程之前需要以下必备条件。
使用Maven构建Spark源码的步骤如下。
1.增大堆的MaxPermSize
参数。
$ echo "export _JAVA_OPTIONS=\"-XX:MaxPermSize=1G\"" >> /home/
hduser/.bashrc
2.打开一个新的终端窗口并通过GitHub下载源码。
$ wget https://github.com/apache/spark/archive/branch-1.4.zip
3.解压缩文档。
$ gunzip branch-1.4.zip
4.进入spark
目录。
$ cd spark
5.通过以下标签编译源码:激活Yarn、Hadoop版本设置为2.4,激活Hive以及跳过测试以加快编译速度。
$ mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive
-DskipTests clean package
6.为了制作软链接,把conf
目录移动到etc
目录下。
$ sudo mv spark/conf /etc/
7.把spark
目录移动到/opt
,因为spark是一个附加软件包。
$ sudo mv spark /opt/infoobjects/spark
8.设置root
为spark
主目录的权限用户。
$ sudo chown -R root:root /opt/infoobjects/spark
9.修改spark
主目录的权限,0755
意味着主用户将拥有读写和执行权限,而同组用户和其他用户拥有读和执行权限。
$ sudo chmod -R 755 /opt/infoobjects/spark
10.进入spark
主目录。
$ cd /opt/infoobjects/spark
11.创建软链接。
$ sudo ln -s /etc/spark conf
12.在.bashrc
文件中添加到PATH变量。
$ echo "export PATH=$PATH:/opt/infoobjects/spark/bin" >> /home/
hduser/.bashrc
13.在/var
目录下创建log
目录。
$ sudo mkdir -p /var/log/spark
14.设置hduser
为Spark log
目录的权限用户。
$ sudo chown -R hduser:hduser /var/log/spark
15.在Spark下创建tmp
目录。
$ mkdir /tmp/spark
16.在以下命令的帮助下配置Spark。
$ cd /etc/spark
$ echo "export HADOOP_CONF_DIR=/opt/infoobjects/hadoop/etc/hadoop"
>> spark-env.sh
$ echo "export YARN_CONF_DIR=/opt/infoobjects/hadoop/etc/Hadoop"
>> spark-env.sh
$ echo "export SPARK_LOG_DIR=/var/log/spark" >> spark-env.sh
$ echo "export SPARK_WORKER_DIR=/tmp/spark" >> spark-env.sh
Amazon弹性计算云(Amazon EC2)是一个能够提供可变大小的云计算实例的网络服务,Amazon EC2提供以下特性。
EC2提供不同类型的实例,以满足所有计算需求,例如通用实例、微实例、内存优化实例、存储优化实例等,并提供微实例的免费试用。
Spark绑定的spark-ec2
脚本使得在Amazon EC2上安装、管理以及关闭Spark集群变得很容易。
开始之前需要以下准备工作。
1.登录你的Amazon AWS账号(http://aws.amazon.com/cn/
)。
2.点击右上角的我的账户下拉菜单中的安全证书。
3.点击访问密钥并创建访问密钥(如图1-2所示)。
图1-2 创建访问密钥
4.记下访问密钥ID(Access Key ID)和私有访问密钥(Secret Access Key)。
5.现在,点开服务,点击EC2。
6.点击左侧菜单网络与安全下面的密钥对。
7.如图1-3所示,点击创建密钥对(Create Key Pair),输入kp-spark
作为密钥对的名字。
8.下载私钥文件并复制到home/hduser/keypairs
文件夹下。
9.设置文件权限许可为600
。
10.将公钥ID和密钥ID的设置到环境变量中(请使用你自己的值替换本文的样本)。
$ echo "export AWS_ACCESS_KEY_ID=\"AKIAOD7M2LOWATFXFKQ\"">> /
home/hduser/.bashrc
$ echo "export AWS_SECRET_ACCESS_KEY=\"+Xr4UroVYJxiLiY8DLT4DLT4D4s
xc3ijZGMx1D3pfZ2q\"">> /home/hduser/.bashrc
$ echo "export PATH=$PATH:/opt/infoobjects/spark/ec2">> /home/
hduser/.bashrc
图1-3 创建密钥对
1.Spark绑定了在Amazon EC2上安装Spark集群的脚本。让我们使用以下命令部署集群。
$ cd /home/hduser
$ spark-ec2 -k <key-pair> -i<key-file> -s <num-slaves> launch
<cluster-name>
2.以下列数值为例部署集群。
$ spark-ec2 -k kp-spark -i /home/hduser/keypairs/kp-spark.pem
--hadoop-major-version 2 -s 3 launch spark-cluster
<密钥对>:这是AWS中创建的EC2密钥对的名字。
<密钥文件>:这是你下载的私钥文件。
<从节点库数>:这是部署的从节点的数量。
<集群名称>:这是集群名字。
3.有时,缺省值可能不可用;在这种情况下,你就需要重发请求来制定特定的可用区域。
$ spark-ec2 -k kp-spark -i /home/hduser/keypairs/kp-spark.pem –z
us-east-1b --hadoop-major-version 2 -s 3 launch spark-cluster
4.如果你的应用需要实例关闭后保留数据,那么就为它增加一个EBS卷(例如一个10GB的空间)。
$ spark-ec2 -k kp-spark -i /home/hduser/keypairs/kp-spark.pem
--hadoop-major-version 2 -ebs-vol-size 10 -s 3 launch spark-
cluster
5.如果你使用的是Amazon spot实例,做法如下。
$ spark-ec2 -k kp-spark -i /home/hduser/keypairs/kp-spark.pem
-spot-price=0.15 --hadoop-major-version 2 -s 3 launch spark-
cluster
Spot实例服务允许你自己定价来租Amazon EC2的计算能力。你只需要竞标Amazon EC2的空闲实例,当你的竞标价格大于当前标价时,你就可以使用该服务。该服务的价格是根据市场供求关系实时变化的(来源:amazon.com)。
6.一切部署完毕后,打开最后打印出来的网页URL来检查集群状态,如图1-4所示。
图1-4 集群状态
7.检查集群状态,如图1-5所示。
8.现在,在EC2上使用Spark集群,让我们使用安全外壳协议(SSH)连接到主节点上。
$ spark-ec2 -k kp-spark -i /home/hduser/kp/kp-spark.pem login
spark-cluster
你应该会看到图1-6所示的内容。
图1-5 集群状态网页
图1-6 连接主节点
9.检查主节点上的目录并查看它们的用途,如表1-2所示。
表1-2 主节点目录说明
目录 |
描述 |
---|---|
|
此处存储临时的数据,当你关闭或重启机器时就会被删掉 |
|
每个节点都有一个很小量的永久存储空间(大约3 GB),如果使用的话,数据就会被存储在这个目录下 |
|
这些是用于支持Hadoop的原生库,例如Snappy压缩库 |
|
此处是Scala安装 |
|
此处是Shark安装(Shark已经不再被支持,并且已经被Spark SQL取代) |
|
此处是Spark安装 |
|
这些文件用于支持该集群部署 |
|
此处是Tachyon安装 |
10.检查临时实例的HDFS版本。
$ ephemeral-hdfs/bin/hadoop version
Hadoop 2.0.0-chd4.2.0
11.使用以下命令检查永久实例的HDFS版本。
$ persistent-hdfs/bin/hadoop version
Hadoop 2.0.0-chd4.2.0
12.改变日志的配置层。
$ cd spark/conf
13.如图1-7所示,默认日志层信息非常冗长,所以我们把它改成Error级别。
图1-7 日志层
log4.properties
。 $ mv log4j.properties.template log4j.properties
log4j.properties
。 $ vi log4j.properties
log4j.rootCategory=INFO, console|
改为log4j.rootCategory= ERROR, console
。14.修改之后将所有配置复制到所有的从节点上。
$ spark-ec2/copydir spark/conf
你应该会得到如图1-8所示的信息。
图1-8 配置信息
15.销毁Spark集群。
$ spark-ec2 destroy spark-cluster
http://aws.amazon.com/ec2
在分布式环境中的计算资源需要管理,使得资源利用率高,每个作业都有公平运行的机会。Spark有一个便利的被称为独立模式的自带集群管理器。Spark也支持使用YARN或者Mesos做为集群管理器。
选择集群处理器时,主要需要考虑延迟以及其他架构,例如MapReduce,是否共享同样的计算资源池。如果你的集群运行着旧有的MapReduce作业,并且这些作业不能转变为Spark作业,那么使用YARN作为集群管理器是个好主意。Mesos是一种新兴的、方便跨平台管理作业的、与Spark非常兼容的数据中心操作系统。
如果Spark是你的集群的唯一框架,那么独立模式就足够好用了。随着Spark技术的发展,你会看到越来越多的Spark独立模式被用于处理所有的大数据计算需求。例如,目前有些作业可能在使用Apache Mahout,因为MLlib目前没有作业所需要的特定的机器学习库。只要MLlib包含了这些库,这些特定的作业就可以移动到Spark了。
让我们以由6个节点组成的一个集群的设置为例,包含一个主节点和5个从节点(在你的实际集群中以真实的名字替换它们)。
主节点
m1.zettabytes.com
从节点
s1.zettabytes.com
s2.zettabytes.com
s3.zettabytes.com
s4.zettabytes.com
s5.zettabytes.com
1.因为Spark的独立模式是默认的,所以你需要做的就是在所有主节点和从节点上安装Spark二进制文件。把/opt/infoobjects/spark/sbin
放到每个节点的路径中。
$ echo "export PATH=$PATH:/opt/infoobjects/spark/sbin">> /home/
hduser/.bashrc
2.开启独立主服务器(先SSH到主节点)。
hduser@m1.zettabytes.com~] start-master.sh
从节点连接主节点的默认端口是7077,8088是它的网页界面端口。
3.请SSH到主节点去开启从节点,主从节点之间的细粒度配置参数如表1-3所示。
hduser@s1.zettabytes.com~] spark-class org.apache.spark.deploy.
worker.Worker spark://m1.zettabytes.com:7077
表1-3 相关参数
参数(下列参数适用于主节点和从节点的细粒度配置) |
含义 |
---|---|
|
IP地址/DNS服务监听 |
|
端口服务监听 |
|
网页前端端口(主节点默认为8080,从节点默认为8081) |
|
该机器可用于Spark应用的总CPU内核数(仅适用从节点) |
|
该机器可用于Spark应用的总内存(仅适用从节点 |
|
用于划分空间和存放作业输出日志的目录 |
4.不仅可以手动启动主从节点的守护程度,还可以使用集群启动脚本来完成。
5.首先,在主节点创建conf/slaves
文件夹,并加入每一个从节点的主机名(本例有5个从节点,在实际操作中使用你自己从节点的DNS替换它们)。
hduser@m1.zettabytes.com~] echo "s1.zettabytes.com" >> conf/slaves
hduser@m1.zettabytes.com~] echo "s2.zettabytes.com" >> conf/slaves
hduser@m1.zettabytes.com~] echo "s3.zettabytes.com" >> conf/slaves
hduser@m1.zettabytes.com~] echo "s4.zettabytes.com" >> conf/slaves
hduser@m1.zettabytes.com~] echo "s5.zettabytes.com" >> conf/slaves
一旦从节点设置好了,你就可以使用如下脚本开启或停止集群,如表1-4所示。
表1-4 相关脚本
脚本名称 |
目的 |
---|---|
|
在主机上开启一个主实例 |
|
在每个节点的从节点文件上开启一个从实例 |
|
开启主进程和从进程 |
|
停止主机上的主实例 |
|
停止所有节点的从节点文件的从实例 |
|
停止主进程和从进程 |
6.使用Scala代码将应用连接到集群。
val sparkContext = new SparkContext(new SparkConf().
setMaster("spark://m1.zettabytes.com:7077")
7.通过Spark shell连接到集群。
$ spark-shell --master spark://master:7077
在独立模式下,Spark与Hadoop、MapReduce以及YARN类似,遵循主从架构。计算主程序被称为Spark master,它运行在主节点上。通过使用ZooKeeper,Spark master可以具有高可用性。如果需要的话,你可以增加更多的备用主节点。
计算从程序又被称为worker,它运行在每一个从节点上,worker程序执行如下操作。
每个从节点机器的每个应用程序最多只有一个执行程序。
Spark master和worker都非常轻巧。通常情况下,500 MB到1 GB的内存分配就足够了。可以通过设置conf/spark-env.sh
文件里的SPARK_DAEMON_MEMORY
参数修改这个值。例如,如下配置将主节点和从节点的计算程序的内存设置为1 GB。确保使用超级用户(sudo)运行:
$ echo "export SPARK_DAEMON_MEMORY=1g" >> /opt/infoobjects/spark/conf/
spark-env.sh
默认情况下,每个从节点上运行一个worker实例。有时候,你的几台机器可能比其他的都强大,在这种情况下,你可以通过以下配置派生多个作业到该机器上(特指那些强大的机器):
$ echo "export SPARK_WORKER_INSTANCES=2" >> /opt/infoobjects/spark/conf/
spark-env.sh
Spark worker在默认情况下使用从节点机器的所有内核执行程序。如果你想要限制worker使用的内核数的话,可以通过如下配置设置该参数(例如12):
$ echo "export SPARK_WORKER_CORES=12" >> /opt/infoobjects/spark/conf/
spark-env.sh
Spark worker在默认情况下使用所有可用的内存(对执行程序来说是1 GB)。请注意,你不能给每一个具体的执行程序分配内存(你可以通过驱动配置对此进行控制)。想要分配所有执行程序的总内存数,可以执行如下设置:
$ echo "export SPARK_WORKER_MEMORY=24g" >> /opt/infoobjects/spark/conf/
spark-env.sh
在驱动级别,你可以进行如下设置。
spark.cores.max
配置。 $ spark-submit --confspark.cores.max=12
spark.executor.memory
配置。 $ spark-submit --confspark.executor.memory=8g
图1-9描述了Spark集群的高层架构。
图1-9 Spark集群的高层架构
http://spark.apache.org/docs/latest/spark-standalone.html
找到更多配置选项。
Mesos正慢慢崛起为跨数据中心管理所有计算资源的数据中心管理系统。Mesos可以运行在任意一台Linux操作系统的机器上。Mesos与Linux内核有着相同的配置原则。让我们看看如何安装Mesos。
Mesosphere提供Mesos的二进制安装包。最新的Mesos分布式安装包可以通过Mesosphere库按照如下步骤安装。
1.在Ubuntu操作系统的可靠版本上执行Mesos。
$ sudo apt-key adv --keyserver keyserver.ubuntu.com –recv
E56151BF DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
CODENAME=$(lsb_release -cs)
$ sudo vi /etc/apt/sources.list.d/mesosphere.list
deb http://repos.mesosphere.io/Ubuntu trusty main
2.更新库。
$ sudo apt-get -y update
3.安装Mesos。
$ sudo apt-get -y install mesos
4.连接Spark到Mesos上以整合Spark和Mesos,配置Spark二进制安装包以适应Mesos,并配置Spark驱动以连接Mesos。
5.把第一份教程中使用到的Spark二进制安装包上传到HDFS。
$ hdfs dfs -put spark-1.4.0-bin-hadoop2.4.tgz spark-1.4.0-bin-
hadoop2.4.tgz
6.Mesos单主节点的主URL是mesos://host:5050
,如果使用ZooKeeper管理Mesos集群的话,URL是mesos://zk://host:2181
。
7.配置spark-env.sh
中的如下变量。
$ sudo vi spark-env.sh
export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so
export SPARK_EXECUTOR_URI= hdfs://localhost:9000/user/hduser/
spark-1.4.0-bin-hadoop2.4.tgz
8.通过Scala运行。
val conf = new SparkConf().setMaster("mesos://host:5050")
val sparkContext = new SparkContext(conf)
9.通过Spark运行。
$ spark-shell --master mesos://host:5050
Mesos有两种模式。
Fine-grained:在fine-grained模式(默认模式)下,每个Spark任务以独立的Mesos任务运行。
Coarse-grained:在此模式下,仅会在每个Mesos机器上发起一个长时间运行的Spark任务。
10.如果想要修改模式为coarse-grained,配置spark.mesos.coarse
。
conf.set("spark.mesos.coarse","true")
另一种资源协调者(YARN)是基于HDFS这个Hadoop存储层的Hadoop计算框架。
YARN遵循主从架构。主守护进程被称为资源管理器(ResourceManager),从守护进程被称为节点管理器(NodeManager)。除此之外,生命周期管理由ApplicationMaster
负责,它可以被派生到任何从节点上并可以生存一个应用的生命周期时长。
如果Spark运行在YARN上的话,资源管理器充当Spark master,节点管理器充当执行节点。
如果Spark运行在YARN上的话,每个Spark执行程序以YARN容器(container)的形式运行。
在YARN上部署Spark需要一个拥有YARN支持的Spark二进制安装包。在按照Spark安装教程时,需要注意这一点。
1.在YARN上部署Spark,第一步就是设置配置参数。
HADOOP_CONF_DIR: to write to HDFS
YARN_CONF_DIR: to connect to YARN ResourceManager
$ cd /opt/infoobjects/spark/conf (or /etc/spark)
$ sudo vi spark-env.sh
export HADOOP_CONF_DIR=/opt/infoobjects/hadoop/etc/Hadoop
export YARN_CONF_DIR=/opt/infoobjects/hadoop/etc/hadoop
图1-10可见这些配置。
图1-10 Spark配置
2.以下命令以yarn-client
模式启动YARN Spark。
$ spark-submit --class path.to.your.Class --master yarn-client
[options] <app jar> [app options]
例如:
$ spark-submit --class com.infoobjects.TwitterFireHose —master
yarn-client --num-executors 3 --driver-memory 4g —executor-memory
2g --executor-cores 1 target/sparkio.jar 10
3.以下命令以yarn-client
模式启动Spark shell。
$ spark-shell --master yarn-client
4.以下命令以yarn-cluster
模式启动。
$ spark-submit --class path.to.your.Class --master yarn-cluster
[options] <app jar> [app options]
例如:
$ spark-submit --class com.infoobjects.TwitterFireHose –master
yarn-cluster --num-executors 3 --driver-memory 4g --executor-
memory 2g --executor-cores 1 target/sparkio.jar 10
部署在YARN上的Spark应用有两种模式。
yarn-client
:Spark驱动运行在YARN集群之外的客户端进程上,并且ApplicationMaster
仅用于协商安排资源管理器的资源。yarn-cluster
:Spark驱动运行在由从节点的节点管理器派生出来的ApplicationMaster
上。yarn-cluster
模式建议用于生产环境部署,而yarn-client
模式很适合用于开发和调试,因为你可以立即看到输出。不需要特别分别Spark master在哪个模式下,因为它由Hadoop配置决定,master的参数要么是yarn-client
,要么是yarn-cluster
。
图1-11是client模式下在YARN上部署Spark的架构图。
图1-11 client模式架构图
图1-12是cluster模式下在YARN上部署Spark的架构图。
图1-12 cluster模式架构图
在YARN模式下,可以配置如下参数。
num-executors
:配置可分配执行程序数。executor-memory
:每个执行程序的内存(RAM)。executor-cores
:每个执行程序的CPU内核数。Spark弹性分布式数据集(RDD)很适合在内存上存储数据集,可以在不同应用上存储大量备份。Tachyon可以解决Spark RDD管理的一些挑战性问题,如下所示。
Tachyon提供了堆外存储层来解决这些问题。该层(即堆外存储层)不受进程崩溃的影响也不会被垃圾回收器标记,同时也可以让RDD独立于特定的作业或对话之上实现跨应用共享。本质上,数据的一个存储在内存上的单一副本如图1-13所示。
图1-13 数据存储
1.下载并编译Tachyon(在默认情况下Tachyon配置的Hadoop版本为1.0.4,所以需要从源代码编译,选择正确的Hadoop版本)。替换当前版本,本书所写是版本为0.6.4。
$ wget https://github.com/amplab/tachyon/archive/v<version>.zip
2.解压源代码。
$ unzip v-<version>.zip
3.为了方便,重命名Tachyon
源文件名。
$ mv tachyon-<version> tachyon
4.修改Tachyon
文件夹目录。
$ cd tachyon
$ mvn -Dhadoop.version=2.4.0 clean package -DskipTests=true
$ cdconf
$ sudo mkdir -p /var/tachyon/journal
$ sudo chown -R hduser:hduser /var/tachyon/journal
$ sudo mkdir -p /var/tachyon/ramdisk
$ sudo chown -R hduser:hduser /var/tachyon/ramdisk
$ mv tachyon-env.sh.template tachyon-env.sh
$ vi tachyon-env.sh
5.注释下面这行。
export TACHYON_UNDERFS_ADDRESS=$TACHYON_HOME/underfs
6.去掉下面这行前面的注释。
export TACHYON_UNDERFS_ADDRESS=hdfs://localhost:9000
7.修改以下属性。
-Dtachyon.master.journal.folder=/var/tachyon/journal/
export TACHYON_RAM_FOLDER=/var/tachyon/ramdisk
$ sudo mkdir -p /var/log/tachyon
$ sudo chown -R hduser:hduser /var/log/tachyon
$ vi log4j.properties
8.用/var/log/tachyon
替换${tachyon.home}
。
9.在conf
目录下创建新文件core-site.xml
。
$ sudo vi core-site.xml
<configuration>
<property>
<name>fs.tachyon.impl</name>
<value>tachyon.hadoop.TFS</value>
</property>
</configuration>
$ cd ~
$ sudo mv tachyon /opt/infoobjects/
$ sudochown -R root:root /opt/infoobjects/tachyon
$ sudochmod -R 755 /opt/infoobjects/tachyon
10.将<tachyon home>/bin
加入路径。
$ echo "export PATH=$PATH:/opt/infoobjects/tachyon/bin" >> /home/
hduser/.bashrc
11.重启shell并格式化Tachyon。
$ tachyon format
$ tachyon-start.sh local //you need to enter root password as
RamFS needs to be formatted
Tachyon的网页端口是http://hostname:19998
,如图1-14所示。
图1-14 Tachyon网页
12.运行以下程序观测Tachyon是否运行良好,如图1-15所示。
$ tachyonrunTest Basic CACHE_THROUGH
图1-15
13.以下命令可以随时停止Tachyon。
$ tachyon-stop.sh
14.在Spark上运行Tachyon。
$ spark-shell
scala> val words = sc.textFile("tachyon://localhost:19998/words")
scala> words.count
scala> words.saveAsTextFile("tachyon://localhost:19998/w2")
scala> val person = sc.textFile("hdfs://localhost:9000/user/
hduser/person")
scala> import org.apache.spark.api.java._
scala> person.persist(StorageLevels.OFF_HEAP)
http://www.cs.berkeley.edu/~haoyuan/papers/2013_ladis_tachyon.pdf
了解Tachyon的起源。