Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

        Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

        Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。

hadoop主要有以下几个优点:

高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。

高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。

高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。 Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。

hadoop的数据流程图:

        Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS(对于本文)的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

Namenode #

        它管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace p_w_picpath)和操作日志文件(edit log),这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。

Secondary NameNode

        它是一个用来监控HDFS状态的辅助后台程序。就想NameNode一样,每个集群都有一个Secondary NameNode,并且部署在一个单独的服务器上。Secondary NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的 快照。由于NameNode是单点的,通过Secondary NameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。

Datanode

        它是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。 集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作。

JobTracker

        JobTracker后台程序用来连接应用程序与Hadoop。用户代码提交到集群以后,由JobTracker决定哪个文件将被处理,并且为 不同的task分配节点。同时,它还监控所有的task,一旦某个task失败了,JobTracker就会自动重新开启这个task,在大多数情况下这 个task会被放在不用的节点上。每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上。

TaskTracker

        它与负责存储数据的DataNode相结合,其处理结构上也遵循主/从架构。JobTracker位于主节点,统领 MapReduce工作;而TaskTrackers位于从节点,独立管理各自的task。每个TaskTracker负责独立执行具体的task,而 JobTracker负责分配task。虽然每个从节点仅有一个唯一的一个TaskTracker,但是每个TaskTracker可以产生多个java 虚拟机(JVM),用于并行处理多个map以及reduce任务。TaskTracker的一个重要职责就是与JobTracker交互。如果 JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他 节点处理。

下面是hadoop的一些配置:

master端: 172.25.254.1

slave端: 172.25.254.2

slave端: 172.25.254.3

slave端: 172.25.254.4

在master端添加hadoop用户

useradd -u 900 hadoopecho westos |passwd --stdin hadoop

安装jdk:

sh jdk-6u32-linux-x64.binmv jdk1.6.0_32/ /home/hadoop/java   su - hadoop #接下来都是用hadoop用进行操作vim .bash_profile     export JAVA_HOME=/home/hadoop/java    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib    export PATH=$PATH:$HOME/bin:$JAVA_HOME/binsource .bash_profile

配置hadoop单节点部署:

tar zxf hadoop-1.1.2.tar.gzln -s hadoop-1.1.2 hadoopcd hadoopvim conf/hadoop-env.sh      export JAVA_HOME=/home/hadoop/java

创建输入文件:

mkdir inputcp conf/*.xml input/

hadoop伪分布式部署

运行官方给的示例程序:

bin/hadoop jar hadoop-examples-1.1.2.jar grep input output 'dfs[a-z.]+'

查看输出文件:

[hadoop@server1 hadoop]$ cat output/part-000001   dfsadmin

保证master到节点实现无密码登陆:

ssh-keygenssh-copy-id localhost #分布式部署的情况下要在slave端做,跟的是master的ip而不是localhost

配置HDFS master(即namenode)的地址和端口号:

vim conf/core-site.xml 
    
            
fs.default.name
                    
hdfs://172.25.254.1:9000
 #指定 namenode                            

配置的是JobTracker的地址和端口:

vim conf/mapred-site.xml
    
            
mapred.job.tracker
                    
172.25.254.1:9001
 #指定 jobtracker                            

 修改Hadoop中HDFS的配置,配置的备份方式

vim conf/hdfs-site.xml
 
            
dfs.replication
                    
1
    #指定文件保存的副本数                            

格式化一个新的分布式文件系统:

bin/hadoop namenode -format

启动hadoop进程:

bin/start-dfs.shbin/start-mapred.sh

通过jps命令可以查看到hadoop的进程:

我们还可以通过网络借口浏览 NameNode 和 JobTracker ,它们的地址默认为:

NameNode – http://172.25.254.1:50070/

JobTracker – http://172.25.254.1:50030/

将输入文件考入分布式文件系统:

bin/hadoop fs -put input test

运行官方给的示例程序:

bin/hadoop jar hadoop-examples-1.1.2.jar wordcount test output

查看输出文件:

bin/hadoop fs -cat output/*

分布式部署:

master端的配置于伪分布式的部署基本相同只是添加了master和slave的信息

vim conf/masters    172.25.254.1vim conf/slaves    172.25.254.2    172.25.254.3

如果是接着为分布式做的要先停止haoop的进程

bin/stop-all.sh

然后添加上面的master和slave信息重新格式化分布式系统

bin/hadoop namenode -format

在slave端要安装jdk,有与master端相同的hadoop用户,uid等保持一致,hadoop的数据配置路径也要与master端相同

之后在master端开启hadoop进程

bin/start-dfs.shbin/start-mapred.sh

此次我们通过jps命令可以看到在master端开启了NameNode,SecondaryNameNode和JobTracker三个进程,而DataNode和TaskTracker则是在slave端开启了。

hadoop在线添加节点:

新添加节点与其他的slave端一样要安装jdk,有与master端相同的hadoop用户,uid等保持一致,hadoop的数据配置路径也要与master端相同 然后启动以下两个服务

bin/hadoop-daemon.sh start datanodebin/hadoop-daemon.sh start tasktracker

然后在master端加入新节点的ip

vim conf/slaves  172.25.254.2  172.25.254.3  172.25.254.4

hadoop在线删除节点

在master上:

vim conf/mapred-site.xml   
      
dfs.hosts.exclude
      
/home/hadoop/hadoop/conf/datanode-excludes
      
vim /home/hadoop/hadoop/conf/datanode-excludes #添加要删除的节点ip   172.25.254.3

在master上刷新节点:

bin/hadoop dfsadmin -refreshNodes

你可以通过以下命令查看 datanode 状态

bin/hadoop dfsadmin -report

此时可以看到新加的server4节点以及将要移除的server3节点正在做数据转移

当server3节点状态为Decommissioned时就可以移除了