Hadoop分布式文件系统(HDFS)是一种分布式文件系统,设计用于在商品硬件上运行。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的差异很大。HDFS具有高度容错能力,旨在部署在低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。
HDFS是主/从架构。一个HDFS集群保护一个NameNode,一个主服务器,还有多个DataNode。NameNode负责文件系统命名空间操作,如打开,关闭和重命名文件,目录。还维护块到DataNode的映射。DataNode通常是一个节点一个,用来管理他们运行的节点的存储,DataNode还负责文件系统客户端的读写请求,块的创建删除。大致流程如下:
每个文件在写入都会存储为一系列的块,而且块还会被复制以实现容错(其实elasticsearch也差不多,数据被分词器拆分后还会做分片,1个主分配,4个副本分片来容错)。namenode还会定时收集DataNode发来的Heartbeat和Blockreport。收到Heartbeat表示该DataNode运行正常,blockreport包含该DataNode所有块的列表。
当有读取请求时,HDFS集群会尝试取离client最近副本来满足请求。数据块可能损坏,网络传输可能故障,为了保证文件数据完整性,HDFS会在客户段创建文件时,对文件拆分的每个块进行校验,并把校验存到隐藏文件中(我也不清楚存在哪),当检索内容时,会去校验从DataNode传来的数据块是否正确,如果不是,就会去从另一个副本去数据块。
同时元数据FsImage和EditLog也有多个副本以支持容错,NameNode的任何更新都要使多个副本同时更新,当NameNode重启时也会选择最新的FsImage和EditLog使用。(hadoop2.0以后启用了两个NameNode做热备还有共享目录,避免了NameNode的单点问题和元数据损坏照成的HDFS集群不可用问题)
hadoop非常适合大集群部署的。当然我没那么多机器,只能用docker 玩一玩。
首先下载镜像,hadoop2.7版本:
docker pull sequenceiq/hadoop-docker:2.7.0
然后开始run:
docker run -it sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -bash
很简单,hadoop就搭建好了,可以完了。
运行一个map reduce例子:
cd $HADOOP_PREFIX
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep input output 'dfs[a-z.]+'
执行完成。
然后查看输出:
bin/hdfs dfs -cat output/*
输出bin/hdfs dfsadmin查看HDFS的基本信息,可以看到目前有一个datanodes存活,因为是单机部署。
输入exit关闭容器
换成守护进程启动,并且暴露web端口
docker run -d -p 50070:50070 sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh
然后在浏览器输入http://localhost:50070
结果容器启动没多久就挂了
查看bootstrap.sh文件发现有坑
要加上参数 -d才能hold住容器,再来一次:
docker run -d -p 50070:50070 --name hadoop sequenceiq/hadoop-docker:2.7.0 /etc/bootstrap.sh -d
web ui上能看到很多信息,还可以浏览HDFS文件系统
OK,后面继续说map reduce