有很多人想学大数据,但不知道从何下手。掌握这几点入门大数据。
分治思想
分治思想是学习大数据的必备思想。思考下面几个问题,体会一下什么是分治思想。
1、如何存储一万个元素(数字或单词)?
可以用array、hash、table
2、如何查找某一个元素?最简单的遍历方式复杂度是多少?
如果元素是数组存的,复杂度是logN太高了。
3、如果我期望复杂度是O(4)呢?
最多遍历4次。这怎么可能!
解决方法:把数据存到n个链表中。假设有10000个元素,把他们存到2500个链表中。在数据极尽分散的情况下,每个链上大概有4个元素。不考虑数据倾斜的问题,查找某一个元素的复杂度就是O(4)。
如何把10000个元素存到2500个链表中?假设每个值都不一样,拿到每个值的hashCode,用hashCode对2500取模,取模相同的放到一个链中。这本质上就是用的分治思想,把数据放到多个链里,提高查询效率。
在大数据领域,有很多技术都是采用分治思想:Redis集群、ElasticSearch、Hbase、Hadoop等。
再思考一个单机处理大数据的问题
需求:有一个非常大的文本文件,里面有很多很多的行,只有两行一样,他们出现在未知的位置,需要查找他们。
要求:单机,而且可用的内存很少,无法将文件全部加载到内存中。
循环遍历:先把大文件的第一行放入内存,再读剩下的行,找有没有和它一样的。这样一个一个的往下找。
分治思想:一行一行地读取这个大文件,计算每行的hashCode跟2000取模,模相同的放到一个文件中。经过一遍遍历之后,这个大文件就被分成了2000个小文件。我可以确定的是,相同的行一定被分到同一个文件里了。因为相同的数据的hashCode一定相同,模就一定相同,相同的行就一定会落到某一个文件里。最后挨个遍历小文件就能找到相同的行了。这样作最多要遍历两次。
已经为大家精心准备了大数据的系统学习资料,从Linux-Hadoop-spark-......,需要的小伙伴可以点击进入
假设Io速度是500MB每秒,1T文件读取一遍需要约30分钟。循环遍历需要N次io时间。分治思想可以使时间变为2次io。所以分治思想对解决大数据问题很有用。下面再举一个分治思想的例子:
还是一个很大的文件,里面每一行存的都是数字,现在要用分治思想对数字排序。
解决方法:先把这个大文件拆成一个个的小文件,拆成小文件的方法有很多,比如x>=0&&x<100放到一个小文件,依次类推。这样拆出来的小文件和小文件之间是有序的,而小文件内部是无序的。接下来只需要把小文件加载到内存中排一下序就行了。
上面的三个案例:
1、使用O(4)的复杂度查找某个元素。
2、用很小的内存,查找重复的行。
3、排序。
这三个案例都是使用的分治思想。只要把分治思想把握到位,拿捏好了,学习大数据是轻而易举的。大数据几乎99%的技术采用的是分治思想。
并行计算
继续上面查找重复行的问题,使用并行计算,把时间缩短到分钟、秒级别。
假设我们用2000台机器,每台存储1/2000,约500MB的数据。每一行取hashCode模上2000,会拆分成2000个小文件。把每台服务器相同的小文件汇总到一起,读取到内存进行判断。
假设磁盘io速度是500M/s,拆分500M的文件需要1s,因为可以并行计算,拆分文件的过程只需要1s。
假设网卡速度是100M/s,并行计算只看一台就可以了,500M的文件需要4s,汇总的时间是4s,我们可以夸大到1分钟。
最后再内存中判定的速度很快,假设是1s。
整体需要的时间就是1s+1min+1s,所以使用多态服务器并行计算是可以达到分钟级别的。
计算向数据移动
再并行计算的例子中。有2000台服务器,每台有500M数据。还有2000台是存放计算程序的服务器。我是把数据拉到程序服务器上,还是把程序发到数据服务器上。
把程序拉到数据服务器上,因为程序只有几KB大小,而数据一般都很大,这样做可以减少网络io。
数据本地化读取
数据本地化也是为了减少网络io,本地读取数据一定是比网络传输快。
分治思想、并行计算、计算向数据移动、数据本地化读取,这些思想是学习大数据的重点,掌这些思想学习大数据并不难。
Hadoop
hadoop之父是Doug Cutting。hadoop是象的意思。是Doug Cutting的儿子的一个玩具,因玩具而得名。
Hadoop时间简史
2003年,google的GFS发布了一篇论文《The Google File System》
2004年,google发布《MapReduce:Simplified Data Processing on Large Clusters》
2006年,《Bigtable:A Distributed Storage System for Structured Data》
Hadoop的开发者基于上面3篇论文,研究出了HDFS、MapReduce、HBase。
2008年,Cloudera公司开始提供基于Hadoop的软件和服务,开发了CDH集成了HDFS、MapReduce、yarn、Spark等。
2016年10月hadoop-2.6.5
2017年12月hadoop-3.0.0
Hadoop项目/生态
hadoop项目中集成了很多模块:
与hadoop相关的apache项目:
- Ambari
- Avro
- Cassandra
- Chukwa
- HBase
- Hive
- Mahout
- Pig
- Spark
- Tez
- ZooKeeper
大数据生态
Sqoop:可以把关系型数据库中的数据导入HDFS系统中。
Flume,Kafka:Flume数据采集,Kafka队列,Flume采集的数据可以到Kafka或者HDFS。
HDFS、Kudu、HBase、Object Store:数据存储
YARN:资源调度
Spark、Hive、MapReduce:分布式计算框架。
大数据生态归根结底是两类技术:分布式存、分布式计算。
存储模型
把1PB数据存到一台服务器上肯定不行,就像把大象(hadoop)装冰箱,哪有那么大的冰箱呀。
所以要把大文件放到N台服务器上,首先要把文件拆分成N块,放到对应的服务器中。还要有一个管理员,记录这个文件被存到了哪些服务器上。
HDFS是一个主从架构,主是Namenode,从是Datanode。Namenode存的是元数据,就是集群中有哪些文件,文件的属主是谁、文件位置在哪。
客户端读数据,先找Namenode拿到文件位置,在找对应的Datanode读数据。
强烈推荐阅读下列文章
一篇文章告诉你优酷背后的大数据秘密!【大数据开发实战技术】戳我阅读
最全最新的大数据系统交流路径!!戳我阅读