Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469286
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1575
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-20 17:02
文章分类

全部博文(153)

文章存档

2017年(111)

2016年(42)

我的朋友

分类: 大数据

2017-01-13 17:52:57

第一次听闻Spark是2013年年末,当时笔者对Scala(Spark的编程语言)感兴趣。一段时间之后做了一个有趣的数据科学项目,试图预测泰坦尼克号上的生还情况(Kaggle竞赛项目,通过使用机器学习预测泰坦尼克号上哪些乘客具备更高的生还可能性)。通过该项目可以更深入地理解Spark的概念和编程方式,强推荐想要精进Spark的开发人员拿该项目入手。

如今Spark在众多互联网公司被广泛采用,例如Amazon、eBay和Yahoo等。许多公司拥有运行在上千个节点的Spark集群。根据Spark FAQ,已知最大的集群有着超过8000个节点。不难看出,Spark是一项值得关注和学习的技术。

本文通过一些实际案例和代码示例对Spark进行介绍,案例和代码示例部分出自Apache Spark官方网站,也有一部分出自《Learning Spark - Lightning-Fast Big Data Analysis》一书。

什么是 Apache Spark? 初步介绍

Spark是Apache的一个项目,被宣传为"闪电般快速集群计算",它拥有繁荣的开源社区,同时也是目前最活跃的Apache项目。

Spark提供了一个更快更通用的数据处理平台。与Hadoop相比,运行在内存中的程序,Spark的速度可以提高100倍,即使运行在磁盘上,其速度也能提高10倍。去年,Spark在处理速度方面已经超越了Hadoop,仅利用十分之一于Hadoop平台的机器,却以3倍于Hadoop的速度完成了100TB数量级的Daytona GreySort比赛,成为了PB级别排序速度最快的开源引擎

通过使用Spark所提供的超过80个高级函数,让更快速地完成编码成为可能。大数据中的"Hello World!"(编程语言延续下来一个惯例):Word Count程序示例可以说明这一点,同样的逻辑使用Java语言编写MapReduce代码需要50行左右,但在Spark(Scala评议实现)中的实现非常简单:

sparkContext.textFile("hdfs://..."). flatMap(line => line.split(" ")). map(word => (word, 1)). reduceByKey(_ + _).saveAsTextFile("hdfs://...")
学习如Apache Spark的另一个重要途径是使用交互式shell (REPL),使用REPL可以交互显示代码运行结果,实时测试每行代码的运行结果,无需先编码、再执行整个作业,如此便能缩短花在代码上的工作时间,同时为即席数据分析提供了可能。


Spark的其他主要功能包括:

  • 目前支持Scala,Java和Python三种语言的 API,并正在逐步支持其他语言(例如R语言);
  • 能够与Hadoop生态系统和数据源(HDFS,Amazon S3,Hive,HBase,Cassandra等)完美集成;
  • 可以运行在Hadoop YARN或者Apache Mesos管理的集群上,也可以通过自带的资源管理器独立运行。

Spark 内核之上还有许多强大的、更高级的库作为补充,可以在同一应用程序中直接使用,目前有SparkSQL,Spark Streaming,MLlib(用于机器学习)和GraphX这四大组件库,本文将对Spark Core及四大组件库进行详细介绍。当然,还有额外其它的Spark库和扩展库目前也处于开发中。

c517c6f51bd3e1f425e4c956c8a1b54af65bebe5

Spark Core

Spark Core是大规模并行计算和分布式数据处理的基础引擎。它的职责有:

  • 内存管理和故障恢复;
  • 调度、分发和监控集群上的作业;
  • 与存储系统进行交互。

Spark引入了RDD(弹性分布式数据集)的概念,RDD是一个不可变的容错、分布式对象集合,支持并行操作。RDD可包含任何类型的对象,可通过加载外部数据集或通过Driver程序中的集合来完成创建。

RDD支持两种类型的操作:

  • 转换(Transformations)指的是作用于一个RDD上并会产生包含结果的新RDD的操作(例如map, filter, join, union等)
  • 动作(Actions)指的是作用于一个RDD之后,会触发集群计算并得到返回值的操作(例如reduce,count,first等)

Spark中的转换操作是“延迟的(lazy)”,意味着转换时它们并不立即启动计算并返回结果。相反,它们只是“记住”要执行的操作和待执行操作的数据集(例如文件)。转换操作仅当产生调用action操作时才会触发实际计算,完成后将结果返回到driver程序。这种设计使Spark能够更有效地运行,例如,如果一个大文件以不同方式进行转换操作并传递到首个action操作,此时Spark将只返回第一行的结果,而不是对整个文件执行操作。
阅读全文请点击:

阅读(2119) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~