Hadoop 是什么?
Hadoop 就是一个分布式计算的解决方案。
Hadoop 是一种分析和处理大数据的软件平台,是 Appach 的一个用 Java 语言所实现的开源软件的加框,在大量计算机组成的集群当中实现了对于海量的数据进行的分布式计算。
Hadoop 的框架最核心的设计就是:HDFS 和 MapReduce;HDFS 为海量的数据提供了存储,则 MapReduce 为海量的数据提供了计算。 Hadoop 的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为 key-value,key-value 是基本数据单元。
HDFS 是一个分布式文件系统:传统文件系统的硬盘寻址慢,通过引入存放文件信息的服务器 Namenode 和实际存放数据的服务器 Datanode 进行串接,对数据系统进行分布式储存读取。
HDFS 的设计特点
- 大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个 G 甚至更小就没啥意思了。
- 文件分块存储,HDFS 会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得都。
- 流式数据访问,一次写入多次读写,这种模式跟传统文件不同,它不支持动态改变文件内容,而是要求让文件一次写入就不做变化,要变化也只能在文件末添加内容。
- 廉价硬件,HDFS 可以应用在普通 PC 机上,这种机制能够让给一些公司用几十台廉价的计算机就可以撑起一个大数据集群。
- 硬件故障,HDFS 认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。
大数据在 Hadoop 处理的流程可以参照下面简单的图来进行理解:数据是通过了 Hadoop 的集群处理后得到的结果。
HDFS 的关键元素
- Block:将一个文件进行分块,通常是64M,一块的数据块分布存储在集群机器中。如下图中的文件 data1 被分成 3 块,这 3 块以冗余镜像的方式分布在不同的机器中。
- NameNode:保存整个文件系统的目录信息、文件信息及分块信息,这是由唯一一台主机专门保存,当然这台主机如果出错,NameNode 就失效了。在 Hadoop2.x 版本开始支持 activity-standy 模式,即如果主 NameNode 失效,启动备用主机运行 NameNode;一个集群只能有一个 NameNode ,但是可以多个集群组成一个更大的集群,这时就有多个 NameNode,这时的 NameNode 有两种状态,一种叫 active 并且一个大集群只能有一个 NameNode 处于该状态,一种为 standby)
- DataNode:分布在廉价的计算机上,用于存储Block块文件。
MapReduce:Hadoop 为每一个 input split 创建一个 task 调用 Map 计算,在此 task 中依次处理此 split 中的一个个记录 (record),map 会将结果以 key-value 的形式输出,hadoop 负责按 key 值将 map 的输出整理后作为 Reduce 的输入,Reduce Task 的输出为整个 job 的输出,保存在 HDFS 上。
例: 我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。
通俗说 MapReduce 是一套从海量源数据提取分析元素最后返回结果集的编程模型,将文件分布式存储到硬盘是第一步,而从海量数据中提取分析我们需要的内容就是 MapReduce 做的事了。
MapReduce 的基本原理就是:将大的数据分析分成小块逐个分析,最后再将提取出来的数据汇总分析,最终获得我们想要的内容。当然怎么分块分析,怎么做 Reduce 操作非常复杂,Hadoop 已经提供了数据分析的实现,我们只需要编写简单的需求命令即可达成我们想要的数据。
Hadoop 的集群主要由 NameNode、DataNode、Secondary NameNode、JobTracker、TaskTracker 组成。如下图所示:
- NameNode 记录了文件是如何被拆分成 block 以及这些 block 都存储到了那些 DateNode 节点。
- NameNode 保存了文件系统运行的状态信息。
- DataNode 存储被拆分的 blocks。
- Secondary NameNode 帮助 NameNode 收集文件系统运行的状态信息。
- JobTracker 当有任务提交到 Hadoop 集群的时候负责 Job 的运行,负责调度多个 TaskTracker。
- TaskTracker 负责某一个 map 或者 reduce 任务。
Hadoop 能做什么?
Hadoop 擅长日志分析,facebook 就用 Hive 来进行日志分析,2009 年时 facebook 就有非编程人员的 30% 的人使用 HiveQL 进行数据分析;淘宝搜索中的自定义筛选也使用的 Hive;利用 Pig 还可以做高级的数据处理,包括 Twitter、LinkedIn 上用于发现您可能认识的人,可以实现类似 Amazon.com 的协同过滤的推荐效果。淘宝的商品推荐也是,在 Yahoo 40% 的 Hadoop 作业是用 Pig 运行的,包括垃圾邮件的识别和过滤,还有用户特征建模。
例子
设想一下这样的应用场景,我有一个 100M 的数据库备份的 sql 文件。我现在想在不导入到数据库的情况下直接用 grep 操作通过正则过滤出我想要的内容。例如:某个表中 含有相同关键字的记录那么有几种方式;一种是直接用 Linux 的命令 grep, 还有一种就是通过编程来读取文件,然后对每行数据进行正则匹配得到结果好了。现在是 100M 的数据库备份,上述两种方法都可以轻松应对。
那么如果是 1G , 1T 甚至 1PB 的数据呢 ,上面 2 种方法还能行得通吗?
答案是不能;毕竟单台服务器的性能总有其上限,那么对于这种 超大数据文件怎么得到我们想要的结果呢?
有种方法就是分布式计算, 分布式计算的核心就在于利用分布式算法 把运行在单台机器上的程序扩展到多台机器上并行运行。从而使数据处理能力成倍增加,但是这种分布式计算一般对编程人员要求很高,而且对服务器也有要求,导致了成本变得非常高。
Haddop 就是为了解决这个问题诞生的,Haddop 可以很轻易的把很多 linux 的廉价 PC 组成分布式结点,然后编程人员也不需要知道分布式算法之类,只需要根据 mapreduce 的规则定义好接口方法,剩下的就交给 Haddop。它会自动把相关的计算分布到各个结点上去,然后得出结果。
例如上述的例子:Hadoop 要做的事首先把 1PB 的数据文件导入到 HDFS 中,然后编程人员定义好 map 和 reduce,也就是把文件的行定义为 key,每行的内容定义为 value,然后进行正则匹配,匹配成功则把结果 通过 reduce 聚合起来返回。Hadoop 就会把这个程序分布到 N 个结点去并行的操作, 原本可能需要计算好几天,在有了足够多的结点之后就可以把时间缩小到几小时之内。
Hadoop 能为我做什么?
- 日志处理
- 用户细分特征建模
- 个性化智能推荐