首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

机架感知配置

阅读文本大概需要 7 分钟。

一 背景

Hadoop 在设计时考虑到数据的安全与高效,数据文件默认在 HDFS 上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。

这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上拿数据要快;同时,如果整个机架的网络出现异常,也能保证在其它机架的节点上找到数据。

为了降低整体的带宽消耗和读取延时,HDFS 会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个 HDFS 集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。

那么 Hadoop 是如何确定任意两个节点是位于同一机架,还是跨机架的呢?答案就是机架感知。

默认情况下,Hadoop 的机架感知是没有被启用的。

所以,在通常情况下,Hadoop 集群的 HDFS 在选机器的时候,是随机选择的,也就是说,很有可能在写数据时,Hadoop 将第一块数据 block1 写到了 Rack1 上,然后随机的选择将 block2 写入到了 Rack2 下,此时两个 Rack 之间产生了数据传输的流量,再接下来,在随机的情况下,又将 block3 重新又写回了 Rack1,此时,两个 Rack 之间又产生了一次数据流量。

在 job 处理的数据量非常的大,或者往 Hadoop 推送的数据量非常大的时候,这种情况会造成 Rack 之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。

二 配置

默认情况下,Namenode 启动时候日志是这样的:

2018-06-2217:27:26,423INFO org.apache.hadoop.net.NetworkTopology: Adding anewnode:/default-rack/192.168.100.10:50010

每个 IP 对应的机架 ID 都是 /default-rack,说明 Hadoop 的机架感知没有被启用。

要将 Hadoop 机架感知的功能启用,配置非常简单,在 Nameode 所在节点的 /etc/hadoop 的 core-site.xml 配置文件中配置一个选项。

topology.script.file.name

/home/bigdata/apps/hadoop/etc/hadoop/topology.sh

这个配置选项的 value 指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为某台 Datanode 机器的 IP 地址,而输出的值通常为该 IP 地址对应的Datanode 所在的 Rack。

例如 “/rack1”。Namenode 启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配置,此时 Namenode 会根据配置寻找该脚本,并在接收到每一个 Datanode 的 heartbeat 时,将该 Datanode 的 IP 地址作为参数传给该脚本运行,并将得到的输出作为该 Datanode 所属的机架 ID,保存到内存的一个 map 中。

至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的 ip 地址和机器名正确的映射到相应的机架上去。一个简单的实现如下。

#!/bin/bash

HADOOP_CONF=/home/bigdata/apps/hadoop/etc/hadoop

while[$#-gt 0 ] ;do

nodeArg=$1

exec

result=""

whilereadline ;do

ar=($line)

if["$"="$nodeArg"]||["$"="$nodeArg"];then

result="$"

fi

done

shift

if[ -z"$result"] ;then

echo-n"/default-rack"

else

echo-n"$result"

fi

done

其中使用的 topology.data,格式为:节点(ip或主机名)/交换机xx/机架xx。

需要注意的是,在 Namenode 上,该文件中的节点必须使用 IP,使用主机名无效,而 Jobtracker 上,该文件中的节点必须使用主机名,使用 IP 无效,所以,最好 IP 和主机名都配上。

这样配置后,Namenode启动时候日志是这样的:

2018-06-2317:16:27,272INFO org.apache.hadoop.net.NetworkTopology: Adding anewnode:/dc1/rack3/192.168.100.10:50010

这样就说明 Hadoop 的机架感知已经被启用了。

查看 Hadoop 机架信息命令。

./hadoop dfsadmin -printTopology

Rack:/dc1/rack1

192.168.100.10:50010(tbe19216810010)

192.168.100.22:50010(tbe19216810022)

Rack:/dc1/rack2

192.168.100.33:50010(tbe19216810033)

Rack:/dc1/rack3

192.168.100.44:50010(tbe19216810044)

192.168.100.55:50010(tbe19216810055)

192.168.100.66:50010(tbe19216810066)

希望,您能有收获。

一条迷途的咸鱼,

正在游向属于它的天地!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180720G1ZKKK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券