Hadoop与Kubernetes就好像江湖里的两大绝世高手,一个是成名已久的长者,至今仍然名声远扬,一个则是初出茅庐的青涩少年,骨骼惊奇,不走寻常路,一出手便惊诧了整个武林。Hadoop与Kubernetes之间有很深的渊源,因为都出自IT豪门——Google,只不过,后者是亲儿子,正因为有大佬背书,所以Kubernetes一出山,江湖各路门派便都蜂拥而至,拥护称王。
不知道是因为Hadoop是干儿子的缘故还是因为“廉颇老矣”,总之,Hadoop朋友圈的后辈们如Spark、Storm等早都有了在Kubernetes上部署运行的各种资料和案例,但Hadoop却一直游离于Kubernetes体系之外,本文我们给出Hadoop在Kubernetes上的实践案例,以弥补这种缺憾。
Hadoop容器化的资料不少,但Hadoop部署在Kubernetes上的资料几乎没有,这主要是以下几个原因导致的:
Hadoop 2.0其实是由两套完整的集群所组成,一个是基本的HDFS文件集群,一个是YARN资源调度集群,如下图所示:
因此在Kubernetes建模之前,我们需要分别对这两种集群的工作机制和运行原理做出深入的分析,下图是HDFS集群的架构图:
我们看到,HDFS集群是由NameNode(Master节点)和Datanode(数据节点)等两类节点所组成,其中,客户端程序(Client)以及DataNode节点会访问NameNode,因此,NameNode节点需要建模为Kubernetes Service以提供服务,以下是对应的Service定义文件:
其中,NameNode节点暴露2个服务端口:
为了减少Hadoop镜像的数量,我们构建了一个镜像,并且通过容器的环境变量HADOOP_NODE_TYPE来区分不同的节点类型,从而启动不同的Hadoop组件,下面是镜像里的启动脚本startnode.sh的内容:
我们注意到,启动命令里把Hadoop配置文件(core-site.xml与yarn-site.xml)中的HDFS Master节点地址用环境变量中的参数HDFS_MASTER_SERVICE来替换,YARN Master节点地址则用HDOOP_YARN_MASTER来替换。下图是Hadoop HDFS 2节点集群的完整建模示意图:
图中的圆圈表示Pod,可以看到,Datanode并没有建模Kubernetes Service,而是建模为独立的Pod,这是因为Datanode并不直接被客户端所访问,因此无需建模Service。当Datanode运行在Pod容器里的时候,我们需要修改配置文件中的以下参数,取消DataNode节点所在主机的主机名(DNS)与对应IP地址的检查机制:
如果上述参数没有修改,就会出现DataNode集群“分裂”的假象,因为Pod的主机名无法对应Pod的IP地址,因此界面会显示2个节点,这两个节点都状态都为异常状态。
下面是HDFS Master节点Service对应的Pod定义:
下面是HDFS的Datanode的节点定义(hadoop-datanode-1):
实际上,Datanode可以用DaemonSet方式在每个Kubernerntes节点上部署一个,在这里为了清晰起见,就没有用这个方式 定义。接下来,我们来看看Yarn框架如何建模,下图是Yarn框架的集群架构图:
我们看到,Yarn集群中存在两种角色的节点:ResourceManager以及NodeManger,前者属于Yarn集群的头脑(Master),后者是工作承载节点(Work Node),这个架构虽然与HDFS很相似,但因为一个重要细节的差别,无法沿用HDFS的建模方式,这个细节就是Yarn集群中的ResourceManager要对NodeManger节点进行严格验证,即NodeManger节点的节点所在主机的主机名(DNS)与对应IP地址严格匹配,简单来说,就是要符合如下规则:
NodeManger建立TCP连接时所用的IP地址,必须是该节点主机名对应的IP地址,即主机DNS名称解析后返回节点的IP地址。
所以我们采用了Kubernetes里较为特殊的一种Service——Headless Service来解决这个问题,即为每个NodeManger节点建模一个Headless Service与对应的Pod,下面是一个ResourceManager与两个NodeManger节点所组成的Yarn集群的建模示意图:
Headless Service的特殊之处在于这种Service没有分配Cluster IP,在Kuberntes DNS里Ping这种Service的名称时,会返回后面对应的Pod的IP地址,如果后面有多个Pod实例,则会随机轮询返回其中一个的Pod地址,我们用Headless Service建模NodeManger的时候,还有一个细节需要注意,即Pod的名字(容器的主机名)必须与对应的Headless Service的名字一样,这样一来,当运行在容器里的NodeManger进程向ResourceManager发起TCP连接的过程中会用到容器的主机名,而这个主机名恰好是NodeManger Service的服务名,而这个服务名解析出来的IP地址又刚好是容器的IP地址,这样一来,就巧妙的解决了Yarn集群的DNS限制问题。
下面以yarn-node-1为例,给出对应的Service与Pod的YAM文件,首先是yarn-node-1对应的Headless Service的YAM定义:
注意到定义中“clusterIP:None”这句话,表明这是一个Headless Service,没有自己的Cluster IP地址,下面给出YAM文件定义:
ResourceManager的YAML定义没有什么特殊的地方,其中Service定义如下:
对应的Pod定义如下:
目前这个方案,还遗留了一个问题有待解决:HDFS NameNode节点重启后的文件系统格式化问题,这个问题可以通过启动脚本来解决,即判断HDFS文件系统是否已经格式化过,如果没有,就启动时候执行格式化命令,否则跳过格式化命令。
安装完毕后,我们可以通过浏览器访问Hadoop的HDFS管理界面,点击主页上的Overview页签会显示我们熟悉的HDFS界面:
切换到Datanodes页签,可以看到每个Datanodes的的信息以及当前状态:
接下来,我们可以登录到NameNode所在的Pod里并执行HDSF命令进行功能性验证,下面的命令执行结果是建立一个HDFS目录,并且上传一个文件到此目录中:
然后,我们可以在HDFS管理界面中浏览HDFS文件系统,验证刚才的操作结果:
接下来,我们再登录到hadoop-master对应的Pod上,启动一个Map-Reduce测试作业——wordcount,作业启动后,我们可以在Yarn的管理界面中看到作业的执行信息,如下图所示:
当作业执行完成后,可以通过界面看到详细的统计信息,比如wordcount的执行结果如下图所示:
最后,我们进行了裸机版Hadoop集群与Kubernetes之上的Hadoop集群的性能对比测试,测试环境为十台服务器组成的集群,具体参数如下:
硬件:
软件:
我们执行了以下这些标准测试项:
综合测试下来,Hadoop跑在Kuberntes集群上时,性能有所下降,以TestDFSIO的测试为例,下面是Hadoop集群文件读取的性能测试对比:
我们看到,Kubernetes集群上的文件读性能与物理机相比,下降了差不多30%左右,并且任务执行时间也增加不少,再来对比文件写入的性能,测试结果如下下图所示:
我们看到,写文件性能的差距并不大,这里的主要原因是在测试过程中,HDFS写磁盘的速度远远低于读磁盘的速度,因此无法拉开差距。
之所以部署在Kuberntes上的Hadoop集群的性能会有所下降,主要一个原因是容器虚拟网络所带来的性能损耗,如果用Host Only模型,则两者之间的差距会进一步缩小,下图是TestDFSIO测试中Hadoop集群文件读取的性能测试对比:
因此我们建议在生产环境中采用Host Only的网络模型,以提升Hadoop的集群性能。
攻下Hadoop在Kubernetes上的部署,并且在生产中加以验证,我们可以很自豪的说,现在没有什么能够难倒应用向Kubernetes的迁移的步伐,采用统一的PaaS构建企业的应用集群和大数据集群,实现资源的共享和服务的统一管理将会大大的提升企业的业务部署速度和管理的效率。
评论时间:2024-03-31 06:25:01
17.易于维护app用的本地服务器搭建教程 虚拟主机和云主机的区别是什么 7.易于维护
评论时间:2023-05-14 00:25:03
自建型软件供应商通常采用“产品+定制化解决方案”的商业模式,根据客户需求,结合多年积累的经验和能力,针对云主机是不是就是云服务器 特定行服务器电源改12v电源图解 软件供应商通常采用“产品+定制化解决方案”的商业模式,根据客户需求,结合多年积累的经验和能力,针对特定行业的特殊需要,开发出符合客户实际需求的解决方案,并向客户交付具有自主知识产权的软件产品
评论时间:2023-04-30 06:25:02
18虚拟主机哪个好用又便宜 .更新日虚拟主机推荐排行榜 新日志
评论时间:2023-04-06 09:25:02
云主机怎么安装软件 3、在选择了X86和Windows操作系统之后,就可以根据自己的需求进行配python服务器制作教程 置
评论时间:2022-11-24 21:25:02
服务器永久云主机 地址哪里查香港云主机试用 哪里查看,在互联网上是非常流行的一种应用
评论时间:2022-10-31 12:25:01
嵌入式系统服务器是将硬件平台移植到操作系统中去实现系统自己做个云主机 软件部分的运行,从而形成一个独立于CPU之外的专用处理器刀片服务器多路 立于CPU之外的专用处理器
评论时间:2022-09-26 09:25:02
14.接着在弹出菜单虚拟主机和云服务的区别 中点“属性”项手机搭建web服务器 属性”项
评论时间:2022-09-19 09:25:02
3.发展历史:20世纪60年代初出现了第一台通用计算机芯片——Intel X86,从此进入了微虚拟主机官方平台 处理器时代山东服务器机柜品牌 0年代初出现了第一台通用计算机芯片——Intel X86,从此进入了微处理器时代
评论时间:2022-08-05 09:25:01
7.贴心周到:每天都会对用户进行回访,随时了解用户意服务器地址怎么查询 见并给予解答手机怎么用虚拟主机 行回访,随时了解用户意见并给予解答
2023-12-25 22:44:35 admin
活动发布区版规2023-05-27 22:03:52 御风而行
容器、无服务器、虚拟机:安全性差...2023-05-27 20:43:39 1356
服务器宕机的造成原因和解决方法介...2023-05-27 20:43:25 qingym
别糊涂了!服务器与工作站的五大区...2023-05-27 19:08:41 小绵羊0123
科技巨头布局云端 服务器 网络硬...2023-05-27 18:17:46 姐姐的跟屁虫
钉钉因系统访问流量激增,宕机1小...2022-07-23 00:34:02 freeatom
常见ftp命令 FTP命令使用详...2022-07-21 02:17:02 ares
双硬盘组建Raid0磁盘阵列图文...2022-07-20 06:17:02 mankeung123
用友软件客户端连接不上服务器的解...2022-07-23 00:51:02 antonfxb
WebService实例2022-07-13 05:38:02 苯小孩
开发、运维不可不看的Linux调...2022-07-20 18:51:02 nightstone
如何使用Charles抓取Web...2022-01-18 05:38:03 jiess
是自购服务器、还是租用虚拟机、亦...2022-01-19 05:38:02 begin
服务器托管一定要避免的9种机房现...2022-01-24 05:38:03 fdfjdlkfjslkj
服务器托管名词解释2022-01-28 05:38:03 fxdfbl
基于IP的虚拟主机配置的三种方法2022-02-07 05:38:03 jasonkidd
WEB服务器配置详解2022-03-16 05:38:03 chcr
JBoss实战:服务器配置指南 ...2022-07-19 20:17:02 dengyu0429
linux vi使用及详细介绍2022-07-20 01:00:05 激动的舌头
Linux视频教程:用户管理命令...2022-07-21 20:51:02 jessica-an
创建本地FTP站点2022-02-07 05:38:03 jasonkidd
WEB服务器配置详解2022-07-20 04:51:02 wolfssss
ACL权限-默认与递归(4)2022-07-22 15:00:05 淡水珊瑚
Linux下 Samba Ser...