[Hadoop]万字长文Hadoop相关优化和问题排查总结

Posted bigdata王一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Hadoop]万字长文Hadoop相关优化和问题排查总结相关的知识,希望对你有一定的参考价值。

目录

写文章的背景

最近面试了一家公司,大数据平台研发的。面试的内容主要是运维和运维开发工作,排查项目中的问题点,目的是提高hadoop集群的性能,我把面试题总结了一下。虽然开发工程不会全面的遇到下面的问题,就做个总结,分享一下,供个人的知识部分吧。

namenode频繁切换的原因

原因可能如下:
1.负载过重:在集群中的任务过多,可能会导致任务的负载过重,并导致频繁切换。
2。内存不足:当集群中处理的数据量多大,可能会导致内存不足,并导致namenode频繁切换。
3.垃圾回收:如果jvm的回收频率过高,也可能导致namenode频繁切换。
4.网络问题:如果namenode和datanode之间的网络连接出现问题,可能会导致namenode的频繁切换。
解决办法
1.增加集群资源:通过增加节点或调整配置来增加集群资源,从而降低负载;
2.调整jvm参数:可以尝试减少垃圾回收的频率,提高namenode性能;
3.检查网络连接:检查是否稳定,如ping操作

案例:在短时间内创建或删除了大量文件,引发了active NN节点频繁更新本地内存的数据结构,这会导致RPC的处理时长增加,CallQueue中的rpcCall堆积(严重的情况下会撑满CallQueue),从而导致active状态的NN长时间不响应ZKFC的HealthMonitor子进程,于是ActiveStandbyElector就会断开与ZooKeeper的连接,从而释放锁,于是master2节点上的ActiveStandbyElector就会从zookeeper争抢锁,抢到锁之后的NN就会从standby转换成active状态。

案例解决办法:先调高NameNode的参数ha.health-monitor.rpc-timeout.ms值,该参数位于core-site.xml文件中,此参数是指ZKFC的健康检查超时的时长,默认值45000ms,现已修改为120000ms(2分钟)。改完NN参数后,需要重启相关的NameNode。另外,如果内存足够,可以顺便把两个NameNode的heap size适当调大一些。
参考:案例参考地址

namenode HA 如何实现,关键技术难题是什么?

  1. 如何保持主和备NameNode的状态同步,并让Standby在Active挂掉后迅速提供服务,namenode启动比较耗时,包括加载fsimage和editlog(获取file to block信息),处理所有datanode第一次blockreport(获取block to datanode信息),保持NN的状态同步,需要这两部分信息同步。

  2. 脑裂(split-brain),指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

ZKFC的设计
1. FailoverController实现下述几个功能
(a) 监控NN的健康状态
(b) 向ZK定期发送心跳,使自己可以被选举。
(c) 当自己被ZK选为主时,active FailoverController通过RPC调用使相应的NN转换为active。

2. 为什么要作为一个deamon进程从NN分离出来
(1) 防止因为NN的GC失败导致心跳受影响。
(2) FailoverController功能的代码应该和应用的分离,提高的容错性。
(3) 使得主备选举成为可插拔式的插件。

3. FailoverController主要包括三个组件,
(1) HealthMonitor 监控NameNode是否处于unavailable或unhealthy状态。当前通过RPC调用NN相应的方法完成。
(2) ActiveStandbyElector 管理和监控自己在ZK中的状态。
(3) ZKFailoverController 它订阅HealthMonitor 和ActiveStandbyElector 的事件,并管理NameNode的状态。
  1. NameNode切换对外透明,主Namenode切换到另外一台机器时,不应该导致正在连接的客户端失败,主要包括Client,Datanode与NameNode的链接。

namenode优化

  1. 定期检查namenode日志并了解日志中可能出现的问题。
  2. 对namenode进行内存优化,将资源分配给namenode节点,提高namenode的性能。
  3. 合理调整namenode的计算资源,以减少系统的延迟。
  4. 合理调整namenode的数据块大小,使数据块的大小能够满足存储的要求。
  5. 合理调整namenode的缓存大小,以改善系统的性能。
  6. 合理调整namenode的同步设置,以减少系统的延迟。
  7. 将namenode的安全设置更新为最新版本,以确保namenode的安全性。
  8. 定期备份namenode以防止意外数据丢失。

namenode内存生产配置

1)NameNode内存计算
每个文件块大概占用150byte,一台服务器128G内存为例,能存储多少文件块呢?
128 * 1024 * 1024 * 1024 / 150Byte ≈ 9.1亿
G MB KB Byte
2)Hadoop2.x系列,配置NameNode内存
NameNode内存默认2000m,如果服务器内存4G,NameNode内存可以配置3g。在hadoop-env.sh文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m
3)Hadoop3.x系列,配置NameNode内存
(1)hadoop-env.sh中描述Hadoop的内存是动态分配的

# The maximum amount of heap to use (Java -Xmx).  If no unit
# is provided, it will be converted to MB.  Daemons will
# prefer any Xmx setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MAX=

# The minimum amount of heap to use (Java -Xms).  If no unit
# is provided, it will be converted to MB.  Daemons will
# prefer any Xms setting in their respective _OPT variable.
# There is no default; the JVM will autoscale based upon machine
# memory size.
# export HADOOP_HEAPSIZE_MIN=
HADOOP_NAMENODE_OPTS=-Xmx102400m
(2)查看NameNode占用内存
[hadoop102 ~]$ jps
3088 NodeManager
2611 NameNode
3271 JobHistoryServer
2744 DataNode
3579 Jps
[hadoop102 ~]$ jmap -heap 2611
Heap Configuration:
   MaxHeapSize              = 1031798784 (984.0MB)
(3)查看DataNode占用内存
jmap -heap 2744
查看发现hadoop102上的NameNode和DataNode占用内存都是自动分配的,且相等。不是很合理。



具体修改:
hadoop-env.sh

export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"

export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"

NameNode心跳并发配置

1)hdfs-site.xml

The number of Namenode RPC server threads that listen to requests from clients. If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.

NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大该参数。默认值是10。

<property>
    <name>dfs.namenode.handler.count</name>
    <value>21</value>
</property>

企业经验:dfs.namenode.handler.count=20×〖log〗_e^(Cluster Size),比如集群规模(DataNode台数)为3台时,此参数设置为21。可通过简单的python代码计算该值,代码如下。

[hadoop102 ~]$ sudo yum install -y python
[hadoop102 ~]$ python
Python 2.7.5 (default, Apr 11 2018, 07:36:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> print int(20*math.log(3))
21
>>> quit()

开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。
1)回收站工作机制

2)开启回收站功能参数说明
(1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。
(2)默认值fs.trash.checkpoint.interval = 0检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。
(3)要求fs.trash.checkpoint.interval <= fs.trash.interval
3)启用回收站
修改core-site.xml,配置垃圾回收时间为1分钟。

<property>
    <name>fs.trash.interval</name>
    <value>1</value>
</property>

4)查看回收站
回收站目录在HDFS集群中的路径:/user/root/.Trash/….
5)注意:通过网页上直接删除的文件也不会走回收站
6)通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站

Trash trash = New Trash(conf);
trash.moveToTrash(path);

7)只有在命令行利用hadoop fs -rm命令删除的文件才会走回收站

[hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /user/root/input
2021-07-14 16:13:42,643 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop102:9820/user/atguigu/input' to trash at: hdfs://hadoop102:9820/user/atguigu/.Trash/Current/user/atguigu/input

8)恢复回收站数据

[hadoop102 hadoop-3.1.3]$ hadoop fs -mv
/user/atguigu/.Trash/Current/user/atguigu/input    /user/atguigu/input

datanode的优化

1、提高内存配置:提高内存可以降低磁盘的访问次数,缩短IO等待的时间,提高系统的IO处理能力,提高数据节点的性能。

2、增加磁盘数量或更换更快的存储设备:增加磁盘数量可以将数据分散到不同的磁盘上,减少I/O竞争,提高磁盘的吞吐量;更换更快的存储设备可以提高数据节点的性能。

3、修改配置文件:针对datanode空间不足的情况,可以调整dfs.datanode.du.reserved和dfs.datanode.max.xcievers配置,以保证文件系统的稳定性,提高数据节点的性能。

4、调整block size:调整block size可以提高磁盘I/O的效率,提高数据节点的性能。

5、禁用磁盘预读:禁用磁盘预读可以减少磁盘I/O的次数,提高数据节点的性能。

hdfs调优

1、优化NameNode
(1)增大NameNode的内存
由于大量的文件操作,NameNode的内存压力会变得很大,要提高NameNode的性能,首先要考虑的是增大NameNode的内存。可以通过更改hadoop-env.sh文件中的HADOOP_NAMENODE_OPTS参数来增大NameNode的内存。

(2)增大NameNode的存储空间
为了支持更多的文件操作,可以考虑增加NameNode的存储空间,这样可以提高hdfs的性能。可以通过更改hdfs-site.xml文件中的dfs.name.dir参数来增加NameNode的存储空间。

2、优化DataNode
(1)增大DataNode的内存
DataNode的内存压力也会很大,可以通过更改hadoop-env.sh文件中的HADOOP_DATANODE_OPTS参数来增大DataNode的内存。

(2)增大DataNode的存储空间
为了支持更多的数据存储,可以考虑增加DataNode的存储空间,这样可以提高hdfs的性能。可以通过更改hdfs-site.xml文件中的dfs.data.dir参数来增加DataNode的存储空间。

(3)增加DataNode的数量
为了提高hdfs的性能,可以考虑增加DataNode的数量,这样可以提高文件存储和访问的性能。可以通过更改hdfs-site.xml文件中的dfs.datanode.data.dir参数来增加DataNode的数量。

3、优化文件系统
(1)增大文件系统的块大小
为了提高文件的访问性能,可以考虑增大文件系统的块大小,这样可以减少文件存储和访问的次数,提高hdfs的性能。可以通过更改hdfs-site.xml文件中的dfs.block.size参数来增大文件系统的块大小。

(2)减少文件系统

hadoop的优化

1.块大小调整:hdfs默认块大小是128mb,根据不同应用的数据访问模式和节点硬件特性等因素,可能需要调整块大小。如果文件的访问模式以顺序读取为主,那么增大块大小可以提高I/O吞吐量;如果文件的访问模式以读取为主,那么缩小块大小可以减少数据的读取延迟。
2.副本数的设置:副本数指的是每个数据块在hdfs中存储的备份数,默认为3.可以根据数据的重要性,节点的可靠性等因素来设置副本数。
3.数据压缩:对于一些数据类型可以使用压缩技术,如snappy,lzo等。在保证数据可读性的前提下,通过压缩可以减少磁盘空间占用和网络传输带宽。
4.预热机制:通过预先将热点数据放置到内存中,可以避免冷启动时数据加载导致的性能问题。这可以通过使用Hadoop cache 或者memcached等工具实现。
5. 节点管理优化:包括优化节点的磁盘和内存配置,以及定期进行节点健康度检查和数据块均衡等。
6. 使用SSD:如果条件允许,可以将部分数据或元数据存储在 SSD上,以提高 HDFS的访问速度。

YARN 的优化

对于 YARN 的优化,可以从以下几个方面入手:

  1. 资源管理器配置调整:通过调整资源管理器参数来优化 YARN 的性能。例如,可以设置最大内存、最大 CPU使用率等。
    2.容器预启动:YARN 支持在应用程序提交之前预先启动一定数量的容器,以加速应用程序的启动时间。
  2. 使用本地化和数据本地性:通过优化数据本地性,可以减少网络传输的开销。例如,可以将作业分配到与数据源相同机架上的节点上运行,或者使用 HDFS 缓存来提高数据访问效率。
  3. 任务并发度调整:可以根据集群资源和任务类型等因素来适当调整任务并发度,以充分利用集群资源,并避免过度抢占资源导致的性能下降。
  4. 使用预留内存:为子避免由于JM垃圾回收等造成的应用程序暂停,可以设置 YARN预留一定量的内存,使应用程序可用内存更加稳定。
    6.节点监控和故障转移:使用节点监控工具(如Nagios)和故障转移机制,可以及时检测节点故障并快速转移任务。

HDFS调优的基本原则

(1)根据HDFS的应用场景调整HDFS配置参数,使其可以满足应用场景的要求;

(2)调优时要注意参数之间的依赖性关系,避免出现调优参数之间的冲突;

(3)调优时需要考虑硬件环境,例如网络带宽、服务器内存、CPU等;

(4)尽可能少的调整HDFS配置参数,相同参数可以使用相同的值;

(5)不要过度调优,调优以后应该全面检查系统的稳定性和性能,确认是否达到调优的目标。

HDFS调优的常用参数

(1)dfs.namenode.handler.count:HDFS的NameNode处理请求的线程数,默认是10;

(2)dfs.namenode.max.objects:HDFS的NameNode在内存中存储的文件最多数量,默认是10 000;

(3)dfs.namenode.replication.min:HDFS的NameNode最小副本数,默认是1;

(4)dfs.datanode.max.transfer.threads:HDFS的DataNode的最大传输线程数,默认是40;

(5)dfs.datanode.socket.write.timeout:HDFS的DataNode写Socket超时时间,单位为毫秒,默认是180000;

(6)dfs.blocksize:HDFS的块大小,单位为字节,默认是67108864;

(7)dfs.namenode.safemode.threshold-pct:HDFS的NameNode安全模式的阈值,单位为百分比,默认是0.999;

(8)dfs.namenode.safemode.extension:HDFS的NameNode安全模式的延长时间,单位为秒,默认是30000;

(9)dfs.namenode.accesstime.precision

排查哪个任务的cpu占用高

在Linux 系统中,可以通过 top 命令查看当前系统的进程情况,并按照 CPU 占用率进行排序。
具体操作如下:

  1. 打开终端窗口,输入top命令后回车,即可显示当前系统的进程情況。
    2.按下键盘上的P键,可以按照 CPU 占用率降序排列进程列表,这样就可以快速找到占用CPU较高的进程。
  2. 如果需要查看某个特定进程的 CPU 占用情况,可以根据进程的 PID 进行过滤。按下键盘上的F键,然后选择“PID”,输入要查看的进程的 PID 后,即可只显示该进程的CPU 占用情況。
  3. 在top界面下,可以使用h、?或者H键查看帮助信息,了解更多可用的命令和选项。
    注意:top 命令默认是实时刷新的,如果需要指定刷新周期,可以使用-d选项来设置。例如,top-d 5 表示每隔5 秒钟刷新一次。

hdfs查询慢的原因

HDFS 查询慢的原因可能有很多,以下是一些常见的原因:

  1. 数据规模过大:如果查询的数据量非常大,可能会导致查询时需要大量时间来扫描数据块和进行网络传输,从而导致查询变慢。
    2.块大小设置不合理:如果块大小设置过小,可能会导致数据块数量过多,增加了查询的开销;而如果块大小设置过大,则可能会导致数据块间的网络传输时间过长。
  2. 访问热点数据节点较远:如果访问的热点数据所在的节点距离查询节点较远,可能会导致查询的网络传输延迟较大,从而导致查询变慢。
  3. 集群资源不足:如果集群中的资源不足,可能会导致任务之间相互竞争资源,从而导致查询性能下降。
  4. 硬件故障:如果节点硬件出现故障,例如磁盘损坏、网络断连等,可能会影响查询的执行效率。

解决这些问题的方法可能包括:

  1. 优化查询语句:根据查询的需求和数据特征,优化查询语句,减少数据扫描范围。
  2. 调整块大小:根据实际情況调整 HDFS 的块大小,以达到最佳的查询性能。
  3. 数据本地性优化:使用 HDFS 缓存或将作业分配到与数据源相同机架上的节点上运行,以提高数据访问效率。
  4. 增加集群资源:通过增加节点或者调整配置来增加集群资源,从而提高查询性能。
  5. 定期维护硬件:对于经常出现硬件故障的节点,可以考虑及时维护或更换,以保证节点的正常运行。
    总之,要解决 HDFS 查询慢的问题,需要仔细分析并找到根本原因,然后采取相应的措施来解决问题。

怎样判断是否是数据倾斜

在大数据处理中,数据倾斜是指某个或某些任务所处理的数据量远远大于其他任务的情況。判断数据倾斜可以从以下几个方面入手:

  1. 任务执行时间不均衡:如果同一批作业中有部分任务运行时间明显高于其他任务,则可能存在数据倾斜的情況。
    2.任务进度不均衡:如果同一批作业中有部分任务完成进度远远落后于其他任务,则也可能存在数据倾斜的情况。
  2. 记录数不均衡:如果同一批数据集中某些记录被访问的频率明显高于其他记录,则可能存在数据倾斜的情況。
  3. 数据分布不均衡:如果同一分区内的数据量远远大于其他分区,则可能存在数据倾斜的情况。
  4. 运行日志异常:如果作业的运行日志中出现了大量的错误、超时、重试等异常信息,则可能存在数据倾斜的情况。
    如果出现以上情况,就需要进一步排查是否存在数据倾斜问题。常用的排查方法包括:
  5. 查看作业日志:根据作业的日志信息,找到运行时间长的任务,并检查它们处理的数据是否异常。
  6. 统计数据分布:通过Hive 或 Spark 等计算框架提供的统计功能,查看数据分布是否均衡。
  7. 分析执行计划:通过分析作业的执行计划找到处理数据的热点任务,并考虑采取合适的优化措施来解决数据倾斜问题。
  8. 增加分区:对于数据分布不均衡的情况,可以尝试增加分区,以达到更好的负载均衡效果.
    总之,要判断数据倾斜,需要综合考虑多种因素,并根据实际情况采取相应的优化措施,以提高作业的性能和稳定性。

集群重启任务自动重启

集群重启任务自动重启的实现方式可以通过在集群管理系统中设置自动重启策略,具体包括以下几个步骤:
1.在集群管理系统中创建一个自动重启策略。
2. 将需要自动重启的任务添加到该重启策略中。
3. 配置任务自动重启的规则,如自动重启次数、时间间隔等。
4. 启用自动重启策略,使其生效。
这样配置后,当集群重启时,自动重启策略会自动将任务重新启动,确保任务的连续性和稳定性。

hadoop宕机

  1. 硬件故障:Hadoop集群的硬件是由许多节点组成的,它们之间的网络连接也非常重要。如果某一台节点的硬件出现故障,那么整个Hadoop集群将会宕机。
  2. 软件故障:Hadoop的软件也可能出现故障,这可能会导致整个集群宕机。例如,如果NameNode或DataNode出现故障,那么整个集群就会宕机。
  3. 网络故障:Hadoop集群上的所有节点都需要连接到网络,如果网络出现故障,那么整个集群也会宕机。
  4. 用户错误:用户可能会误操作Hadoop集群,比如删除重要的配置文件,这样就会导致集群宕机。
  5. 如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
  6. 如果写入文件过快造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。例如,可以调整Flume每批次拉取数据量的大小参数batchsize。

Hadoop解决数据倾斜方法

1)提前在map进行combine,减少传输的数据量
在Mapper加上combiner相当于提前进行reduce,即把一个Mapper中的相同key进行了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量。
如果导致数据倾斜的key大量分布在不同的mapper的时候,这种方法就不是很有效了。
2)导致数据倾斜的key 大量分布在不同的mapper
(1)局部聚合加全局聚合。
第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。
第二次mapreduce,去掉key的随机前缀,进行全局聚合。
思想:二次mr,第一次将key随机散列到不同reducer进行处理达到负载均衡目的。第二次再根据去掉key的随机前缀,按原key进行reduce处理。
这个方法进行两次mapreduce,性能稍差。
(2)增加Reducer,提升并行度
JobConf.setNumReduceTasks(int)
(3)实现自定义分区
根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer

hdfs多目录

NameNode多目录配置

1)NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性

2)具体配置如下
(1)在hdfs-site.xml文件中添加如下内容

<property>
     <name>dfs.namenode.name.dir</name>
     <value>file://$hadoop.tmp.dir/dfs/name1,file://$hadoop.tmp.dir/dfs/name2</value>
</property>

注意:因为每台服务器节点的磁盘情况不同,所以这个配置配完之后,可以选择不分发
(2)停止集群,删除三台节点的data和logs中所有数据。

[hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/
[hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/
[hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/

(3)格式化集群并启动。

[hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -format
[hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh

3)查看结果

[hadoop102 dfs]$ ll
总用量 12
drwx------. 3 root root4096 12月 11 08:03 data
drwxrwxr-x. 3 root root 4096 12月 11 08:03 name1
drwxrwxr-x. 3 root root 4096 12月 11 08:03 name2

检查name1和name2里面的内容,发现一模一样。

DataNode多目录配置

1)DataNode可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)

2)具体配置如下
在hdfs-site.xml文件中添加如下内容

<property>
     <name>dfs.datanode.data.dir</name>
     <value>file://$hadoop.tmp.dir/dfs/data1,file://$hadoop.tmp.dir/dfs/data2</value>
</property>

3)查看结果

[root @hadoop102 dfs]$ ll
总用量 12
drwx------. 3 root root 4096 4月   4 14:22 data1
drwx------. 3 root root 4096 4月   4 14:22 data2
drwxrwxr-x. 3 root root 4096 12月 11 08:03 name1
drwxrwxr-x. 3 root root 4096 12月 11 08:03 name2

4)向集群上传一个文件,再次观察两个文件夹里面的内容发现不一致(一个有数一个没有)

[root @hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt /

HDFS 的源码主要包括

HDFS 的源码主要包括以下几个部分:

  1. Hadoop Common:这是Hadoop 的基础核心库,提供了文件系统、网络通信、安全性等基本组件的实现。Hadoop Common 中包括了一些公共的模块和工具,如io、ipc、security、util 等。
  2. HDFS: Hadoop 分布式文件系统 (HDFS)是Hadoop 的存储组件,负责文件的存储和管理。HDFS 的源代码包括了NameNode, DataNode, BlockScanner,Client、Server、Metrics 等模块。
  3. YARN: YARN (Yet Another ResourceNegotiator)是Hadoop 的资源管理器,负责调度集群中的任务,并向应用程序提供所需的资源。YARN 的源代码包括ResourceManager, NodeManager,ApplicationMaster, Containers, Metrics等模块。
  4. MapReduce : MapReduce 是Hadoop的
    计算引擎,用于处理大规模数据集。MapReduce 的源代码包括了 JobTracker、TaskTracker、Task、 JobConf、JobSubmitter 等模块。
  5. Tools: Hadoop 还提供了一些命令行工具。

大数据组件的异常定位方法

大数据组件异常定位可以通过以下几个步骤来实现:

  1. 查看日志文件:在出现异常后,首先要查看该组件的日志文件,了解异常情況的具体信息。通常情况下,日志文件中会记录异常信息、错误代码等相关信息。
  2. 分析异常原因:根据日志文件中的信息来分析异常原因,确定是组件内部逻辑问题还是外部环境问题导致的异常。
    3.验证输入和输出:如果异常是由于输入或输出数据不正确导致的,需要验证输入和输出数据是否合法。可以通过打印关键数据、调试代码等方式来进行验证。
  3. 进一步调试:如果以上方法无法解决问题,需要进一步调试代码。可以使用集成开发环境(IDE)或者调试工具来进行调试,并设置断点来观察代码执行情況。
  4. 参考文档和社区:如果以上方法仍然无法解決问题,可以参考相关组件的官方文档或者社区,寻求其他开发者的帮助。
    总之,对于大数据组件的昇常,需要结合日志文件和代码进行综合分析,找到异常的根本原因,并采取相应的措施来解決问题。

HDFS的二次开发

可以通过以下几个步骤来实现:

  1. 确定需求和目标:在进行HDFS的二次开发前,需要明确自己的需求和目标。例如,需要扩展HDFS的功能、优化性能等。
  2. 熟悉Hadoop生态圈:HDFS是Hadoop生态圈中的一个组件,需要熟悉其基本架构、API接口等内容,以便于进行二次开发。
  3. 编写代码逻辑:根据需求和目标,编写相应的代码逻辑。可以使用Java语言编写代码,建议参考官方文档和API接口进行开发。
  4. 测试和调试:完成代码编写后,需要进行测试和调试。可以使用本地模式或者集群模式进行测试,并检查代码逻辑是否正确。
  5. 部署和运行:完成测试和调试后,将代码部署到实际环境中并运行。可以使用Hadoop的CLI命令行工具或者IDE插件来进行部署和运行。

常见的HDFS二次开发内容包括:

  • 自定义输入输出格式
  • 扩展HDFS的数据访问方式
  • 实现自定义块分配策略
  • 压缩/解压缩数据
  • 实现文件访问权限控制等

总之,HDFS二次开发需要熟悉Hadoop生态圈和API接口,并根据需求和目标编写相应的代码逻辑,最终进行测试、调试、部署和运行。

面试官问我的问题:hdfs同步几个副本算写入成功

我当时回答的是写入3个(默认副本数为3的情况下)
他笑了笑说一个(当时感觉被嫌弃了哈哈)。。。emmm 我记得也是达到副本个数才算成功

万字长文梳理HDFS

正文:11699字 18图  |  预估阅读时间:59分钟


万字长文梳理HDFS

Hadoop


The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing.  Apache™Hadoop®项目是为可靠的、可扩展的分布式计算而开发的一套开源软件。


The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models.   Apache Hadoop软件库是一个框架,该框架允许使用简单的编程模型跨计算机集群对大规模数据集进行分布式处理。


It is designed to scale up from single servers to thousands of machines, each offering local computation and storage.  它旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储。


Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.  Hadoop框架本身的设计会在应用层去检测和处理各种故障,而不用依赖于硬件层面的高可用,因此可以在计算机集群之上提供高可用服务,集群中的任何单个节点是容易出现故障的。


Latest news


对象存储

First beta release of Apache Hadoop Ozone with GDPR Right to Erasure, Network Topology Awareness, O3FS, and improved scalability/stability.

For more information check the ozone site.

https://hadoop.apache.org/ozone/release/0.5.0-beta/


Modules


The project includes these modules:

Hadoop项目包括以下模块:

Hadoop Common: The common utilities that support the other Hadoop modules.  支持其他Hadoop模块的通用的公用程序。

Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data.  提供对应用程序数据的高吞吐量访问的分布式文件系统。

Hadoop YARN: A framework for job scheduling and cluster resource management.  作业调度和群集资源管理的框架。

Hadoop MapReduce: A YARN-based system for parallel processing of large data sets.  一个基于YARN的分布式系统,用于并行处理大规模数据集。

Hadoop Ozone: An object store for Hadoop.  Hadoop的对象存储。


Related projects


Other Hadoop-related projects at Apache include:

Apache的其他与Hadoop相关的项目包括:

Ambari™: A web-based tool for provisioning, managing, and monitoring Apache Hadoop clusters which includes support for Hadoop HDFS, Hadoop MapReduce, Hive, HCatalog, HBase, ZooKeeper, Oozie, Pig and Sqoop. Ambari also provides a dashboard for viewing cluster health such as heatmaps and ability to view MapReduce, Pig and Hive applications visually alongwith features to diagnose their performance characteristics in a user-friendly manner.  一个基于Web的工具,用于配置,管理和监视Apache Hadoop集群,其中包括对Hadoop HDFS,Hadoop MapReduce,Hive,HCatalog,HBase,ZooKeeper,Oozie,Pig和Sqoop的支持。 Ambari还提供了一个仪表板,用于查看集群健康状况(例如热图)以及以可视方式查看MapReduce,Pig和Hive应用程序的功能,以及以用户友好的方式诊断其性能特征的功能。

Avro™: A data serialization system.  数据序列化系统。

Cassandra™: A scalable multi-master database with no single points of failure.  可扩展的多主数据库,没有单点故障。

Chukwa™: A data collection system for managing large distributed systems.  一种用于管理大型分布式系统的数据收集系统。

HBase™: A scalable, distributed database that supports structured data storage for large tables.   可扩展的分布式数据库,支持大型表的结构化数据存储。

Hive™: A data warehouse infrastructure that provides data summarization and ad hoc querying.  提供数据汇总和即席查询的数据仓库基础设施。

Mahout™: A Scalable machine learning and data mining library.  可扩展的机器学习和数据挖掘库。

Pig™: A high-level data-flow language and execution framework for parallel computation.  用于并行计算的高级数据流语言和执行框架。

Spark™: A fast and general compute engine for Hadoop data. Spark provides a simple and expressive programming model that supports a wide range of applications, including ETL, machine learning, stream processing, and graph computation.  用于Hadoop数据的快速通用计算引擎。Spark提供了一种简单而富有表现力的编程模型,该模型支持广泛的应用程序,包括ETL,机器学习,流处理和图计算。

Submarine: A unified AI platform which allows engineers and data scientists to run Machine Learning and Deep Learning workload in distributed cluster.  统一的AI平台,使工程师和数据科学家可以在分布式集群中运行机器学习和深度学习任务。

Tez™: A generalized data-flow programming framework, built on Hadoop YARN, which provides a powerful and flexible engine to execute an arbitrary DAG of tasks to process data for both batch and interactive use-cases. Tez is being adopted by Hive™, Pig™ and other frameworks in the Hadoop ecosystem, and also by other commercial software (e.g. ETL tools), to replace Hadoop™ MapReduce as the underlying execution engine.  一个基于Hadoop YARN的通用数据流编程框架,该框架提供了强大而灵活的引擎来执行任意DAG任务,以处理一些批处理和交互式查询方面的数据。Hadoop生态系统中的Hive™,Pig™和其他框架以及其他商业软件(例如ETL工具)都采用了Tez,以取代Hadoop™MapReduce作为基础执行引擎。

ZooKeeper™: A high-performance coordination service for distributed applications.  面向分布式应用程序的高性能协调服务。


Hadoop源码&资源


【Hadoop源码结构图】

万字长文梳理HDFS

http://dblab.xmu.edu.cn/post/google-bigtable/

Apache Hadoop GitHub

https://github.com/apache/hadoop

Example source code accompanying O'Reilly's "Hadoop: The Definitive Guide" by Tom White

https://github.com/tomwhite/hadoop-book

Diagrams describing Apache Hadoop internals (2.3.0 or later)

https://github.com/ercoppa/HadoopInternals


Apache Hadoop最新稳定版

Hadoop1.2.1 https://hadoop.apache.org/docs/stable1/

Hadoop2.10.0 https://hadoop.apache.org/docs/stable2/

Hadoop3.2.1 https://hadoop.apache.org/docs/stable3/


HDFS概述



HDFS产生背景


随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件【管理】系统。


HDFS只是分布式文件管理系统中的一个,其他常用的还有FastDFS、Ceph、GlusterFS等。


HDFS概念


HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。


HDFS优缺点


优点

1)高容错性

 (1)数据自动保存多个副本。它通过增加副本的形式,提高容错性;

 (2)某一个副本丢失以后,它可以自动恢复。

2)适合大数据处理

 (1)数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;

 (2)文件规模:能够处理百万规模以上的文件数量,数量相当之大。

3)流式数据访问,它能保证数据的一致性。

4)可构建在廉价机器上,通过多副本机制,提高可靠性。

缺点

1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

2)无法高效的对大量小文件进行存储。

 (1)存储大量小文件的话,它会占用NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;

 (2)小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

3)并发写入、文件随机修改。

 (1)一个文件只能有一个写,不允许多个线程同时写;多份小文件然后merge。

 (2)仅支持数据append(追加),不支持文件的随机修改。


HDFS组成架构


万字长文梳理HDFS


HDFS架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。

1)Client:就是客户端。

  (1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;

  (2)与NameNode交互,获取文件的位置信息;

  (3)与DataNode交互,读取或者写入数据;

  (4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;

  (5)Client可以通过一些命令来访问HDFS;

2)NameNode:就是Master,它是一个主管、管理者。

(1)管理HDFS的名称空间-NameSpace;

(2)管理数据块(Block)映射信息;

(3)配置副本策略;

(4)处理客户端读写请求。

3) DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。

(1)存储实际的数据块;

(2)执行数据块的读/写操作。

4) Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。

而且NameNode和Secondary NameNode是一台机器上,机器挂了就全都挂了。

(1)辅助NameNode,分担其工作量;

(2)定期合并Fsimage和Edits,并推送给NameNode;

(3)在紧急情况下,可辅助恢复NameNode。


HDFS文件块大小


HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。HDFS的块比磁盘的块大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率。如果寻址时间约为10ms,而传输速率为100MB/s,为了使寻址时间仅占传输时间的1%,我们要将块大小设置约为100MB。

默认的块大小128MB。

块的大小:10ms*100*100M/s = 100M

万字长文梳理HDFS


HFDS的Shell操作



基本语法


bin/hadoop fs 具体命令

hadoop fs可以用于其他文件系统,不止是hdfs文件系统内,使用范围更广。

hadoop dfs专门针对hdfs分布式文件系统。

hdfs dfs和hadoop dfs命令作用相同,相比于上面的命令更为推荐,并且当使用hadoop dfs时内部会被转为hdfs dfs命令。


命令大全


$ bin/hadoop fs

常用命令实操

(0)启动Hadoop集群

$ sbin/start-dfs.sh

$ sbin/start-yarn.sh

(1)-help:输出这个命令参数

$ hadoop fs -help rm

(2)-ls: 显示目录信息

$ hadoop fs -ls /

(3)-mkdir:在hdfs上创建目录

$ hadoop fs -mkdir -p /test/input

(4)-moveFromLocal从本地剪切粘贴到hdfs

$ touch testdata.txt

$ hadoop fs  -moveFromLocal  ./testdata.txt  /test/input

(5)--appendToFile :追加一个文件到已经存在的文件末尾

$ touch testdata2.txt

$ vi testdata2.txt

输入

he llo wor ld

$ hadoop fs -appendToFile testdata2.txt /test/input/testdata.txt

(6)-cat :显示文件内容

$ hadoop fs -cat /test/input/testdata.txt

(7)-tail:显示一个文件的末尾

$ hadoop fs -tail /test/input/testdata.txt

(8)-chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限

$ hadoop fs  -chmod  666  /test/input/testdata.txt

$ hadoop fs  -chown  hdfs:hdfs   /test/input/testdata.txt

(9)-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去

$ hadoop fs -copyFromLocal README.txt /

(10)-copyToLocal:从hdfs拷贝到本地

$ hadoop fs -copyToLocal /test/input/testdata.txt ./

(11)-cp :从hdfs的一个路径拷贝到hdfs的另一个路径

$ hadoop fs -cp /test/input/testdata.txt /cp_testdata.txt

(12)-mv:在hdfs目录中移动文件

$ hadoop fs -mv /cp_testdata.txt /test/input/

(13)-get:等同于copyToLocal,就是从hdfs下载文件到本地

$ hadoop fs -get /test/input/testdata.txt ./

(14)-getmerge  :合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...

$ hadoop fs -getmerge /user/hdfs/test/* ./merge_new.txt

(15)-put:等同于copyFromLocal

$ hadoop fs -put ./merge_new.txt /user/hdfs/test/

(16)-rm:删除文件或文件夹

$ hadoop fs -rm /user/hdfs/test/xxxxx.txt

(17)-rmdir:删除空目录

$ hadoop fs -mkdir /test

$ hadoop fs -rmdir /test

(18)-du统计文件夹的大小信息

$ hadoop fs -du -s -h /user/hdfs/test

2.7 K  /user/hdfs/test

$ hadoop fs -du  -h /user/hdfs/test

1.3 K  /user/hdfs/test/README.txt

15     /user/hdfs/test/xxxxx.txt

1.4 K  /user/hdfs/test/merge_new.txt

(19)-setrep:设置hdfs中文件的副本数量

$ hadoop fs -setrep 10 /test/input/testdata.txt

这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。

因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。

【hadoop fs】

万字长文梳理HDFS

【hdfs其他命令】

万字长文梳理HDFS万字长文梳理HDFS


HDFS的数据流



HDFS写数据流程


剖析文件写入

万字长文梳理HDFS

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。

3)客户端请求第一个 block上传到哪几个DataNode服务器上。

4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将整个通信管道建立完成。

6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7步)。


网络拓扑概念


在本地网络中,两个节点被称为“彼此近邻”是什么意思?

在海量数据处理中,其主要限制因素是节点之间数据的传输速率——带宽很稀缺。这里的想法是将两个节点间的带宽作为距离的衡量标准。

节点距离:两个节点到达最近的共同祖先的距离总和。

例如,假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。

Distance(D1/R1/N-0, D1/R1/N-0) = 0 【同一节点上的进程】

Distance(D1/R1/N-1, D1/R1/N-2) = 2 【同一机架上的不同节点】

Distance(D1/R2/N-0, D1/R3/N-2) = 4 【同一数据中心不同机架上的节点】

Distance(D1/R2/N-1, D2/R4/N-1) = 6 【不同数据中心的节点】

万字长文梳理HDFS


机架感知(副本节点选择)


https://hadoop.apache.org/docs/stable3/hadoop-project-dist/hadoop-common/RackAwareness.html

https://hadoop.apache.org/docs/stable3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication

2)低版本Hadoop副本节点选择

第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于不相同机架的随机节点上。

第三个副本和第二个副本位于相同机架,节点随机。

万字长文梳理HDFS

3)新版本Hadoop副本节点选择

For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on the local machine if the writer is on a datanode, otherwise on a random datanode in the same rack as that of the writer, another replica on a node in a different (remote) rack, and the last on a different node in the same remote rack.

If the replication factor is greater than 3, the placement of the 4th and following replicas are determined randomly while keeping the number of replicas per rack below the upper limit (which is basically (replicas - 1) / racks + 2).

第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。

第二个副本和第一个副本位于相同机架,随机节点。

第三个副本位于不同机架,随机节点。

万字长文梳理HDFS


HDFS读数据流程


万字长文梳理HDFS

2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。

4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。


NameNode和SecondaryNameNode



NN和2NN工作机制


万字长文梳理HDFS

1)第一阶段:NameNode启动

(1)第一次启动NameNode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。

(2)客户端对元数据进行增删改的请求。

(3)NameNode记录操作日志,更新滚动日志。

(4)NameNode在内存中对数据进行增删改查。

2)第二阶段:Secondary NameNode工作

(1)Secondary NameNode询问NameNode是否需要checkpoint。直接返回NameNode是否checkpoint的结果。

(2)Secondary NameNode请求执行checkpoint。

(3)NameNode滚动正在写的edits日志。

(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。

(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。

(6)生成新的镜像文件fsimage.chkpoint。

(7)拷贝fsimage.chkpoint到NameNode。

(8)NameNode将fsimage.chkpoint重新命名成fsimage。


Fsimage和Edits解析


1)概念

namenode被格式化之后,将在/.../data/tmp/dfs/name/current目录中产生如下文件

edits_0000000000000000000

edits_inprogress_909090909090

fsimage_0000000000000000000

fsimage_0000000000000000000.md5

seen_txid(343706233-edits_inprogress_)

VERSION


VERSION文件内容:

#Mon Nov 25 13:36:16 CST 2019

namespaceID=435802200

clusterID=CID-b8d2042a-830a-4516-b0e5-bb44427cdb04

cTime=1559030356392

storageType=NAME_NODE

blockpoolID=BP-14441816-192.168.13.72-1559030356392

layoutVersion=-63

(1)Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息。 

(2)Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。 

(3)seen_txid文件保存的是一个数字,就是最后一个edits_的数字

(4)每次NameNode启动的时候都会将fsimage文件读入内存,并从00001开始到seen_txid中记录的数字依次执行每个edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将fsimage和edits文件进行了合并。

2)oiv查看fsimage文件

(1)查看oiv和oev命令

offline fsimage viewer 

offline edits viewer 

$ hdfs

oiv    apply the offline fsimage viewer to an fsimage

oev    apply the offline edits viewer to an edits file

(2)基本语法

hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径

$ hdfs oiv

Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE

Offline Image Viewer

View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,

saving the results in OUTPUTFILE.

3)oev查看edits文件

(1)基本语法

hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径

$ hdfs oev

Usage: bin/hdfs oev [OPTIONS] -i INPUT_FILE -o OUTPUT_FILE

Offline edits viewer

Parse a Hadoop edits log file INPUT_FILE and save results

in OUTPUT_FILE.


checkpoint时间设置


(1)通常情况下,SecondaryNameNode每隔一小时执行一次:3600秒。

[hdfs-default.xml]

<property>    <name>dfs.namenode.checkpoint.period</name>    <value>3600</value></property>


(2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。


<property> <name>dfs.namenode.checkpoint.txns</name>    <value>1000000</value> <description>操作动作次数</description></property>


<property>    <name>dfs.namenode.checkpoint.check.period</name>    <value>60</value> <description> 1分钟检查一次操作次数</description></property>


NameNode故障处理


NameNode故障后,可以采用如下两种方法恢复数据。

方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;

1)kill -9 namenode进程

2)删除NameNode存储的数据(/.../data/tmp/dfs/name)

$ rm -rf /.../data/tmp/dfs/name/*

3)拷贝SecondaryNameNode中数据到原NameNode存储数据目录

$ scp -r hdfs@hadoop1:/.../data/tmp/dfs/namesecondary/* ./name/

4)重新启动namenode

$ sbin/hadoop-daemon.sh start namenode

方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。

1)修改hdfs-site.xml中的


<property> <name>dfs.namenode.checkpoint.period</name> <value>120</value></property>
<property> <name>dfs.namenode.name.dir</name> <value>/.../data/tmp/dfs/name</value></property>


2)kill -9 namenode进程

3)删除NameNode存储的数据(/.../data/tmp/dfs/name)

$ rm -rf /.../data/tmp/dfs/name/*

4)如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件。

$ scp -r hdfs@hadoop1:/.../data/tmp/dfs/namesecondary ./

$ rm -rf in_use.lock

$ pwd

/.../data/tmp/dfs

$ ls

data  name  namesecondary

5)导入检查点数据(等待一会ctrl+c结束掉)

$ bin/hdfs namenode -importCheckpoint

6)启动namenode

$ sbin/hadoop-daemon.sh start namenode


集群安全模式


1)概述

NameNode启动时,首先将镜像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据镜像,则创建一个新的fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。


但是此刻,NameNode运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。


在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。

在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。


2)基本语法

集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。

(1)bin/hdfs dfsadmin -safemode get        (功能描述:查看安全模式状态)

(2)bin/hdfs dfsadmin -safemode enter      (功能描述:进入安全模式状态)

(3)bin/hdfs dfsadmin -safemode leave    (功能描述:离开安全模式状态)

(4)bin/hdfs dfsadmin -safemode wait    (功能描述:等待安全模式状态)

3)案例

模拟等待安全模式

(1)先进入安全模式

$ bin/hdfs dfsadmin -safemode enter

(2)执行下面的脚本

编辑一个脚本

#!/bin/bash

bin/hdfs dfsadmin -safemode wait

bin/hdfs dfs -put ~/hello.txt /root/hello.txt

(3)再打开一个窗口,执行

$ bin/hdfs dfsadmin -safemode leave


NameNode多目录配置


1)NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。

2)具体配置如下:

(1)在hdfs-site.xml文件中增加如下内容


<property> <name>dfs.namenode.name.dir</name>    <value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value></property>


(2)停止集群,删除data和logs中所有数据。

$ rm -rf data/ logs/

$ rm -rf data/ logs/

$ rm -rf data/ logs/

(3)格式化集群并启动。

$ bin/hdfs namenode –format

$ sbin/start-dfs.sh

(4)查看结果

$ ll


DataNode



DataNode工作机制


万字长文梳理HDFS

1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

4)集群运行中可以安全加入和退出一些机器。


数据完整性


1)当DataNode读取block的时候,它会计算checksum。

2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。

3)client读取其他DataNode上的block。

4)datanode在其文件创建后周期验证checksum。



掉线时限参数设置


DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。

HDFS默认的超时时长为10分钟+30秒。

如果定义超时时间为timeout,则超时时长的计算公式为:

timeout  = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。


<property> <name>dfs.namenode.heartbeat.recheck-interval</name> <value>300000</value></property><property> <name> dfs.heartbeat.interval </name> <value>3</value></property>


扩展新数据节点


0)需求:

随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。

1)环境准备

(1)克隆一台虚拟机【或新增一台物理机】

(3)修改xsync文件,增加新增节点的ssh无密登录配置

(4)删除原来HDFS文件系统留存的文件

    /.../data

2)添加新节点具体步骤

(1)在namenode的/.../etc/hadoop目录下创建dfs.hosts文件

$ pwd

/.../etc/hadoop

$ touch dfs.hosts

$ vi dfs.hosts

添加如下主机名称(包含新添加的节点)

hadoop2

hadoop3

hadoop4

hadoop5

(2)在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性 


<property> <name>dfs.hosts</name> <value>/.../etc/hadoop/dfs.hosts</value></property>

(3)刷新namenode

$ hdfs dfsadmin -refreshNodes

Refresh nodes successful

(4)更新resourcemanager节点

$ yarn rmadmin -refreshNodes

(5)在NameNode的slaves文件中增加新主机名称

    增加5  

hadoop2

hadoop3

hadoop4

hadoop5

(6)单独命令启动新的数据节点和节点管理器

$ sbin/hadoop-daemon.sh start datanode

$ sbin/yarn-daemon.sh start nodemanager

(7)在web浏览器上检查是否ok

3)如果数据不均衡,可以用命令实现集群的再平衡

$ ./start-balancer.sh


下线旧数据节点


1)在namenode的/.../etc/hadoop目录下创建dfs.hosts.exclude文件

$ pwd

/o.../etc/hadoop

$ touch dfs.hosts.exclude

$ vi dfs.hosts.exclude

添加如下主机名称(要下线的节点)

hadoop5

2)在namenode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性


<property> <name>dfs.hosts.exclude</name> <value>/.../etc/hadoop/dfs.hosts.exclude</value></property>


3)刷新namenode、刷新resourcemanager

$ hdfs dfsadmin -refreshNodes

$ yarn rmadmin -refreshNodes

4)检查web浏览器,下线节点的状态为decommission in progress(关闭中),说明数据节点正在复制块到其他节点。

5)等待下线节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。

注意:如果副本数是3,下线的节点小于等于3,是不能下线成功的,需要修改副本数后才能下线。

$ sbin/hadoop-daemon.sh stop datanode

$ sbin/yarn-daemon.sh stop nodemanager

6)从include文件中删除下线节点,再运行刷新节点的命令

(1)从namenode的dfs.hosts文件中删除下线节点hadoop5

hadoop2

hadoop3

hadoop4

(2)刷新namenode,刷新resourcemanager

$ hdfs dfsadmin -refreshNodes

$ yarn rmadmin -refreshNodes

7)从namenode的slave文件中删除下线节点hadoop5

hadoop2

hadoop3

hadoop4

8)如果数据不均衡,可以用命令实现集群的再平衡

$ sbin/start-balancer.sh


DataNode多目录配置


1)DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。

2)具体配置如下:

    hdfs-site.xml

<property>    <name>dfs.datanode.data.dir</name>    <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value></property>


HDFS 2.X新特性



集群间数据拷贝


1)scp实现两个远程主机之间的文件复制

scp -r hello.txt root@hadoop3:/user/hdfs/hello.txt        // 推 push

scp -r root@hadoop3:/user/hdfs/hello.txt  hello.txt        // 拉 pull

scp -r root@hadoop3:/user/hdfs/hello.txt root@hadoop4:/user/hdfs   //是通过本地主机中转实现两个远程主机的文件复制;如果在两个远程主机之间ssh没有配置的情况下可以使用该方式。

2)采用discp命令实现两个hadoop集群之间的递归数据复制

$  bin/hadoop distcp hdfs://haoop2:9000/user/hdfs/hello.txt 


Hadoop存档


1)hdfs存储小文件弊端

    每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此hadoop存储小文件会非常低效。

    因为大量的小文件会耗尽NameNode中的大部分内存。

    但注意,存储小文件所需要的磁盘容量和存储这些文件原始内容所需要的磁盘空间相比也不会增多。

    例如,一个1MB的文件以大小为128MB的块存储,使用的是1MB的磁盘空间,而不是128MB。

2)解决存储小文件办法之一

    Hadoop存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。

    具体说来,Hadoop存档文件对内还是一个一个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存。


快照管理


快照相当于对目录做一个备份。

并不会立即复制所有文件,而是指向同一个文件。

当写入发生时,才会产生新文件。

基本语法

(1)hdfs dfsadmin -allowSnapshot 路径   (功能描述:开启指定目录的快照功能)

(2)hdfs dfsadmin -disallowSnapshot 路径 (功能描述:禁用指定目录的快照功能,默认是禁用)

(3)hdfs dfs -createSnapshot 路径        (功能描述:对目录创建快照)

(4)hdfs dfs -createSnapshot 路径 名称   (功能描述:指定名称创建快照)

(5)hdfs dfs -renameSnapshot 路径 旧名称 新名称 (功能描述:重命名快照)

(6)hdfs lsSnapshottableDir             (功能描述:列出当前用户所有可快照目录)

(7)hdfs snapshotDiff 路径1 路径2     (功能描述:比较两个快照目录的不同之处)

(8)hdfs dfs -deleteSnapshot  (功能描述:删除快照)


回收站


1)默认回收站

默认值fs.trash.interval=0,0表示禁用回收站,可以设置删除文件的存活时间。

默认值fs.trash.checkpoint.interval=0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

要求fs.trash.checkpoint.interval<=fs.trash.interval。

2)启用回收站

修改core-site.xml,配置垃圾回收时间为1分钟。

<property>    <name>fs.trash.interval</name>    <value>1</value></property>

3)查看回收站

回收站在集群中的;路径:/user/hdfs/.Trash/….

4)修改访问垃圾回收站用户名称

进入垃圾回收站用户名称,默认是dr.who,修改为hdfs用户

[core-site.xml]


<property>    <name>hadoop.http.staticuser.user</name>    <value>hdfs</value></property>


5)通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站

Trash trash = New Trash(conf);

trash.moveToTrash(path);

6)恢复回收站数据

$ hadoop fs -mv /user/hdfs/.Trash/Current/user/hdfs/input    /user/hdfs/input

7)清空回收站

$ hadoop fs -expunge


HDFS 3.X新特性



1. HDFS支持数据的擦除编码,这使得HDFS在不降低可靠性的前提下,节省一半存储空间。

https://issues.apache.org/jira/browse/HDFS-7285

 

2. 多NameNode支持,即支持一个集群中,一个active、多个standby namenode部署方式。注:多ResourceManager特性在hadoop 2.0中已经支持。

https://issues.apache.org/jira/browse/HDFS-6440


HDFS HA高可用



HA概述


1)所谓HA(high available),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

4)NameNode主要在以下两个方面影响HDFS集群

NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启。

NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用。

HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。

如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。


HDFS-HA工作机制


通过双NameNode消除单点故障

HDFS-HA工作要点

1)元数据管理方式需要改变:

内存中各自保存一份元数据;

Edits日志只有Active状态的NameNode节点可以做写操作;

两个NameNode都可以读取edits;

共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)。

2)需要一个状态管理功能模块

实现了一个zkfailover,常驻在每一个NameNode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

3)必须保证两个NameNode之间能够ssh无密码登录。

4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

HDFS-HA自动故障转移工作机制

使用命令hdfs haadmin -failover手动进行故障转移,在该模式下,即使Active状态的NameNode已经失效,系统也不会自动从Active状态的NameNode转移到Standby状态的NameNode,下面通过配置部署HA自动进行故障转移。

自动故障转移为HDFS部署增加了两个新组件:

ZooKeeper和ZKFailoverController(ZKFC)进程。

ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。

HA的自动故障转移依赖于ZooKeeper的以下功能:

1)故障检测:

集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

2)Active NameNode选择:

ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为Active状态。如果目前Active的NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排它锁以表明它应该成为Active的NameNode。

ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。

每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

1)健康监测:

ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。ZKFC相当于NameNode的监视器。

如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

2)ZooKeeper会话管理:

当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。

如果本地NameNode处于Active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对临时节点的支持,如果会话终止,锁节点将自动删除。

3)Active 选举:

如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。

万字长文梳理HDFS


1. 一台NameNode假死了

2. 假死NameNode所在机器的zkfc检测到假死

3. 通知另外一台NameNode的zkfc

4. 另外一台zkfc就会强行ssh kill -9杀死假死的NameNode

5. 如果ssh失败则调用用户自定义脚本程序,比如poweroff直接关机或者重启服务器

6. 正常NameNode的zkfc获取命令运行结果

7. 激活本台NameNode 切换为Active


HDFS-HA集群配置


https://hadoop.apache.org/docs/stable3/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html


HDFS Federation架构设计


1)NameNode架构的局限性

(1)Namespace(命名空间)的限制

由于NameNode在内存中存储所有的元数据(metadata),因此单个NameNode所能存储的对象(文件+块)数目受到NameNode所在JVM的heap size的限制。

50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个datanode,12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。

单个datanode从4T增长到36T,集群的尺寸增长到8000个datanode。

存储的需求从12PB增长到大于100PB。

(2)隔离问题

由于HDFS仅有一个NameNode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。

(3)性能的瓶颈

由于是单个NameNode的HDFS架构,因此整个HDFS文件系统的吞吐量受限于单个NameNode的吞吐量。

2)HDFS Federation架构设计

能不能有多个NameNode,分别负责不同的业务数据?


NameNode NameNode NameNode
元数据 元数据 元数据
Log machine 电商数据/话单数据

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/Federation.html


3)HDFS Federation应用思考

不同应用可以使用不同NameNode进行数据管理

图片业务、爬虫业务、日志审计业务

Hadoop生态系统中,不同的框架使用不同的NameNode进行管理NameSpace。(隔离性)




【End】





1读、2说、3问

is_running = True

while is_running:

    网络

    输入

    数据结构算法CPU内存硬盘

    输出 

    网络

    硬盘


理解力是衡量学习效益的重要指标,它包括【整体思考的能力|洞察问题的能力|想象力、类比力|直觉力|解释力】:

------ 整体思考的能力 ------

学习需要借助积极的思维活动,弄清事物的意义,把握事物的结构层次,理解事物本质特征和内部联系,需要对学习材料作整体性的思考。

因此,个体应该培养自身的全局观点,考虑问题要从大局出发,着眼于整体问题的解决。

这是因为整体思考能力的强弱影响着个体的学习效果。

【百科】




以上是关于[Hadoop]万字长文Hadoop相关优化和问题排查总结的主要内容,如果未能解决你的问题,请参考以下文章

一篇长文梳理Hadoop YARN和MapReduce优化

Java开发快速学习!万字长文轻松彻底入门spring

万字长文!总结 Vue 性能优化方式及原理(收藏)

万字长文解密webpack-基本使用/高级用法/性能优化 你想要的全都有!!!

万字长文带你走进MySql优化(系统层面优化软件层面优化SQL层面优化)

Flink 1.14.0 内存优化你不懂?跟着土哥走就对了(万字长文+参数调优)