前言: 

Hadoop简介


  Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。简单地说来,Hadoop是一个可以更容易开发和运行处理大规模数据的软件平台。Hadoop实现了一个分布式文件系统(HadoopDistributedFileSystem),简称HDFS。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(highthroughput)来访问应用程序的数据,适合那些有着超大数据集(largedataset)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streamingaccess)文件系统中的数据。


  谈到Hadoop就不得不提到Lucene和Nutch。首先,Lucene并不是一个应用程序,而是提供了一个纯Java的高性能全文索引引擎工具包,它可以方便的嵌入到各种实际应用中实现全文搜索/索引功能。Nutch是一个应用程序,是一个以Lucene为基础实现的搜索引擎应用,Lucene为Nutch提供了文本搜索和索引的API,Nutch不光有搜索的功能,还有数据抓取的功能。在nutch0.8.0版本之前,Hadoop还属于Nutch的一部分,而从nutch0.8.0开始,将其中实现的NDFS和MapReduce剥离出来成立一个新的开源项目,这就是Hadoop,而nutch0.8.0版本较之以前的Nutch在架构上有了根本性的变化,那就是完全构建在Hadoop的基础之上了。在Hadoop中实现了Google的GFS和MapReduce算法,使Hadoop成为了一个分布式的计算平台。其实,Hadoop并不仅仅是一个用于存储的分布式文件系统,而是设计用来在由通用计算设备组成的大型集群上执行分布式应用的框架。


Hadoop包含两个部分:


1、HDFS


Hadoop简介中的HDFS。HDFS即HadoopDistributedFileSystem(Hadoop分布式文件系统)HDFS具有高容错性,并且可以被部署在低价的硬件设备之上。HDFS很适合那些有大数据集的应用,并且提供了对数据读写的高吞吐率。HDFS是一个master/slave的结构,就通常的部署来说,在master上只运行一个Namenode,而在每一个slave上运行一个Datanode。HDFS支持传统的层次文件组织结构,同现有的一些文件系统在操作上很类似,比如你可以创建和删除一个文件,把一个文件从一个目录移到另一个目录,重命名等等操作。Namenode管理着整个分布式文件系统,对文件系统的操作(如建立、删除文件和文件夹)都是通过Namenode来控制。


  HDFS的结构图中可以看出,Namenode,Datanode,Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候,命令不是马上就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统层次中并且在Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Cliet便这些本地临时文件夹中的数据块写入指定的数据节点。HDFS采取了副本策略,其目的是为了提高系统的可靠性,可用性。HDFS的副本放置策略是三个副本,一个放在本节点上,一个放在同一机架中的另一个节点上,还有一个副本放在另一个不同的机架中的一个节点上。当前版本的hadoop0.12.0中还没有实现,但是正在进行中,相信不久就可以出来了。


2、MapReduce的实现


Hadoop简介中MapReduce的实现。MapReduce是Google的一项重要技术,它是一个编程模型,用以进行大数据量的计算。对于大数据量的计算,通常采用的处理手法就是并行计算。至少现阶段而言,对许多开发人员来说,并行计算还是一个比较遥远的东西。MapReduce就是一种简化并行计算的编程模型,它让那些没有多少并行计算经验的开发人员也可以开发并行应用。MapReduce的名字源于这个模型中的两项核心操作:Map和Reduce。也许熟悉FunctionalProgramming(函数式编程)的人见到这两个词会倍感亲切。简单的说来,Map是把一组数据一对一的映射为另外的一组数据,其映射的规则由一个函数来指定,比如对[1,2,3,4]进行乘2的映射就变成了[2,4,6,8]。Reduce是对一组数据进行归约,这个归约的规则由一个函数指定,比如对[1,2,3,4]进行求和的归约得到结果是10,而对它进行求积的归约结果是24。

CentoS5.6 X64下架设 Hadoop完全分布式文件系统_第1张图片

安装Hadoop集群之前我们得先检验系统是否安装了如下的必备软件:

rpm -qa ssh rsync 

如有未安装的请参考 http://crushlinux.blog.51cto.com/2663646/1274819 配置yum仓库

yum install rsync ssh


CentoS5.6 X64下架设 Hadoop完全分布式文件系统_第2张图片

1、更改本机主机名:master与3个slave都需要更改 

master:

vi /etc/hostname 

10.0.0.10   master 

slave1 

vi /etc/hostname 

10.0.0.11   slave1 

slave2

vi /etc/hostname 

10.0.0.12   slave2 

slave3

vi /etc/hostname 

10.0.0.13   slave3 

2、更改hosts信息:可以让master与slave之间互相解析 

master 

vi /etc/hosts 

10.0.0.10   master 

10.0.0.11   slave1 

10.0.0.12   slave2 

10.0.0.13   slave3 

每个slave上都要配置master的信息 

vi /etc/hosts 

10.0.0.10   master 


3、新建hadoop用户 

Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同的用户名的帐

户,所以需要每台机器创建一个同名的用户。 

在这4台机器上建hadoop用户,密码:hadoop,用户主目录/home/hadoop/。 

useradd hadoop 

passwd hadoop 


4、SSH设置 

Hadoop需要master与3个slave之间通过ssh无密钥方式互相访问

master:

su - hadoop 

mkdir .ssh 

chmod 755 .ssh/ 

ls -la 

cd .ssh/ 

ssh-keygen -t rsa 

cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys 

chmod 600 authorized_keys 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.11:/home/hadoop/.ssh/ 


slave1 

mkdir .ssh 

chmod 755 .ssh/ 

cd .ssh/ 

chmod 600 authorized_keys 

ssh-keygen -t rsa 

cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/ 

master 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.12:/home/hadoop/.ssh/ 

slave2 

mkdir .ssh 

chmod 755 .ssh/ 

cd .ssh/ 

chmod 600 authorized_keys 

ssh-keygen -t rsa 

cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/   


master 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.13:/home/hadoop/.ssh/ 

slave3 

mkdir .ssh 

chmod 755 .ssh/ 

cd .ssh/ 

chmod 600 authorized_keys 

ssh-keygen -t rsa 

cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys 

scp -r /home/hadoop/.ssh/authorized_keys 10.0.0.10:/home/hadoop/.ssh/   


5、jdk 的安装及配置 

用root操作 

/usr/java/jdk1.6.0_21/lib/ 

# chmod +x  jdk-6u24-linux-x64.bin (以64位操作系统为例) 

#./jdk-6u24-linux-x64.bin 

会出现一个jdk-6u24-linux-x64.rpm包 

rpm -ivh jdk-6u24-linux-x64.rpm 

jdk 的安装到这儿就结束了。 


下面咱们配置java 跟hadoop的环境变量 

vi /etc/profile     到最下面添加如下内容: 

export JAVA_HOME=/usr/java/jdk1.6.0_21   

export HADOOP_HOME=/home/hadoop/hadoop-0.21.0 

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 

export PATH=$HADOOP_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH 


6、安装hadoop (注:都用hadoop用户操作不然后面启动时会有些报错) 

将hadoop-0.20.2.tar文件下载到 /home/hadoop 目录下 

tar –zxvf hadoop-0.20.2.tar.gz 

cd hadoop-0.20.2/conf

vi hadoop-env.sh 

export JAVA_HOME=/usr/java/jdk1.6.0_21   将注释去掉并更改JAVA_HOME的路径 


vi /home/hadoop/hadoop-0.21.0/conf/masters 

10.0.0.10   maste 

vi /home/hadoop/hadoop-0.21.0/conf/slaves 

10.0.0.11   slave1 

10.0.0.12   slave2 

10.0.0.13   slave3 


vi /home/hadoop/hadoop-0.21.0/conf/core-site.xml 

 

 

  fs.default.name 

  hdfs://10.0.0.10:9000 

 

 


vi /home/hadoop/hadoop-0.21.0/conf/hdfs-site.xml 

 

 

  dfs.replication 

  1 

 

 

  dfs.name.dir 

  /home/hadoop/hadoop/namenode 

 

 

  dfs.data.dir 

  /home/hadoop/hadoop/data 

 

 


vi /home/hadoop/hadoop-0.21.0/conf/mapred-site.xml 

 

 

  mapred.job.tracker 

  10.0.0.10:9001 

 

基本配置已经配好了下面咱们把在master上配置好的hadoop文件发送给每个slave 

scp –r /home/hadoop/hadoop-0.20.2 [email protected]:/home/hadoop 

scp –r /home/hadoop/hadoop-0.20.2 [email protected]:/home/hadoop 

scp –r /home/hadoop/hadoop-0.20.2 [email protected]:/home/hadoop 

传完之后咱们需要执行一下格式化的操作 

cd /home/hadoop/hadoop-0.20.2 

./bin/hadoop namedode –format 


7、启动hadoop 

启动前建议关闭iptables 防火墙及selinux安全组件等功能

service iptables stop

setenforce 0 

bin下有很多脚本文件是来控制的hadoop的 

咱们可以用 ./bin/start-all.sh来启动hadoop 


8、hadoop的测试 

我们用如下命令验证一下是否启动成功: 

./bin/hadoop dfsadmin –report 

如果没有错误提示或者出现文件列表,那么恭喜你,Hadoop成功启动了,另外,我们可以

通过访问http://10.0.0.10:50070 来查看hdfs的状态,访问http://10.0.0.10:50030 来查看

map/reduce的状态。 

./bin/hadoop dfs –put input /input将input 放到hadoop根目录下input 目录 

./bin/hadoop jar hadoop-*examples.jar wordcount /input /output 数单词测试 

./bin/hadoop jar hadoop*examples.jar randomwriter /rand 产生数据 

./bin/hadoop jar hadoop*examples.jar sort /rand /rand_sort 排序测试