前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hadoop-HDFS浅谈

Hadoop-HDFS浅谈

原创
作者头像
IT_Skywalker
修改2020-03-17 18:46:07
9290
修改2020-03-17 18:46:07
举报
文章被收录于专栏:IT技术漫谈IT技术漫谈

概述

HDFS是Hadoop中进行分布式存储的组件,旨在提供可靠的, 可扩展的, 高吞吐, 高并发的大数据访问. HDFS是一个主/从(Mater/Slave)体系结构,主要节点是NameNode, DataNode.

优点

文件可切块, 保证其可存储超大文件

DataNode心跳机制保证存储空间的可扩展性,支持横向扩展DataNode

DataNode的Replica机制保证数据的可靠性

一次写入, 多次读取,允许追加

缺点

可存储大量小文件, 但不建议存. 因为大量的小文件产生大量NameNode的metadata, 从而影响NameNode性能

更多支持OLAP系统, 不保证快速访问

不支持事务

HDFS
HDFS

HDFS技术要点

Block

Block是HDFS的基本存储单位, HDFS会将数据进行切块存储, 默认128M(Hadoop2.0). 小于默认值的文件按实际存储. 查看block信息, 可以访问NameNode admin web查看.

BlockID用于标识block, 第1个block的ID随机生成, 随后的blockID依次加1.

Block有利于存储大文件, 并且方便快速备份.

NameNode

记录Metadata

Metadata(包括存储文件的HDFS路径以及权限, Block信息, Replicas等), Metadata会存储在NameNode的内存和磁盘中, 维系在内存中是为了快速查询, 维系在磁盘中是为了数据恢复. Metadata的存储位置决定于core-site.xml中的hadoop.tmp.dir.

Metadata在磁盘中以edits和fsimage形式存在.当HDFS用户提交写请求, metadata记录顺序 edits->内存,edits->fsimage. 记录顺序edits->内存是为了保证metadata数据的意外恢复, edits->fsimage会发生在特定条件下(当edits达到一定大小, 或者间隔时间内自动触发,或者重启NameNode, 或者使用强制更新命令hadoop dfsadmin -rollEdits时)

管理DataNode

NameNode通过心跳机制来管理DataNode, DataNode每隔指定时间会向NameNode发送心跳. 默认心跳间隔3s. 如果NameNode一段时间(默认10min)没有收到心跳, 则表明DataNode处于lost状态, DataNode的常见状态有prepared,in service等. 处于lost状态的DataNode, NameNode会安排重新新建该DataNode上的副本. 总之, 心跳信息会包含DataNode的状态和其中的Block信息.

安全模式

NameNode重启后, 会进入安全模式. 这个时候会等待所有DataNode的心跳. 这个模式通常持续半个小时, 当然这个取决于DataNode个数. 正因为有安全模式, 在Hadoop伪分布安装时, 必须设置replica数量为1, 因为伪分布模式只有一台主机, NameNode只能收到一个DataNode的心跳, 于是NameNode会根据设置好的replica数量不断尝试重新安排新建replica, 根据replica放置策略, replica无法放置到其他主机, 最后, NameNode永远处于安全模式.

回收站机制

默认情况下在HDFS上删除的文件无法找回, 利用回收站机制, 可以配置文件在HDFS的停留时间.

DataNode

DataNode存储的是Block

DataNode通过RPC发送心跳信息

SecondaryNameNode

SNN并不是NameNode的backup, 当NameNode 挂掉的时候,它并不能马上代替NameNode. SNN只是辅助合并edits和fsimage,所以SNN是可以不要的.

Architecture
Architecture

工作流程

写流程

Client发起RPC请求到NameNode

NameNode校验Client在指定folder上是否有写权限

如果请求文件不存在, 则允许写操作

RPC请求中包含文件大小, 请求用户等信息, NameNode会据此计算出Block信息(地址, replica数量等信息), Client收到Block信息后, 将数据切块,写入DataNode

Client依次写完所有block, 最后通知NameNode成功写完

读流程

Client发起RPC请求到NameNode

NameNode校验文件是否存在(无需校验读权限), 如果存在, NameNode会将该文件对应的所有block地址放入到一个queue并返回给Client.

如果有replica, 针对同一Block的不同replica, Client会根据“就近”原则去选择replica访问. "就近"是指所经过的路由器, 交换机等网络设备数量最少的路径.

Client依次读完所有block, 最后通知NameNode成功读完

删除流程

Client发起RPC请求到NameNode

NameNode校验文件是否存在以及client是否有权限删除

NameNode将此删除操作先记录到edits_inprogress, 然后修改内存中的metadata, 最后告诉client删除成功(此时文件可能并没有删除)

NameNode等待DataNode的心跳, 如果某DataNode有需要删除的block, NameNode会告诉该DataNode删除相关的block.

安装方式

单机模式

解压就可以用, 只能使用MapReduce

伪分布式模式

利用一台主机模拟集群环境,可使用Hadoop所有组件

完全分布式模式

利用真实集群环境部署

常见问题

在安装完后, 可能遇到nativelib的问题, hadoop命令无法使用, 查看官方手册, 解决方案如下

http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/NativeLibraries.html

代码语言:javascript
复制
[root@hadoopmaster software]# hadoop fs -put hadoop-2.7.1_64bit.tar.gz /
20/03/16 19:20:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
20/03/16 19:20:29 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hadoop-2.7.1_64bit.tar.gz._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.
        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1550)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getNewBlockTargets(FSNamesystem.java:3110)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3034)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:723)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:492)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:969)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)

        at org.apache.hadoop.ipc.Client.call(Client.java:1476)
        at org.apache.hadoop.ipc.Client.call(Client.java:1407)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
        at com.sun.proxy.$Proxy9.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:418)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
        at com.sun.proxy.$Proxy10.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1430)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1226)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:449)
put: File /hadoop-2.7.1_64bit.tar.gz._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.

[root@hadoopmaster native]# hadoop checknative -a
20/03/16 19:28:14 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop:  false 
zlib:    false 
snappy:  false 
lz4:     false 
bzip2:   false 
openssl: false 
20/03/16 19:28:15 INFO util.ExitUtil: Exiting with status 1

[root@hadoopmaster native]# ll
总用量 4928
-rw-r--r--. 1 10021 10021 1383476 6月  29 2015 libhadoop.a
-rw-r--r--. 1 10021 10021 1634592 6月  29 2015 libhadooppipes.a
lrwxrwxrwx. 1 10021 10021      18 3月  16 00:18 libhadoop.so -> libhadoop.so.1.0.0
-rwxr-xr-x. 1 10021 10021  807942 6月  29 2015 libhadoop.so.1.0.0
-rw-r--r--. 1 10021 10021  476666 6月  29 2015 libhadooputils.a
-rw-r--r--. 1 10021 10021  447388 6月  29 2015 libhdfs.a
lrwxrwxrwx. 1 10021 10021      16 3月  16 00:18 libhdfs.so -> libhdfs.so.0.0.0
-rwxr-xr-x. 1 10021 10021  282388 6月  29 2015 libhdfs.so.0.0.0

/* 排除是否由于OS和静态库的编译位数不一致导致*/
[root@hadoopmaster sbin]# uname -r
2.6.32-431.el6.x86_64
[root@hadoopalone native]# file libhadoop.so.1.0.0 
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

/*对静态库查看下依赖*/ 
[root@hadoopmaster native]# ldd libhadoop.so.1.0.0 
./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
        linux-vdso.so.1 =>  (0x00007fff3bfff000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa0bb078000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa0bace3000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003851e00000)
 
/*找到根本原因, 确定没有GLIBC_2.14*/       
[root@hadoopmaster native]# strings /lib64/libc.so.6|grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE

/*upgrade install Glibc2.14 */
[root@hadoopmaster software]# wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
[root@hadoopmaster software]# tar -zxvf glibc-2.14.tar.gz 
[root@hadoopmaster software]#cd glibc-2.14
[root@hadoopmaster glibc-2.14]# mkdir build
[root@hadoopmaster glibc-2.14]# cd build
[root@hadoopmaster build]# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in /home/software/glibc-2.14/build:
configure: error: no acceptable C compiler found in $PATH
See config.log for more details
[root@hadoopmaster build]# yum -y install gcc
[root@hadoopmaster build]# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
[root@hadoopmaster build]# make -j 8
[root@hadoopmaster build]# make install

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • 优点
      • 缺点
      • HDFS技术要点
        • Block
          • NameNode
            • 记录Metadata
            • 管理DataNode
            • 安全模式
            • 回收站机制
          • DataNode
            • SecondaryNameNode
            • 工作流程
              • 写流程
                • 读流程
                  • 删除流程
                  • 安装方式
                    • 单机模式
                      • 伪分布式模式
                        • 完全分布式模式
                          • 常见问题
                          相关产品与服务
                          对象存储
                          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档