1 大数据启蒙
1.1 分治思想
在认识分治思想之前,让我们先来看这样一个需求:
- 我有一万个元素(比如数字或单词)需要存储,如果查找某一个元素,最简单的遍历方式复杂度是多少呢?
- 更进一步,如果我期望的复杂度是O(4)呢?
对于第一个需求,我们很容易就能想到可以用数组或者是链表来存储,这样查找某一个元素的时间复杂度分别是O(logn)和O(n):
那么对于第二个需求,我们应该如何实现呢?
如果你有学过数据结构,那你一定很快就能想到可以用散列表这种结构来实现这个需求,使用2500个长度为4(抛开数据分布不平衡的因素)的链表来存储这10000个元素,在查找的时候,首先通过hash值与2500取模定位到所在的链表数组,然后就能以O(4)的复杂度来查找这个元素了,如下图所示:
上述案例中的散列表就体现出了一种分治思想,分而治之的思想非常重要,它被运用在了很多场景中,比如:
- Redis集群
- ElasticSearch
- Hbase
- HaDoop生态
1.2 单机处理大数据问题
继续来看这样一个需求:
- 有一个非常大的文本文件,里面有很多很多的行,只有两行一样,它们出现在未知的位置,需要查找到它们。
- 给定的硬件只有一台单机,而且可用的内存很少,也就几十兆。
现在我们来分析一下这个问题,假设这个文件有1T大小,I/O速度是500MB每秒,那么1T文件读取一遍需要约30分钟,循环遍历(逐行两两比对)需要N次I/O时间(总共需要30 * N 分钟),使用分治思想可以使时间为2次I/O(也就是1个小时左右)。
那么如何利用分治思想呢?我这里提供一种思路:可以计算每一行的hash值,然后对一个基数(比如2000)取模,将文件散列成2000个小文件块(这些文件块小到可以放到内存里),这样会花费一次I/O,也就是30分钟,我们可以知道的是,哈希运算和取模运算都是稳定的运算(两个相同的值无论经过多少次运算,得到的结果总是一样的),因此相同的两行,它们的计算结果一定会相同,也就是说,它们一定会被散列到同一个文件块中,这样再遍历每一个文件块(1次I/O)就能找到某个文件块中重复的两行。
tips:内存寻址比I/O寻址快10万倍。
现在让我们来考虑另一个问题:如果1T的文件中放的都是数值且都是乱序的,现在我们希望把这些数值做一次全排序,我们应该如何来实现呢?
我们都知道哈希这种运算是无序的,因此在这个需求中就不再适用了,这时我们可以使用另一种方式:读取一行中的数值,如果它在某个选定的范围内(假设是1~100),就将它发送到0号小文件块中,如果它在101~200之内,就将它发送到1号小文件块中...依此类推,直到文件中的所有数值都被发送到一个个小的文件块中。这样耗费一次I/O时间可以使得这些数值做到外部(文件块之间)有序,内部(某个文件块中)无序。这时如果我们切分的文件块足够小,我们就可以将它放到内存中做一次排序,这样就能使得数值在每个文件块中也是有序的,从而实现了使用两次I/O完成了所有数值的全排序。
我们也可以先读取一个小文件块大小(比如50M)的数值进行排序,这样我们就能得到n多个内部有序,外部无序的小文件块,学过算法的同学都知道有一种算法可以用于外部排序——对,那就是归并排序,因此我们可以使用归并排序对这n多个小文件块进行排序,这样也能使用两次I/O完成数值的全排序。
如果你理解了上面的东西,让我们再来做进一步思考:如果把时间变成分钟、秒级,应该如何做到呢?很显然在单机、硬件条件有限的情况下是绝无可能做到的,这也是单机在面临大数据问题的瓶颈所在(内存大小、I/O速度),这个时候集群分布式的优势就体现出来了。
1.3 集群分布式处理大数据的辩证思考
- 2000台机器真的比一台机器速度快吗?
- 如果考虑分发上传文件的时间呢?
- 如果考虑每天都有1T数据的产生呢?
- 如果增量了一年,最后一天计算数据呢?
让我们对上述问题进行逐一解答,首先2000台机器不一定比一台机器速度快,如果只有1T的数据需要处理,那么由于集群分布式需要先将文件分发上传到2000台机器中,这个过程消耗的网卡I/O(网络I/O比磁盘I/O速度还要慢)传输时间是非常多的,因此这种情况下并不能体现出集群分布式的优势。但是如果考虑每天都会有1T的数据产生,这些数据增量了一年,这个时候集群分布式在处理这些数据的计算时的长处就能充分发挥出来了。在处理增量数据时,集群分布式处理数据的时长并不会随着数据量的增长而有着明显的增长,但是单机在数据量逐渐增长的情况下处理数据所耗费的时间会越来越多。数据量越大,集群分布式的优势就会越明显。
1.4 结论
总而言之,从上述的分析我们可以得知,大数据技术关注的重心主要有下面几点:
- 分而治之
- 并行计算
- 计算向数据移动
- 数据本地化读取
2 Hadoop初识
2.1 Hadoop 之父 Doug Cutting
Doug Cutting是一位软件设计师,也是开源搜索技术的倡导者和创造者。他创建了Lucene,并与Mike Cafarella一起创建了Nutch,这两个都是开源搜索技术领域的项目,这些项目现在由Apache Software Foundation管理。Cutting和Cafarella也是Apache Hadoop的共同创始人。 -- 摘自维基百科
- Hadoop的发音是 [hædu:p]
- Cutting儿子对玩具小象的昵称
- Nutch
- Lucene
- Avro
- Hadoop
2.2 Hadoop的时间简史
- 《The Google File System 》 2003年
- 《MapReduce: Simplified Data Processing on Large Clusters》 2004年
- 《Bigtable: A Distributed Storage System for Structured Data》 2006年
- Hadoop由 Apache Software Foundation 于 2005 年秋天作为Lucene的子项目Nutch的一部分正式引入。
- 2006 年 3 月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目中。
- Cloudera公司在2008年开始提供基于Hadoop的软件和服务。
- 2016年10月hadoop-2.6.5
- 2017年12月hadoop-3.0.0
- hadoop.apache.org
2.3 Hadoop项目/生态
Hadoop项目包含了这些模块:
- Hadoop Common:给其他Hadoop模块提供支撑的基础功能类库。
- Hadoop Distributed File System (HDFS™):提供对应用程序数据的高吞吐量访问的分布式文件系统。
- Hadoop YARN:作业调度和集群资源管理框架。
- Hadoop MapReduce:基于YARN的大型数据集并行处理系统。
- Hadoop Ozone: Hadoop的对象存储。
Apache中其他与Hadoop相关的项目包括:
- Ambari™:一个基于Web的工具,用于配置,管理和监控Hadoop集群,其中包括对Hadoop HDFS,Hadoop MapReduce,Hive,HCatalog,HBase,ZooKeeper,Oozie,Pig和Sqoop的支持。
- Avro™:数据序列化系统。
- Cassandra™:可扩展的多主数据库,没有单点故障。
- Chukwa™:用于管理大型分布式系统的数据收集系统。
- HBase™:可扩展的分布式数据库,支持大型表的结构化数据存储。
- Hive™:提供数据汇总和即席查询的数据仓库基础设施。
- Mahout™: 可扩展的机器学习和数据挖掘库。
- Pig™:用于并行计算的高级数据流语言和执行框架。
- Spark™:用于Hadoop数据的快速通用计算引擎。Spark提供了一种简单而富有表现力的编程模型,该模型支持广泛的应用程序,包括ETL,机器学习,流处理和图形计算。
- Tez™:一个基于Hadoop YARN的通用数据流编程框架,该框架提供了强大而灵活的引擎来执行任意DAG任务,以处理批处理和交互用例的数据。Hadoop生态系统中的Hive™,Pig™和其他框架以及其他商业软件(例如ETL工具)都采用了Tez,以取代Hadoop™MapReduce作为基础执行引擎。
- ZooKeeper™:面向分布式应用程序的高性能协调服务。
2.4 大数据生态
Cloudera官网:https://www.cloudera.com/
Cloudera’s Distribution Including Apache Hadoop(CDH)是Apache Hadoop和相关项目中最完整的,经过测试的和最受欢迎的发行版。
- hadoop-2.6.0+cdh5.16.1
- hbase-1.2.0+cdh5.16.1
- hive-1.1.0+cdh5.16.1
- spark-1.6.0+cdh5.16.1