大数据是指其大小和复杂性没法经过现有经常使用的工具软件,以合理的成本,在可接受的时限内对其进行捕获、管理和处理的数据集。这些困难包括数据的收入、存储、搜索、共享、分析和可视化。大数据要知足三个基本特征(3V),数据量(volume)、数据多样性(variety)和高速(velocity)。数据量指大数据要处理的数据量通常达到TB甚至PB级别。数据多样性指处理的数据包括结构化数据、非结构化数据(视频、音频、网页)和半结构化数据(xml、html)。高速指大数据必须可以快速流入而且能获得快速处理。html
数据爆炸。伴随信息技术的应用,全球数据量呈几何级数增加。过去几年间的数据总量超过了人类历史上的数据总和。芯片、摄像头、各自传感器遍及世界各个角落,本来不能被感知的事物均可以被监测。软硬件技术的不断进步,也为处理大数据创造的条件。java
第一个方式是抓取或者爬取。例如搜索引擎就是这么作的:它把网上的全部的信息都下 载到它的数据中心,而后你一搜才能搜出来。
第二个方式是推送,有不少终端能够帮我收集数据。好比说小米手环,能够将你天天跑 步的数据,心跳的数据,睡眠的数据都上传到数据中内心面。node
通常会经过队列方式进行,由于数据量实在是太大了,数据必须通过处理才会有用。可系统处理不过来,只好排好队,慢慢处理。ios
存储要确保安全,不易丢失,高容错性。算法
存储的数据是原始数据,原始数据可能是杂乱无章的,有不少垃圾数据在里面,于是须要清洗和过滤,获得一些高质量的数据。对于高质量的数据,就能够进行分析,从而对数据进行分类,或者发现数据之间的相互关系,获得知识。数据库
使想要的信息容易被搜索到。挖掘信息之间的相互关系。安全
由于大数据的这些特色,针对其收集、传输、存储、处理分析和检索使用产生了许多开源框架。
|功能|框架|
|--|--|
|文件存储|Hadoop HDFS、Tachyon、KFS|
|离线计算|Hadoop MapReduce、Spark|
|流式、实时计算|Storm、Spark Streaming、S四、Heron|
|K-V、NOSQL数据库|HBase、Redis、MongoDB|
|资源管理|YARN、Mesos|
|日志收集|Flume、Scribe、Logstash、Kibana|
|消息系统|Kafka、StormMQ、ZeroMQ、RabbitMQ|
|查询分析|Hive、Impala、Pig、Presto、Phoenix、SparkSQL、Drill、Flink、Kylin、Druid|
|分布式协调服务|Zookeeper|
|集群管理与监控|Ambari、Ganglia、Nagios、Cloudera Manager|
|数据挖掘、机器学习|Mahout、Spark MLLib|
|数据同步|Sqoop|
|任务调度|Oozie|服务器
通常大数据平台的框架以下图
Hadoop HDFS和Hadoop MapReduce做为大数据存储和处理的开山鼻祖,大数据平台上都处于核心位置。下面介绍一下两个框架的基本原理。网络
HDFS全称Hadoop Distributed File System。HDFS是一个分布式文件系统,能够部署在一个服务器集群上。Java语言开发,能够部署在任何支撑java的机器上。
HDFS有几个基本概念NameNode、DataNode和block。
NameNode负责整个分布式文件系统的元数据管理,也就是文件路径名,数据block的ID以及存储位置等信息。还要记录一些事情,好比哪些节点是集群的一部分,某个block有几份副本等。
DataNode是实际存储文件数据的节点。DataNode会经过心跳和NameNode保持通讯,若是DataNode超时未发送心跳,NameNode就会认为这个DataNode已经失效,当即查找这个DataNode上存储的block有哪些,以及这些block还存储在哪些服务器上,随后通知这些服务器再复制一份block到其余服务器上,保证HDFS存储的block备份数符合用户设置的数目,即便再有服务器宕机,也不会丢失数据。
Block是HDFS中的存储单元,文件被写入HDFS时,会被切分红多个block块,默认的块大小是128MB,每一个数据块默认会有三个副本。
数据写入:首先将文件分红多个block,每一个block会被写入三个DataNode中,写入哪三个DataNode中是由NameNode指定的,写入完成,NameNode会记录这些信息。同一个文件中不一样的block可能会被写入彻底不一样的DataNode中。
数据读取:数据读取时按block读取。每个block时,会从NameNode获取信息,知道从哪一个DataNode中读取,通常是就近原则。全部该文件的block读取完成,构成完整的文件。
客户端和Datanode是同一个机器:距离为0 ,表示最近
客户端和Datanode是同一个机架的不一样机器 :距离为2 ,稍微远一点
客户端和Datanode位于同一个数据中心的不一样机架上 :距离为4,更远一点数据结构
Hadoop MapReduce是一个分布式计算框架,其中的运算均可以在多个机器上并行进行。使用者只须要完成运算自己的编码,不须要关心并行计算的底层细节。
MapReduce背后的思想很简单,就是把一些数据经过Map来归类,经过Reduce来把同一类的数据进行处理。Map和reduce的过程都是利用集群的计算能力并行执行的。计算模型的核心是Map和Reduce函数,两个函数由用户自行实现。
把原始大数据集切割成小数据集时,一般小数据集小于等于HDFS的一个block的大小,这样一个小数据集位于一个物理机上,便于本地计算。Map和reduce各自的启动任务数量能够由用户指定。
上图表示一个MapReduce统计单词出现次数的过程,原始数据分割为4个子文件,对每一个子文件按照用户的Map函数会产生<单词, 出现次数>的<k2,v2>形式的结果。而后把相同单词的<k2,v2>组合在一块儿构成<k2,List(v2)>的形式,做为Reduce函数的输入,相同的k2必定分发给相同的Reduce任务处理,例如单词lorem的全部计算都由第一个Reduce任务来完成。按照这个思想,即便要统计的文件数量上千万个,单词数量有几千个,可是经过MapReduce框架,只要集群机器数量够多,也是能够在可接受时间内计算完成的。