研究hadoop的文章有很多,我想自己写一下,主要是理解学习hadoop,方便自己进行优化管理
主要参考是hadoop官方:http://hadoop.apache.org/docs/current/
慢慢来吧,先copy一张hadoop官方的hdfs架构图
hdfs 全称 Hadoop Distributed File System
Metadata ops(Orbeon PresentationServer) 元数据描述服务
Block ops 块描述服务
Rack 机架
Replication 块复制
Namenode Datanode我就不解释了
大家学习hadoop流程应该和我差不多,先是单机伪分布,然后有条件的话,搭个多机分布,带机架的好像很少
这张图里面有两个机架左右都有7个datanode,client写的时候是对两个机架同时写,机架之间是相互备份的,可以判断机架之间就类似双机备份的那种
namenode 对datanode进行管理
看一下第二张图,画的是datanode命名规则,这个我有体会,
我有三台datanode,后来有两台不用了,直接单机伪分布,然后进入到了safe mode :((hadoop fsck / 命令看)
有currupt块,提示的就是 /user/blacklaw/input/part-0, ......
网上介绍用 hadoop fsck / -move hadoop fsck / -delete把currupt的块删掉,感觉都不好使,反正只是实验,我直接hadoop namenode -format了
现在做个小实验,帮助大家理解
echo "aaaaa" > a.txt
hadoop fs -put a.txt input
hadoop fs -ls input
ls的时候完全正常,
然后跑到你设置的dfs文件夹,把dfs/data改成 data。bak
echo "bbbb" > b.txt
hadoop fs -put b.txt input
hadoop fs -ls input 直接给你报错了,说你有个datanode挂了,
可能还不直观,你用eclipse跑一下wordcount,直接告诉你Could not obtain block blk_-6775194498480386094_1278 from any node
而这个block就在改掉的data文件夹下面,现在datanode完全挂掉了
但是我的hadoop fs其实还可以用,不信可以试一下
hadoop fs -mkdir tmpdir 建目录
hadoop fs -ls tmpdir 列举
hadoop fs -touchz tmpdir/tmpfile 新建一个文件
hadoop fs -rmr tmpdir 删除目录
都可以用,大家一定很奇怪,datanode不是挂了吗,这么还是可以用咧,这里要讲一下hadoop的优化策略,在尽可能少的情况下读写datanode
实际上这些操作通过namenode都可以完成,并没有对datanode读写,touchz其实也只是在namenode上建了一个记录,也没有对datanode读写
如果用hadoop fs -put tmpfile tmpdir ,就会报错了
再做一个实验,把dfs/name/fsimage 改成 fsimage.bak
hdoop fs -ls 一下,没有问题
stop-all 一下,
再start-all jps看一下没有了namenode这项任务
cat fsimage ,可以看到目录结构,namenode储存的目录结构就在fsimage映像文件里,一般都是在内存里操作,需要的时候才对fsimage进行交换
可见hadoop优化的还是比较多的