• HDFS运维和优化


    常见问题

    下面列举HDFS运行过程中可能出现的常见问题及解决方法,这些问题一般都会在日志中出现的相应的记录。
    Incompatible clusterIDs in … :namenode clusterID = … ,datanode clusterIDs =…
    出现该错误是由于NameNode重新格式化后会被赋予新的namespaceID,这个ID与DataNode不一致而导致的。解决该错误的方法有三种:

    • 删除datanode上的数据目录(如果DataNode上的数据无关紧要,可以这么做);
    • 修改DataNode上的clusterID与NameNode一致,具体的是将${dfs.datanode.data.dir}/current/VERSION文件中的clusterID改成与NameNode上的一致;
    • 重新指定DataNode的数据目录(修改配置项dfs.datanode.data.dir)。

    ... could only be replicated to 0 nodes, instead of 1 …
    出现这个错误说明没有可用的DataNode可供操作,其原因有多种,

    • DataNode中XceiverServer的连接数超过了指定阈值
    • 磁盘空间不足
    • 防火墙导致无法访问DataNode

    解决方法的关键是提供可用的DataNode,主要有如下几种方式:

    • 防火墙设置导致无法连接DataNode的情形,可以通过关闭防火墙来解决;
    • 重新格式化NameNode也可以解决这个问题;
    • 磁盘空间不足可以通过增加单节点容量或添加新DataNode节点来解决;
    • 并发过大导致连接数超过阈值的情况也可以通过添加DataNode节点来解决。

    ...ipc.Client: Retrying connect to server:...
    这个错误主要是由于错误的端口配置导致的,请仔细检查core-site.xml和hdfs-site.xml文件,同时,还需确认/etc/hosts文件是否包含了所需组件的网络地址映射。
     java.net.NoRouteToHostException: No route to host
    这个错误说明找不到主机,请检查网络连接是否正常,防火墙是否关闭。
    ...org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid value for volsFailed : 3 , Volumes tolerated : 0...
    磁盘损坏会导致该错误。检查并更换损坏的磁盘即可。

    全SSD盘的环境下,HDFS客户端版本ABI不兼容导致无法写数据的问题

    在全SSD机型的服务器上,如果应用使用的HDFS客户端jar包版本与服务端不一致,会导致无法写入数据的问题。

    该问题是由于HDFS客户端ABI不兼容导致的,在HDFS 2.5.x版本中,对存储策略的编号与HDFS 2.6.x版本的编号不一致,在全SSD机型中,客户端写入数据的策略被定义为HOT,而在服务端,该策略被解析为DISK,因为全SSD机型中不存在SATA盘,所以无法获取可行的磁盘,导致无法写入数据。

    HDFS优化

    优化Linux文件系统

    noatime和nodiratime属性 
    Linux文件系统会记录文件创建、修改和访问操作的时间信息,这在读写操作频繁的应用中将带来不小的性能损失。在挂载文件系统时设置noatime和nodiratime可禁止文件系统记录文件和目录的访问时间,这对HDFS这种读取操作频繁的系统来说,可以节约一笔可观的开销。可以修改/etc/fstab文件来实现这个设置。
    $ vim /etc/fstab
    如对/mnt/disk1使用noatime属性,可以做如下修改:
    / ext4 defaults 1 1
    /mnt/disk1 ext4 defaults,noatime 1 2
    /mnt/disk2 ext4 defaults 1 2
    /mnt/disk3 ext4 defaults 1 2
    /mnt/disk4 ext4 defaults 1 2
    /mnt/disk5 ext4 defaults 1 2
    /mnt/temp ext4 defaults 1 2
    swap swap defaults 0 0
    tmpfs /dev/shm tmpfs defaults 0 0
    devpts /dev/pts devpts gid=5,mode=620 0 0
    sysfs /sys sysfs defaults 0 0
    proc /proc proc defaults 0 0
    修改完成后,运行下述命令使之生效:
    $ mount –o remount /mnt/disk1
    预读缓冲
    预读技术可以有效的减少磁盘寻道次数和应用的I/O等待时间,增加Linux文件系统预读缓冲区的大小(默认为256 sectors,128KB),可以明显提高顺序文件的读性能,建议调整到1024或2048 sectors。预读缓冲区的设置可以通过blockdev命令来完成。下面的命令将/dev/sda的预读缓冲区大小设置为2048 sectors。
    $ blockdev –setra 2048 /dev/sda
    注意:预读缓冲区并不是越大越好,多大的设置将导致载入太多无关数据,造成资源浪费,过小的设置则对性能提升没有太多帮助。
    不使用RAID 
    应避免在TaskTracker和DataNode所在的节点上进行RAID。RAID为保证数据可靠性,根据类型的不同会做一些额外的操作,HDFS有自己的备份机制,无需使用RAID来保证数据的高可用性。
    不使用LVM
    LVM是建立在磁盘和分区之上的逻辑层,将Linux文件系统建立在LVM之上,可实现灵活的磁盘分区管理能力。DataNode上的数据主要用于批量的读写,不需要这种特性,建议将每个磁盘单独分区,分别挂载到不同的存储目录下,从而使得数据跨磁盘分布,不同数据块的读操作可并行执行,有助于提升读性能。
    JBOD
    JBOD是在一个底板上安装的带有多个磁盘驱动器的存储设备,JBOD没有使用前端逻辑来管理磁盘数据,每个磁盘可实现独立并行的寻址。将DataNode部署在配置JBOD设备的服务器上可提高DataNode性能。

    优化HDFS配置

    HDFS提供了十分丰富的配置选项,几乎每个HDFS配置项都具有默认值,一些涉及性能的配置项的默认值一般都偏于保守。根据业务需求和服务器配置合理设置这些选项可以有效提高HDFS的性能。表3-7列出了可优化的配置选项及参考值。
    表3-7HDFS可优化配置项参考

    配置项

    优化原理

    推荐值

    dfs.namenode.handler.count

    NameNode中用于处理RPC调用的线程数,默认为10。对于较大的集群和配置较好的服务器,可适当增加这个数值来提升NameNode RPC服务的并发度。

    64

    dfs.datanode.handler.count

    DataNode中用于处理RPC调用的线程数,默认为3。可适当增加这个数值来提升DataNode RPC服务的并发度。 
    *线程数的提高将增加DataNode的内存需求,因此,不宜过度调整这个数值。

    10

    dfs.replication

    数据块的备份数。默认值为3,对于一些热点数据,可适当增加备份数。

    3

    dfs.block.size

    HDFS数据块的大小,默认为64M。数据库设置太小会增加NameNode的压力。数据块设置过大会增加定位数据的时间。

    128

    dfs.datanode.data.dir

    HDFS数据存储目录。如3.3.1所述,将数据存储分布在各个磁盘上可充分利用节点的I/O读写性能。

    设置多个磁盘目录

    hadoop.tmp.dir

    Hadoop临时目录,默认为系统目录/tmp。在每个磁盘上都建立一个临时目录,可提高HDFS和MapReduce的I/O效率。

    设置多个磁盘目录

    io.file.buffer.size

    HDFS文件缓冲区大小,默认为4096(即4K)。

    131072(128K)

    fs.trash.interval

    HDFS清理回收站的时间周期,单位为分钟。默认为0,表示不使用回收站特性。

    为防止重要文件误删,可启用该特性

    dfs.datanode.du.reserved

    DataNode保留空间大小,单位为字节。默认情况下,DataNode会占用全部可用的磁盘空间,该配置项可以使DataNode保留部分磁盘空间工其他应用程序使用。

    视具体应用而定

    机架感应

    对于较大的集群,建议启用HDFS的机架感应功能。启用机架感应功能可以使HDFS优化数据块备份的分布,增强HDFS的性能和可靠性。

    -

  • 相关阅读:
    【爬虫】Python获取星巴克所有产品
    【爬虫】Java爬取省市县行政区域统计数据
    【PostgreSQL】下载安装PgSQL
    【Big Data】 DBeaver连接Phoenix
    【SpringMVC】 Controller接收深度复杂对象封装不到的问题
    【MybatisPlus】联表分页查询实现
    【爬虫】Java爬取KFC全国门店信息
    Optional类的初体验
    Oracle版本的xxljob
    idea中Git根据需要还原到指定版本
  • 原文地址:https://www.cnblogs.com/warmingsun/p/6657351.html
Copyright © 2020-2023  润新知