Hadoop从入门到进阶之HDFS核心概念及集群搭建(一)

导读:本篇文章讲解 Hadoop从入门到进阶之HDFS核心概念及集群搭建(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概述:Hadoop自带一个称为HDFS的分布式文件系统,即 Hadoop Distributed Filesystem。在非正式文档或旧文档以及配置文件中,有时也简称为DFS,它们是一回事儿。HDFS是 Hadoop的旗舰级文件系统,也是本章的重点,但实际上Hadoop是一个综合性的文件系统抽象,因此接下来我们将了解将 Hadoop与其他存储系统集成的途径,例如本地文件系统和 Amazon S3系统。

1、HDFS的设计

1.1、设计目标

1)存储非常大的文件:这里非常大指的是几百M、G、或者TB级别。实际应用中已有很多集群存储的数据达到PB级别。根据Hadoop官网,Yahoo!的Hadoop集群约有10万颗CPU,运行在4万个机器节点上。
2)采用流式的数据访问方式: HDFS基于这样的一个假设:最有效的数据处理模式是一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作,分析工作经常读取其中的大部分数据,即使不是全部。
3)运行于商业硬件上: Hadoop不需要特别贵的、reliable的(可靠的)机器,可运行于普通商用机器(可以从多家供应商采购) ,商用机器不代表低端机器。在集群中(尤其是大的集群),节点失败率是比较高的HDFS的目标是确保集群在节点失败的时候不会让用户感觉到明显的中断。

1.2、不适用场景

1) 低延时的数据访问
对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时HBase更适合低延时的数据访问。
2)大量小文件
文件的元数据(如目录结构,文件block的节点列表,block-node mapping)保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。
经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持。
3)多方读写,需要任意的文件修改
HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改。不支持多个写入器(writer)。

2、HDFS核心概念

2.1、 数据块(Block)

物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512 Byte。文件系统在物理Block之上抽象了另一层概念,文件系统Block物理磁盘Block的整数倍。通常为几KB。Hadoop提供的df、fsck这类运维工具都是在文件系统的Block级别上进行操作。HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。

HDFS的Block为什么这么大?
是为了最小化查找(seek)时间,控制定位文件与传输文件所用的时间比例。假设定位到Block所需的时间为10ms,磁盘传输速度为100M/s。如果要将定位到Block所用时间占传输时间的比例控制1%,则Block大小需要约100M。

Block抽象的好处
1)block的拆分使得单个文件大小可以大于整个磁盘的容量,构成文件的Block可以分布在整个集群, 理论上,单个文件可以占据集群中所有机器的磁盘。
2)Block作为容错和高可用机制中的副本单元,即以Block为单位进行复制。

2.2、namenode和datanode

整个HDFS集群由Namenode和Datanode构成master-worker(主从)模式。Namenode负责构建命名空间,管理文件的元数据等,而Datanode负责实际存储数据,负责读写工作。

3、搭建

3.1、环境准备

192.168.0.38  namenode jdk1.8  node1
192.168.0.39  datanode jdk1.8  node2
192.168.0.40  datanode jdk1.8  node3
192.168.0.41  datanode jdk1.8  node4

3.2、解压包

tar -zxvf hadoop-2.8.5.tar.gz
#删除文档文件
/usr/local/hadoop-2.8.5/share
du -sh *
rm -rf doc

在这里插入图片描述

3.3、修改配置文件

cd /usr/local/hadoop-2.8.5/etc/hadoop

1)修改jdk

vim hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8

2)配置hadoop默认访问文件系统,并且指定namenode节点

vim core-site.xml
<configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://node1:9000</value>
    </property>
</configuration>

3)配置 namenode和datanode 存储路径

vim hdfs-site.xml

<configuration>
     <!--配置namenode dir-->
    <property>    
            <name>dfs.namenode.name.dir</name>
            <value>/usr/local/data/namenode</value>
    </property>
    <!--配置datanode dir-->
    <property>
            <name>dfs.datanode.data.dir</name>
            <value>/usr/local/data/datanode</value>
    </property>
</configuration>

3.4、把hadoop包拷到别的机器上

scp -r hadoop-2.8.5/ node2:/usr/local/
scp -r hadoop-2.8.5/ node3:/usr/local/
scp -r hadoop-2.8.5/ node4:/usr/local/

3.5、启动
1)初始化namenode元数据目录

#node1
cd /usr/local/hadoop-2.8.5/bin
./hadoop namenode -format

在这里插入图片描述

2)启动namenode

#node1
cd /usr/local/hadoop-2.8.5/sbin
./hadoop-daemon.sh start namenode
#查看
jps
ps -ef | grep namenode
#访问url
http://192.168.0.38:50070

在这里插入图片描述

3)启动datanode

#node2、node3、node4
cd /usr/local/hadoop-2.8.5/sbin
./hadoop-daemon.sh start datanode

在这里插入图片描述

4、配置脚本启动

4.1、配置免密登录

#node1
ssh-keygen

ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
ssh-copy-id node4

4.2、配置slaves

vim slaves

node2
node3
node4

在这里插入图片描述

4.3、停止所有节点

停止的时候会询问是否停止secondarynamenode,选择yes,因为开始没有开启secondarynamenode所以会说没有secondarynamenode可以停止(secondarynamenode后续会说)。

#node1
cd /usr/local/hadoop-2.8.5/sbin
./stop-dfs.sh
jps

在这里插入图片描述

4.4、开启所有节点

cd /usr/local/hadoop-2.8.5/sbin
start-dfs.sh

在这里插入图片描述

5、Secondary NameNode

5.1、namenode

NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。
在这里插入图片描述
上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的。这里有两个不同的文件:
1)fsimage – 它是在NameNode启动时对整个文件系统的快照
2)edit logs – 它是在NameNode启动后,对文件系统的改动序列
只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:
1)edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
2)NameNode的重启会花费很长时间,因为有很多改动。
如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。

5.2、Secondary NameNode

SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。首先,它定时到NameNode去获取edit logs,并更新到fsimage上。一旦它有了新的fsimage文件,它将其拷贝回NameNode中。NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。
在这里插入图片描述

5.3、如果开启hdfs那么先关闭

cd /usr/local/hadoop-2.8.5/sbin
./stop-dfs.sh

5.4、修改配置文件

cd /usr/local/hadoop-2.8.5/etc/hadoop
vim hdfs-site.xml
<!--配置secondary namenode-->
<property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node2:50090</value>
</property>

5.5、复制给其它节点

cd /usr/local/hadoop-2.8.5
scp -r  etc/  node2:/usr/local/hadoop-2.8.5/
scp -r  etc/  node3:/usr/local/hadoop-2.8.5/
scp -r  etc/  node4:/usr/local/hadoop-2.8.5/

5.6、启动

cd /usr/local/hadoop-2.8.5/sbin
start-dfs.sh

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15166.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!