美文网首页
hadoop机架感知配置数据balance,datanode s

hadoop机架感知配置数据balance,datanode s

作者: 邵红晓 | 来源:发表于2021-09-10 16:55 被阅读0次

前提

hdfs dfsadmin -setBalancerBandwidth 524288000
/usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 1
hdfs balancer -policy datanode -threshold 1
注意修改参数,加快balance
dfs.datanode.balance.max.concurrent.moves=5 默认,修改为1024
dfs.datanode.balance.bandwidthPerSec=6250000 5m 修改为524288000 500m
dfs.datanode.max.transfer.threads = 4096 如果果运行hbase的话建议改成12288
在执行数据重分布的过程中,Rebalance Server来执行Rebalance操作,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个rack中所具备的block数量(因为这个,会导致不同机架之间数据不平衡),所以来了解一下机架信息。
HDFS在冗余方面,考虑机架之间的冗余。
三副本块存储的时候,第一个块存储离client最近的节点DN1,第二块存储在和DN1不在同一个机架上的节点DN2,第三个块存储离DN1近的节点DN3。

ambari配置

net.topology.script.file.name=/etc/hadoop/conf/topology_script.py

image.png
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''

import sys, os
from string import join
import ConfigParser


DEFAULT_RACK = "/default-rack"
DATA_FILE_NAME =  os.path.dirname(os.path.abspath(__file__)) + "/topology_mappings.data"
SECTION_NAME = "network_topology"

class TopologyScript():

  def load_rack_map(self):
    try:
      #RACK_MAP contains both host name vs rack and ip vs rack mappings
      mappings = ConfigParser.ConfigParser()
      mappings.read(DATA_FILE_NAME)
      return dict(mappings.items(SECTION_NAME))
    except ConfigParser.NoSectionError:
      return {}

  def get_racks(self, rack_map, args):
    if len(args) == 1:
      return DEFAULT_RACK
    else:
      return join([self.lookup_by_hostname_or_ip(input_argument, rack_map) for input_argument in args[1:]],)

  def lookup_by_hostname_or_ip(self, hostname_or_ip, rack_map):
    #try looking up by hostname
    rack = rack_map.get(hostname_or_ip)
    if rack is not None:
      return rack
    #try looking up by ip
    rack = rack_map.get(self.extract_ip(hostname_or_ip))
    #try by localhost since hadoop could be passing in 127.0.0.1 which might not be mapped
    return rack if rack is not None else rack_map.get("localhost.localdomain", DEFAULT_RACK)

  #strips out port and slashes in case hadoop passes in something like 127.0.0.1/127.0.0.1:50010
  def extract_ip(self, container_string):
    return container_string.split("/")[0].split(":")[0]

  def execute(self, args):
    rack_map = self.load_rack_map()
    rack = self.get_racks(rack_map, args)
    print rack

if __name__ == "__main__":
  TopologyScript().execute(sys.argv)

这个脚本核心功能是从配置文件读取机器的机架信息,通过输入IP或HostName获取机器位置信息,支持多个参数输入
topology_mappings.data文件内容如下:

[network_topology]
shyt-hadoop-4030.xx.com.cn=/default-rack
10.xx.xx.30=/default-rack
shyt-hadoop-4020.xx.com.cn=/default-rack
10.xx.xx.20=/default-rack

如果脚本配置文件为空,返回/default-rack。重点在runResolveCommand调用执行脚本,输出机器机架信息。

问题 HDFS运行Balancer异常终止,提示Another Balancer is running..导致Balancer失败的问题

前提
HDFS运行Balancer会在hdfs文件系统中生成 /system/balancer.id
hdfs dfs -cat /system/balancer.id
shyt-hadoop-4028.xx.com.cn

通常,HDFS执行Balance操作结束后,会自动释放“/system/balancer.id”文件,可再次正常执行Balance。
但在上述场景中,由于第一次的Balance操作是被异常停止的,所以第二次进行Balance操作时,“/system/balancer.id”文件仍然存在,则会触发append /system/balancer.id操作,进而导致Balance操作失败。
如果“/system/balancer.id”文件的释放时间超过了软租期60s,则第二次执行Balance操作的客户端的append操作会抢占租约,此时最后一个block处于under construction或者under recovery状态,会触发block的恢复操作,那么“/system/balancer.id”文件必须等待block恢复完成才能关闭,所以此次append操作失败。

append /system/balancer.id操作失败后,会向客户端抛出RecoveryInProgressException异常:

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.protocol.RecoveryInProgressException): 
Failed to APPEND_FILE /system/balancer.id for DFSClient because lease recovery is in progress. Try again
 later.

如果该文件的释放时间没有超过默认设置60s,原有客户端会继续持有该租约,则会抛出AlreadyBeingCreatedException异常,实际上向客户端返回的是null,导致客户端出现如下异常:
java.io.IOException: Cannot create any NameNode Connectors.. Exiting...

可通过以下方法避免上述问题:
方案1:等待硬租期超过1小时后(namenode lease 超时时间是一小时),原有客户端释放租约,再执行第二次Balance操作。
方案2:执行第二次Balance操作之前删除“/system/balancer.id”文件。

问题 突然发生短暂的 hdfs datanode stale 状态告警

DataNode职责:
存储管理用户的文件块数据
定期向namenode汇报自身所持有的block信息(通过心跳信息上报)

  • 当一个datanode满足如下条件时被认为是stale了:
    当一台datanode的last contact(即上一次收到datanode心跳到当前时刻的时间间隔)相对于其他datanode更长的时候,该datanode就会被认为是stale的。当一台datanode变为stale状态后,其读写优先级将被置为最低。
    如果使用默认值的话,当一台datanode的心跳消失30秒钟,namenode会认为这台datanode stale了。如果又过了10分钟(总共10.5分钟)还没有心跳,namenode会认定datanode死亡了。
    相关属性包括:
    dfs.heartbeat.interval - default: 3 seconds
    dfs.namenode.stale.datanode.interval - default: 30 seconds
    dfs.namenode.heartbeat.recheck-interval - default: 5 minutes
    dfs.namenode.avoid.read.stale.datanode - default: true
    dfs.namenode.avoid.write.stale.datanode - default: true

相关文章

网友评论

      本文标题:hadoop机架感知配置数据balance,datanode s

      本文链接:https://www.haomeiwen.com/subject/rnknwltx.html