原创

Hadoop-HDFS浅谈

概述

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

优点

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

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

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

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

缺点

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

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

不支持事务

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

工作流程

写流程

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

[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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关系型数据库设计浅谈

    简称概念模型,是面向数据库用户的现实世界的模型,主要用来描述世界的概念化结构,它使数据库的设计人员在设计的初始阶段,摆脱计算机系统及DBMS的具体技术问题,集中...

    IT_Skywalker
  • SSH浅谈

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协...

    IT_Skywalker
  • java.lang.IllegalArgumentException: node to traverse cannot be null!

    java.lang.IllegalArgumentException: node to traverse cannot be null!

    时间静止不是简史
  • tried to access method com.google.common.base.Stopwatch

    Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAcces...

    stys35
  • Linux(centos)安装jdk

    由于centos默认安装的是openjdk,所以安装前需要彻底清理下openjdk。

    上帝
  • java:使用匿名类直接new接口

    java中的匿名类有一个倍儿神奇的用法,见下面代码示例: 1 package contract; 2 3 public interface ISay { 4 ...

    菩提树下的杨过
  • JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量

    在Web项目中,我们对下面这几个监听器必须熟练的使用,它们的作用真的很大。熟练的使用后,可以使我们少绕弯路,少写很多代码、

    谙忆
  • JAVA学习绘图颜色及其笔画属性设置字体显示文字

    package com.graphics; import java.awt.*; import java.awt.geom.Rectangle2D; impo...

    别先生
  • 剖析Java OutOfMemoryError异常

    在JVM中,除了程序计数器外,虚拟机内存中的其他几个运行时区域都有发生OutOfMemoryError异常的可能,本篇就来深入剖析一下各个区域出现OOM异常的情...

    王金龙
  • Spark Streaming Failed to read checkpoint from directory ...现象解决方案及原因

    使用spark-submit提交一个Spark Streaming Application至yarn集群, 报错

    codingforfun

扫码关注云+社区

领取腾讯云代金券

,,