前言:
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。
安装Hadoop集群之前我们得先检验系统是否安装了如下的必备软件:
rpm -qa ssh rsync
如有未安装的请参考 http://crushlinux.blog.51cto.com/2663646/1274819 配置yum仓库
yum install rsync ssh
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
vi /home/hadoop/hadoop-0.21.0/conf/hdfs-site.xml
vi /home/hadoop/hadoop-0.21.0/conf/mapred-site.xml
基本配置已经配好了下面咱们把在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 排序测试