简介
Hadoop是一个由Apache基金会所开发的开源的分布式系统基础架构。 Hadoop以一种可靠、高效、可伸缩的方式实现对大量数据的处理,可以到PB级的数据。Hadoop自身就带有用Java语言编写的框架,可以高效的运行在linux下,当然也可以用其他语言例如c++来编写运行在其上的程序。Hadoop主要是由HDFS和MapReduce组成,其中HDFS全称是hadoop Distributed File System,是一个分布式的文件系统。MapReduce,是一个并行计算框架。从0.21版本后,Hadoop将HDFS和MapReduce分离开形成独立的项目,原有的hadoop核心功能改称为Hadoop Common。
Hadoop之父是Doug Cutting,Hadoop这个名字来源于他家小孩给一个棕黄色的大象玩具起的名字。这位高人是Lucene、Nutch 、Hadoop等多个项目的发起人。
Hadoop很多技术思想是来源于Google的,只是它是开源的实现,HDFS和google对应的是Google File System,MapReduce也是一样。这些都是Google通过大量实践总结出来的技术。
Hadoop之所以这么火主要是因为HDFS可以部署在PC上,而且设计之初就认为硬件是会出问题的,所以采用了将大文件分为存储块,在不同的计算机上分布存储文件块的方式,这样在读取的时候就可以并行读取多文件块,处理自然就很快,特别是处理大文件就更有优势了;而MapReduce又提供了高效读取和分析内容的可编程方式。
HDFS
以上只是一个单机版的部署,在实际工作中,应用环境多数时候是分布式的部署在n台计算机上。这个时候我们需要明白hadoop的几个概念:
- Block:将一个文件进行分块,通常是64M。
- NameNode:用来保存整个文件系统的目录、文件及分块等关键信息,hadoop刚发布的时候只有一个NameNode,这时候一旦部署NameNode的这台主机有问题,NameNode就失效了,不太可靠。Hadoop2.0以后,就解决了这个问题,通过Activity-Standy模式,一个主NameNode工作,另外一个NameNode维护数据备用,一旦一个坏了另一个可以随时顶上。
- DataNode:分布在所有部署hadoop的计算机上,用来专门存储Block块文件。
这个图一目了然,NameNode、DataNode、Block都是什么含义,他们之间的关系都很清楚。
MapReduce
MapReduce的基本设计思想其实和HDFS的设计思想很类似,将大规模的数据分析划分为成小规模的分析,然后再将这些小规模的分析进行再次的汇总分析,最终获得我们想要的分析结果。这样它就和HDFS很契合,可以对照HDFS先做Block级别的分析,再做DataNode级别的分析,最后在完成整个的分析工作。我们可以简单的这样理解吧,实际的实现上要复杂的多,这张图可以揭示一个基本的MapReduce的工作流程。
1.把输入文件按照一定的输入格式先进行分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片的大小与数据块的大小是相同的。如果数据块的大小是默认值64MB,输入文件有两个的话,其中一个是32MB,另外一个是72MB。这时小于默认值的文件是一个输入片,大于默认值的文件会分为两个数据块,那么就会是两个输入片,保持和数据块的一致,一共产生三个输入片。每个输入片由一个Mapper进程处理。如图上的两个节点任何一个都是有三个输入片,会由三个Mapper进程处理。
2.对输入片中的文件内容,按照设定的规则解析成键值对。默认规则是把每一行内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的内容。
3.调用Mapper类中的map方法。输入片中解析出来的每一个键值对都会调用一次map方法。每一次调用map方法会输出零个或者多个键值对。
4.按照设定的规则对map输出的键值对进行分区。比较是基于键进行的。比如我们的键表示年度(如2016、2015等等),那么就可以按照年度进行分区,年度相同的键值对划分到一个分区中,默认的话只有一个区。分区的数量就是Reducer任务运行的数量。
5.对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<20161011,3129.00>、<201312,9312.4>、<201501,1000.00>,键和值分别是整数。那么排序后的结果是<201312,9312.4>、<20161011,3129.00>、<201501,1000.00>。如果不进行reduce处理也可以直接输出。
6.对数据进行reduce处理。键相等的键值对会调用一次reduce方法。处理之后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要编程处理。
安装
以Ubuntu,root权限下为例,需要安装SSH服务器,如果系统之前没有安装的话可以先装一下:
1 | $ sudo apt-get install openssh-server |
Hadoop运行在java虚拟机上,需要安装java环境。
1 | $ sudo apt-get install openjdk-7-jdk |
下载hadoop,解压。
1 | $ wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz |
配置
- .bashrc
打开.bashrc文件,在文件末尾追加下面hadoop环境变量配置内容:
用下面的命令来让它们生效:
1
$ source ~/.bashrc
- hadoop-env.sh
通过一下命令找到该文件
1 | $ cd /root/hadoop-2.7.3/etc/hadoop |
修改一下JAVA_HOME的值: export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
验证
如果一切正常的话,单机模式就算安装成功了,我们可以通过hadoop的一个字符统计示例来验证一下,假设我们需要进行字数统计的目录是test,你可以用cp命令把你想统计的文件都放到test目录下,然后统计结果输出到目录test-count(当然这个名字也是你自己随便起的)中:
1 | $ /root/hadoop-2.7.3/bin/hadoop jar |
多机模式有机会在探讨,大家可以自己试试。