Big Data, Hardware trends, and Spark
本博客是【pySpark教程】系列的文章。
是 Berkeley 的 Python Spark公开课的学习笔记(see 原课程)。
由于个人能力有限,不免有些错误,还望各位批评指正。
更多相关博客请猛戳:http://blog.youkuaiyun.com/cyh24/article/category/6092916
如需转载,请附上本文链接:http://blog.youkuaiyun.com/cyh_24/article/details/50659856
在本系列课程中,我们会学习如下内容:
- Apache Spark 介绍
- Big Data, Hardware trends, and Spark
- Spark 要点
- 实验一:Spark 基础学习
- Data Management
- Semi-Structed Data
- Structured Data
- 实验二:使用 Spark 分析网络服务器日志
- 数据分析与机器学习
- 数据处理
- 数据分析
- 机器学习
- 实验三:文本分析与实体解析
- 实验四:Spark 机器学习介绍
The Big Data Problem
传统的数据分析的工具有下面这些,包括:Unix shell命令,Pandas 和 R 语言等等。这些工具都是运行到单个机器上的,遇到Big Data Problem 的时候就不太能work了。
那么 Big Data Problem 是啥呢?
- 数据增加速度大于计算性能
- 数据源越来越丰富
>> Web, mobile, scientific,… - 存储变得越来越便宜
>> 基本上每18个月便宜一半 - 但是CPU性能的增长速度却达不到这样的水平
举一些 Big Data Examples
可以看到,从disk中读取 1TB 数据需要3个小时,而且单个机器已经很难处理这样规模的数据了,一个解决方法就是把数据分布到大型集群中去。
Hardware for Big Data
如果集群使用的是廉价的机器,那么很容易发生一些问题:
- Failures (Google的数据)
1~5% 硬盘会损坏/年
0.2% 内存条损坏/年 - Network 速度 VS 共享内存
从网络中读取的速度远远小于从硬盘或者内存中读取的速度 - Uneven performance
机器的性能不均,有些机器很快,有些则计算的很慢
Distributing Work
集群的计算有没有困难的地方?
第一个challenge就是,如何将任务分配到不同的机器中?
来看一个例子(统计词频):
1. 文件不是很大的情况下:
很简单,使用一个hash 表就能解决问题了。
2. 文件很大的情况下:
这种情况下,其实也很简单,就是使用MapReduce 的思想,把数据map之后处理,然后再reduce结果。
上图貌似可以解决问题了,但是,当数据特别大的时候,machine 5 的压力特别大,因为它要保存所有的结果(可能会存不下)。
这种情况下,可以采用下面这种分而治之的思想,把结果也分布到不同的机器上:
这就是 Google 在04年提出的 Map Reduce:
有便捷,肯定也会有缺陷,使用这种分而治之思想,会带来哪些问题呢?
- 数据的传输非常耗时
- 处理更多的机器意味着你需要解决更多的机器故障带来的问题
Solution:当一台机器故障的时候,你可以将这个未完成的任务分配给其他机器,或者等到这台机器恢复的时候再重新分配给它; - 机器多了,性能差距也会变大,所以,你还需解决性能不均带来的问题
Solution:如果有一台机器非常慢,一直无法完成任务,那么你可以杀掉这个任务,并将它分配给其他机器;
所以,没有什么万能方法,你想要达到一些便利,就需要面对由此而来的困扰。
Map Reduce
Map Reduce 在每一次任务完成之后,都要把结果写入硬盘,并在下一次任务开始再读进来。
如果我们的job是迭代式的(比如,机器学习中的迭代优化),那么计算性能就会非常慢。因为,每一次的迭代,你都需要重新读写。我们都知道,读写硬盘是一件非常非常耗时的事情。
Apache Spark
随着内存价格越来越低,我们可以更多的利用内存来进行计算。Spark 正是利用了内存速率高的特点,大大改进了Map Reduce的性能。
下图是 MapReduce 的过程:
下图是 Spark 的过程:
避免频繁的网络、硬盘读取,使得Spark速度大大提升。
Spark 发展到现在已经非常成熟,它提供了很多的数据分析工具,如下图:
Spark 与 Hadoop 的不同之处:
这些不同之处,带来了一些性能上的提升如下:
Spark,拥有Hadoop MapReduce所具有的优点;
但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS。
Spark 能更好地适用于数据挖掘、机器学习等需要迭代优化的 MapReduce 的算法。