赞
踩
Bandwidth-带宽
带宽用多会影响到线上业务的任务运行,带宽用的少会导致数据同步过慢。
Performance-性能
采用简单的单机程序?还是多线程的性能更加的分布式程序?
Data-Increment 增量同步:
当数据是TB、PB级别是,如果每次都以全量的方式同步数据,结果一定非常糟糕。如果仅针对变化的增量数据进行同步将会是不错的选择。可以配合HDFS快照等技术实现增量数据同步
Syncable-数据迁移的同步性
同步要能够在周期内完成,如果不能够按时完成则无法实现数据的一致性。
数据迁移
,定期在集群之间和集群内部备份数据底层使用的是MapReduce
,在集群之间或并行在同一集群内复制文件,执行复制的MapReduce只有mapper阶段
DistCp可以通过命令参数 bandwidth来为程序进行带宽限流
在DistCp中可以通过update、append和diff三个参数来实现增量同步
Update: 只拷贝不存在的文件或者目录
Append:追加写目标路径下已存在的文件。
Diff 通过快照的diff对比信息来同步远端路径与目标路径
DistCp底层使用MapReduce执行数据同步,MapReduce本是是一类分布式程序
$ hadoop distcp
usage: distcp OPTIONS [source_path...] <target_path>
-append //拷贝文件时支持对现有文件进行追加写操作
-async //异步执行distcp拷贝任务
-bandwidth <arg> //对每个Map任务的带宽限速
-delete //删除相对于源端,目标端多出来的文件
-diff <arg> //通过快照diff信息进行数据的同步
-overwrite //以覆盖的方式进行拷贝,如果目标端文件已经存在,则直接覆盖
-p <arg> //拷贝数据时,扩展属性信息的保留,包括权限信息,块大小信息等等
-skipcrccheck //拷贝数据时是否跳过cheacksum的校验
-update //拷贝数据时,只拷贝相对于源端 ,目标端不存在的文件数据
source_path、target_path需要带上地址前缀区分不同的集群
在Linux中,存在一个技术叫做Unix Domain Socket
,这种技术是一种进程间的通讯方式
,他使得同一个机器上的两个进程能以Socket的方式进行通讯
。它带来的最大的好处是利用他两个进程除了可以传递普通数据外,还可以在进程间传递文件描述符
假设机器上的两个用户A和B,A拥有访问某个文件的权限而B没有,而B又需要访问这个文件。借助Unix DomainSocket,可以让A打开文件得到一个文件描述符,然后将文件描述符传递给B,B就能读取文件里面的内容了,即使没有相应的权限。
在HDFS的场景里面,A就是DataNode,B就是DFSClient,需要读取的文件就是DataNode数据目录中的某个文件
配置短路本地读取,需要一个配置文件:libhadoop.so,因为hadoop不能够不能直接操作Unix DOmain Socket,所以需要安装Hadoop下的native包的libhadoop.so。
hadoop checknative
运行结果如下:
这里已经进行了安装
配置文件格式如下:
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
需要注意的是dfs.domain.socket.path 这里需要提前准备文件夹,这个文件夹只需要创建到/var/lib/hadoop-hdfs即可,dn_socket是由datanode自己创建的且不是文件夹。
查看日志直接查找字段/var/lib
查找结果如下:
可以看到已经对此进行了一个监听,表明启动成功。
在本地进行一个下载,下载后查看日志。
在hadoop132-father节点上执行:
hadoop fs -get /wechatpay.png /opt/
下载成功,去查看日志:
这里显示已经是短路本地读取。
HDFS数据可能并不总是在DataNode直剑均匀分布。一个常见的原因就是向现有的集群添加新的DataNode。HDFS提供了一个Balancer程序,分析Block防止信息并且在整个DataNode节点之间屏风数据,知道被视为平衡位置。
平衡条件: 所谓的平衡指的是每个DateNode的利用率(本机已用的空间与本机总容量之比)与集群的利用率(HDFS整体已用的空间与HDFS集群总容量之比)只差不超过相应的阈值百分比
,就认为是平衡的
平衡器无法再耽搁DataNode上的各个卷(磁盘)之间进行平衡
hadoop balancer [参数]
参数:
-threshold 10 # 集群平衡条件,datanode 间磁盘使用率相差阈值,选择区间在0~100,0表示绝对平衡
-policy datanode # 平衡策略,默认为datanode,如果datanode平衡则集群已经平衡
-exclude -f /tmp/ip1.txt # 默认为空,指定该部分ip不参加平衡, -f:指定输入为文件
-include -f /tmp/ip1.txt # 默认为空,指定只允许该部分ip参加平衡, -f:指定输入为文件
-idleiterations 5 #迭代 5
hdfs dfsadmin -setBalancerBandwidth newBandwidth
newBandwidth 表示的是每个DataNode再平衡期间可以使用的最大网络宽带量,以每秒字节数为单位。
设置带宽是为了防止处于业务繁忙期时数据迁移占用了大量网络,使业务处理速度缓慢
例如:
hdfs dfsadmin -setBalancerBandwidti 104857600
104857600 字节= 100M
直接
hdfs balancer [参数]
参数可以不填,这样子则是按照默认参数运行。
例如:
hdfs balancer -threshold 5
表示Balancer将以阈值为5%进行运行(默认为10%)
相对于个人PC,服务器一半可以挂在多块磁盘来扩大单机的存储能力。在Hadoop HDFS中,DataNode负责最终数据block的存储,在所在机器上的磁盘见分配数据块。当写入新的block时,DataNodes将根据选择策略(循环策略和可用空间策略)来选择block的磁盘
旧策略
他将新block均匀分布在可用磁盘上,默认为此策略
长期使用循环策略,DataNode有时会不均匀的填充其存储目录(磁盘/卷),从而导致某些磁盘已满而其他磁盘却很少使用的情况。发生这种情况很可能是由于大量数据的写入和删除操作,也可能时更换了磁盘
此策略将数据写入具有更多可用空间(按百分比)的磁盘
采用此策略,测每个新写入的数据都会写入到刚添加的磁盘中,从而使在该期间其他磁盘处于空闲状态,而,这将在新磁盘上创建瓶颈
这时候需要一种Intra DataNode Balanceing(DataNode 内数据块的均匀分布)来解决Intra-DataNode倾斜,这种倾斜是由于粗盘更换或者随机写入和删除而发生的。。
在Hadoop 3.0 引入了Disk Balancer的工具,专注于解决DataNode内分发数据问题
HDFS Disk Balancer作用是平衡DataNode中的数据在磁盘之间分配不均匀问题。其中HDFS Disk Balancer 与 HDFS Balancer是不同的。
HDFS Disk Balancer针对于给定的DataNode进行操作,并将block从一个磁盘移动到另一个磁盘,是DataNode内部数据在不同磁盘间的平衡
HDFS Balancer 平衡的是DataNode之间的分布
为了衡量集群中哪些计算机遭受数据分布不均匀的影响,磁盘平衡器定义了Volume Data Density metric(卷/磁盘数据密度亮度标准)和Node Data Density metric(节点数据密度亮度标准)
在得知那些卷已经超量配额,那些卷已经不足,Hadoop开发实现了基于PRC协议的Disk Balancer将数据从一个盘移动到另一个盘
不会跨机器进行
默认情况已经开启,需要调整可以在hdfs-site.xml
文件中调整dfs.disk.balancer.enabled
参数值,选择在hadoop中选择是否开启磁盘平衡器
hdfs diskbalancer -plan <datanode>
作用:查看是否需要进行磁盘平衡
其他参数
-out //控制计划文件的输出位置
-bandwidth //设置用于运行Disk Balancer的最大带宽。默认带宽10 MB/s。
–thresholdPercentage //定义磁盘开始参与数据重新分配或平衡操作的值。默认的thresholdPercentage值为10%,这意味着仅当磁盘包含的数据比理想存储值多10%或更少时,磁盘才用于平衡操作。
-maxerror //它允许用户在中止移动步骤之前为两个磁盘之间的移动操作指定要忽略的错误数。
-v //详细模式,指定此选项将强制plan命令在stdout上显示计划的摘要。
-fs //此选项指定要使用的NameNode。如果未指定,则Disk Balancer将使用配置中的默认NameNode。
hdfs diskbalancer -execute <json file path>
execute命令针对为其生成计划的Datanode执行计划
hdfs diskbalancer -query <datanode>
query 命令从运行疾患的DataNode获取HDFS磁盘平衡器的当前状态
hdfs diskbalancer -cancel <JSON file path>
hdfs diskbalancer -cancel planID node <nodename>
calcel命令取消运行计划
hdfs diskbalancer -fs hdfs://nn_host:8020 -report
此时全部都是0.00,表示各个卷的磁盘比较均衡
为了提高容错率,HDFS会根据replication factor(复制因子)在不同的DataNode上复制文件快
默认的复制因子为3(表示本身一份,副本2份),除了原始数据块,还有两个额外的副本,每个副本使用100%的存储开销,因此导致200%的存储开销,这些副本也小号其他资源,例如网络宽带。
在复制因子为N时,存在N-1个容错能力
,但是存储效率仅为1/N
纠删码技术简称EC,是一种编码容错技术,最早是用于通信行业,数据传输中的数据恢复。他使用过对数据进行分块,然后计算出校验数据,使得各个部分的数据产生关联性。当一部分数据块丢失时,可以通过剩余的数据块和校验块计算出丢失的数据块。
Hadoop在3.0以后引进了纠删码技术,它可以提高50%以上的存储利用率,并且保证数据的可靠性
Reed-Solomon 码是一种常用的纠删码,他有两个参数k和m,记为RS(k,m),k和m分别代表数据块的数量,m表示校验块的数量。
k个数据块组成一个向量被乘上一个生成矩阵GT从而得到一个码字向量,该向量由k个数据块和m个校验快(c0,c1)构成
如果数据块丢失,可以使用GT逆矩阵乘以码字向量来恢复出丢失的数据块
既保证了数据的安全保证了若挫屡,也提高了磁盘的使用率
编码和解码工作会消耗HDFS客户端和DataNode上额外的的CPU
由于纠删码文件也分布在整个机架上,以实现机架的容错率,这就意味着在读写条带化文件时,大多数操作都是在机架上进行的,因此网络带宽也十分重要。
对于机架容错,拥有足够数量的机架也十分重要
。每个机架所容纳的块数不超过EC就校验块的数。机架数量=(数据块+奇偶校验块)/奇偶校验块 取整
纠删码策略由参数dfs.namenode.ec.system.default.policy指定,默认是RS-6-3-1024K
,其他策略默认是禁用的。可以通过hdfs ec
[-enablePolicy -policy <policyName>]命令启动策略集
RS-6-3-1024k 6表示6个数据块 3 表示3个奇偶校验块,1024k表示条带化的数据大小
默认RS编码器的HDFS本机实现利用Intel ISA-L库来改善编码和解码计算。要启用和使用 Intel RSA-L,需要执行三个步骤。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。