hadoop原理浅析及安装
文件写入:
- Client向NameNode发起文件写入的请求。
- NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息。
- Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中。
文件读取:
- Client向NameNode发起文件读取的请求。
- NameNode返回文件存储的DataNode的信息。
- Client读取文件信息。
文件Block复制:
- NameNode发现部分文件的Block不符合最小复制数或者部分DataNode失效。
- 通知DataNode相互复制Block。
- DataNode开始直接相互复制。
HDFS的几个设计特点:
- Block的放置:默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定 DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。
- 心跳检测DataNode的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
- 数据复制(场景为DataNode失败、需要平衡DataNode的存储利用率和需要平衡DataNode数据交互压力等情况):这里先说一下,使用HDFS的balancer命令,可以配置一个Threshold来平衡每一个DataNode磁盘利用率。例如设置了Threshold为 10%,那么执行balancer命令的时候,首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值Threshold以上,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。
- 数据交验:采用CRC32作数据交验。在文件Block写入的时候除了写入数据还会写入交验信息,在读取的时候需要交验后再读入。
- NameNode是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。
- 数据管道性的写入:当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的NataNode都成功写入,客户端才会继续开始写下一个 Block。
- 安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
[root@hadoop5~]#cat/etc/hosts
#Donotremovethefollowingline,orvariousprograms
#thatrequirenetworkfunctionalitywillfail.
127.0.0.1localhost.localdomainlocalhost
::1localhost6.localdomain6localhost6
192.168.0.20 hadoop5.diarc.com.cn hadoop5NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hadoop5.diarc.com.cn
GATEWAY=192.168.0.1
[root@hadoop5~]#
为了方便,关闭防火墙:(5台服务器都设置)[root@hadoop5~]#chkconfigiptablesoff
[root@hadoop5~]#./jdk-6u19-linux-i586.bin
[root@hadoop5~]#rm-rfjdk-6u19-linux-i586.bin
[root@hadoop5 ~]# cd /home/hadoop/exportJAVA_HOME=/usr/local/jdk1.6.0_19
exportCLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATHexportPATH=$PATH:$HADOOP_HOME/bin
<?xmlversion="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><property>
<name>fs.default.name</name>
<value>hdfs://192.168.0.20:54310/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp/</value>
</property>
</configuration>[root@hadoop5conf]#echo"exportJAVA_HOME=/usr/local/jdk1.6.0_19">>hadoop-env.sh
===========================================================================<?xmlversion="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
===========================================================================<?xmlversion="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><property>
<name>mapred.job.tracker</name>
<value>hdfs://192.168.0.20:54311/</value>
</property>[root@hadoop5conf]#
===========================================================================
[root@hadoop5conf]#catmasters
192.168.0.20
[root@hadoop5conf]#catslaves
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.18
[root@hadoop5conf]#
==========================================================================ssh-keygen -t rsa
。执行此命令的时候,看到提示只需要回车。然后就会在/root/.ssh/
下面产生id_rsa.pub
的证书文件,通过scp将Master机器上的这个文件拷贝到Slave上(记得修改名称),例如:scp root@masterIP:/root/.ssh/id_rsa.pub /root/.ssh/46_rsa.pub
,然后执行cat /root/.ssh/46_rsa.pub >>/root/.ssh/authorized_keys
,建立authorized_keys
文件即可,可以打开这个文件看看,也就是rsa的公钥作为key,user@IP作为value。此时可以试验一下,从master ssh到slave已经不需要密码了。由slave反向建立也是同样。为什么要反向呢?其实如果一直都是Master启动和关闭的话那么没有必要建立反向,只是如果想在Slave也可以关闭Hadoop就需要建立反向。[root@hadoop5conf]#
我们从master向slave依次登录[root@hadoop1hadoop]#[email protected]:/home/hadoop/hadoop-0.20.2.tar.gz/home/hadoop/
[root@hadoop1 hadoop]# tar zxvf hadoop-0.20.2.tar.gz[root@hadoop5hadoop]#cd/home/hadoop/hadoop-0.20.2/bin/
[root@hadoop5bin]#./start-all.sh