HDFS部署最佳实践

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github:https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.文档编写目的


HDFS是组成Hadoop平台的关键服务,部署的正确与否直接影响到你整个集群的健康状态,以及所有应用能否正常的运行或者高效的运行,包括SQL,MapReduce,Spark等。前面Fayson也介绍过《CDH网络要求(Lenovo参考架构)》,《CDH安装前置准备》,《如何为Hadoop集群选择正确的硬件》和《如何给Hadoop集群划分角色》,都是和如何正确部署集群相关的。这里再把HDFS服务单独拎出来,专门说明一下,希望大家在部署一个Hadoop集群时就进行科学的规划设计,从而避免上线了,已经存储了大量数据了还要调优HDFS。如果你不是采用正确的姿势来部署HDFS的话,常见你可能会碰到以下问题:

1.NameNode经常故障或者切换

2.写入性能低下

3.Checkpoints需要很久才完成

4.High disk queue length (await)

5.与Zookeeper失去连接

为了集群的正常运作,打好良好的基础是非常重要的。对一个集群在各方面进行适当的配置可以避免性能或任何不可预见的问题。本文重点介绍生产环境中必须规避的关键配置错误。

2.角色和主机


在Hadoop集群中一般有以下两种角色:

1.master (NameNode-NN, Journal Node-JN, Zookeeper-ZK, HBase Master, Resource Manager-RM)

2.worker/slave (Region Server-RS, DataNodes-DN, NodeManager-NM)

注意:不要把2个NameNode部署在同一台主机。不要把管理节点(JN, NN, ZK等)部署在工作节点上(DN, NM, RS等)。所有的ZK都不要和其他写入密集型角色(比如DN)放在同一台主机。

建议为JN和NN选择专门的主机以实现冗余目的。

1.集群最多可容忍两个主机故障(1个是NN,1个是JN)。

2.所有内存都可以让NN使用从而用于装在HDFS元数据。

3.ZK可以部署在专门的JN或NN主机上,但它必须配置单独的磁盘 - JBOD(请参阅下面的磁盘要求)。

注意:JNs通过shared edits来记录所有对HDFS的操作,并且可以保证2个NN的同步。与NN部署在同一个节点并不能较好的保障集群的可用性,比如NN与JN这台服务器整体故障。如果是小集群,我们可以这样部署,但是必须为NameNode元数据与JN的edits配置不同盘。对于较大的集群,建议选择单独的服务器部署JN和ZK。

在任何情况下,如果JN,NN和ZK运行在同一台主机:

1.JN,NN和ZK这三个管理角色必须配置专门的JBOD磁盘。(参考下面的磁盘要求章节)

2.Cloudera Manager可以与其他的管理角色部署在同一台服务器,但是不要与工作节点公用。见下面图3。

对于不同规模的集群角色具体如何划分可以参考Fayson之前的文章《如何给Hadoop集群划分角色

3.磁盘要求


I/O模式:NN一般执行长读和短写,ZK一般执行较小的写操作。因此在管理节点之间,或者管理节点与工作节点之间共享磁盘,会导致磁盘争用问题,从而对集群性能造成影响,甚至导致整个集群挂掉比如负载特别高的时候。

3.1.选择什么磁盘?(RAID vs. no-RAID, Local vs. Remote)


专门的磁盘意味着不同的物理磁盘。不建议使用LVM,因为它增加了延迟,不同的目录不代表使用不同的磁盘,而我们要求的是使用不同的磁盘。在磁盘挂载时,对于DN的数据盘必须使用noatime,因为它直接影响集群的性能。具体可以参考Fayson之前写的文章《CDH安装前置准备》。

3.2.DataNodes


1.磁盘使用non-RAID/JBOD (pass-through)模式

2.不要使用RAID/LVM/ZFS将多块磁盘合并到一个卷

3.将多个磁盘合并到一个卷会导致DN将更多数据存储到磁盘上,所以在启动时,它会发送一个非常大的数据块报告,而不是每个磁盘一个,并且它不是多线程的。这会降低DNs的启动时间。

4.块校验(checking blocks against bit-rot)是单线程的。

注意:建议将数据盘的挂载点设置为不可变(chattr + i)。这样可以避免DataNodes在数据盘挂载失败时,HDFS数据会写入根目录。

3.3.NameNodes


NameNodes在执行大量磁盘I/O操作时需要专用磁盘。

1.非HA模式

必须备份元数据(edits),配置dfs.namenode.edits.dir使用本地磁盘(或非常低延迟的远程磁盘)。在写入数据时,NN必须保证提交所有其他磁盘也成功(如果配置了多块元数据存储磁盘),网络磁盘或者远程磁盘如果发生任何延迟都可能导致性能或同步问题。

2.HA模式

在较旧的版本中,dfs.namenode.shared.edits.dir是用于NFS-based HA。CDH5.0或更高版本后,JNs会用来存储edits,就不需要dfs.namenode.shared.edits.dir了。

注意:

推荐为NN的数据盘(dfs.name.dir, dfs.namenode.dir)使用RAID1或者RAID10。

果配置了dfs.namenode.edits.dir(非HA)或dfs.namenode.shared.edits.dir(HA),如果一个文件系统损坏,在修复坏的文件系统之前,NN都会启动不了。

更换失败磁盘:更换磁盘后,在挂载点目录必须配置正确的权限和属组(chown root和chmod700)。

3.4.JournalNodes


dfs.journalnode.edits.dir(默认是/dfs/jn)必须挂载到一块专门的JBOD磁盘,并且不能与其他任何角色或者操作系统共享。

3.5.Zookeepers


dataDir(默认是/var/lib/zookeeper)和dataLogDir(默认是 /var/lib/zookeeper)可以挂载到一块相同的JBOD磁盘,但不能与其他任何角色或者操作系统共享。ZK不仅受其数据磁盘上的磁盘延迟影响,写入日志还会阻塞ZK JVM。

下图是如何配置磁盘和主机的最佳实践:

图1

图2

图3

4.其他注意事项

4.1.操作系统


1.集群所有主机的swappiness设置为0或者1,参考:

https://access.redhat.com/solutions/1149413

2.集群所有主机关闭透明大页面,参考:

https://access.redhat.com/solutions/46111

4.2.回收站


启用HDFS的回收站功能,而且最好不要使用-skipTrash命令。

4.3.节点下线


每次下线DataNode不要超过2台,因为副本默认是3,这样做会导致数据损坏或者数据丢失。

4.4.内存要求


一般我们为1百万个块配置1GB的heap给NN,如果集群更忙可能需要更多。

4.5.Handlers


1.如果性能下降,可以考虑增大NN的handler thread

2.确保dfs.namenode.handler.count和dfs.namenode.service.handler.count设置为相同的值

3.启用NameNode服务的RPC端口(dfs.namenode.servicerpc-address)

4.ZK的最大连接数最少设置为300(默认是60)

4.6.快照


1.启用HDFS快照以防止数据意外删除

2.Volume choosing policy(防止DNs的数据分布不均匀)

默认的策略是Round Robin。一旦DN开始接受并写入block,就会以Round Robin选择磁盘。如果更换了磁盘,就会导致磁盘存储数据的不均衡。将策略改为Available Space可以确保磁盘的使用均衡。

如果在DN中有大小不同的磁盘,建议使用Available Space策略。

4.7.Balancer


HDFS Balancer - 经常运行HDFS balancer。Balancer仅仅只会在DN之间均衡数据(基于rebalancing阈值,默认是10%)。如果小文件很多导致性能低下,可以调大 dfs.datanode.balance.max.concurrent.moves。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛肉圆粉不加葱

ResourceManager剖析

11120
来自专栏祝威廉

StreamingPro 再次支持 Structured Streaming

之前已经写过一篇文章,StreamingPro 支持Spark Structured Streaming,不过当时只是玩票性质的,因为对Spark 2.0+ 版...

10230
来自专栏编程坑太多

跟我一起学docker(16)--单节点mesos集群

19430
来自专栏Hadoop实操

如何在CDSW上创建Git工程

在CDSW上有多中创建工程的方式(创建一个空的工程、模板工程、本地上传工程或者是创建git工程),前面的都比较好理解,那如何在CDSW上创建Git工程呢?本篇文...

37230
来自专栏数据派THU

独家 | 一文读懂Hadoop(二)HDFS(上)

随着全球经济的不断发展,大数据时代早已悄悄到来,而Hadoop又是大数据环境的基础,想入门大数据行业首先需要了解Hadoop的知识。2017年年初apache发...

664100
来自专栏加米谷大数据

技术干货 | Hadoop3.0稳定版安装攻略来啦!

第一次安装Apache Hadoop3.0.0是不是状况百出?没关系安装攻略来啦! ? Apache Hadoop 3.0.0在前一个主要发行版本(hadoop...

55690
来自专栏cloudskyme

Hadoop使用(二)

前提和设计目标 硬件错误 硬件错误是常态而不是异常。HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。我们面对的现实是构成系统的组件...

377100
来自专栏Hadoop实操

Cloudera Manager管理控制台

Cloudera Manager管理控制台(Cloudera Manager Admin Console)是一个基于Web的用户界面,用于配置,管理和监控CDH...

1.4K110
来自专栏性能与架构

HDFS 核心原理

HDFS(Hadoop Distribute File System)是一个分布式文件系统 文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文件放到...

33970
来自专栏恰童鞋骚年

Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我...

27910

扫码关注云+社区

领取腾讯云代金券