Hadoop运行在Kubernetes平台实践 精选 原创 首席数据师 2018-12-20 14:16:08 ©著作权 文章标签 hadoop Kubernetes 大数据 文章分类 大数据 ©著作权归作者所有:来自51CTO博客作者首席数据师的原创作品,请联系作者获取转载授权,否则将追究法律责任 Hadoop与Kubernetes就好像江湖里的两大绝世高手,一个是成名已久的长者,至今仍然名声远扬,一个则是初出茅庐的青涩少年,骨骼惊奇,不走寻常路,一出手便惊诧了整个武林。Hadoop与Kubernetes之间有很深的渊源,因为都出自IT豪门——Google,只不过,后者是亲儿子,正因为有大佬背书,所以Kubernetes一出山,江湖各路门派便都蜂拥而至,拥护称王。 不知道是因为Hadoop是干儿子的缘故还是因为“廉颇老矣”,总之,Hadoop朋友圈的后辈们如Spark、Storm等早都有了在Kubernetes上部署运行的各种资料和案例,但Hadoop却一直游离于Kubernetes体系之外,本文我们给出Hadoop在Kubernetes上的实践案例,以弥补这种缺憾。 Hadoop容器化的资料不少,但Hadoop部署在Kubernetes上的资料几乎没有,这主要是以下几个原因导致的: 第一, Hadoop集群重度依赖DNS机制,一些组件还使用了反向域名解析,以确定集群中的节点身份,这对Hadoop在Kubernetes上的建模和运行带来极大挑战,需要深入了解Hadoop集群工作原理并且精通Kubernetes,才能很好解决这一难题。 第二, Hadoop新的Map-Reduce计算框架Yarn的模型出现的比较晚,它的集群机制要比HDFS复杂,资料也相对较少,增加了Hadoop整体建模与迁移Kubernetes平台的难度。 第三, Hadoop与Kubernetes分别属于两个不同的领域,一个是传统的大数据领域,一个是新兴的容器与微服务架构领域,这两个领域之间交集本来很小,加之Hadoop最近几年已经失去焦点(这点从百度搜索关键词就能发现),所以,没有多少人关注和研究Hadoop在Kubernetes的部署问题,也是情理之中的事情。 Hadoop 2.0其实是由两套完整的集群所组成,一个是基本的HDFS文件集群,一个是YARN资源调度集群,如下图所示: 因此在Kubernetes建模之前,我们需要分别对这两种集群的工作机制和运行原理做出深入的分析,下图是HDFS集群的架构图: Hadoop 运行在 Kubernetes平台实践 我们看到,HDFS集群是由NameNode(Master节点)和Datanode(数据节点)等两类节点所组成,其中,客户端程序(Client)以及DataNode节点会访问NameNode,因此,NameNode节点需要建模为Kubernetes Service以提供服务,以下是对应的Service定义文件: apiVersion: v1 kind: Service metadata: name: k8s-hadoop-master spec: type: NodePort selector: app: k8s-hadoop-master ports: name: rpc port: 9000 targetPort: 9000 name: http port: 50070 targetPort: 50070 nodePort: 32007 其中,NameNode节点暴露2个服务端口: 9000端口用于内部IPC通信,主要用于获取文件的元数据 50070端口用于HTTP服务,为Hadoop 的Web管理使用 为了减少Hadoop镜像的数量,我们构建了一个镜像,并且通过容器的环境变量HADOOP_NODE_TYPE来区分不同的节点类型,从而启动不同的Hadoop组件,下面是镜像里的启动脚本startnode.sh的内容: #!/usr/bin/env bash sed -i "s/@HDFS_MASTER_SERVICE@/$HDFS_MASTER_SERVICE/g" $HADOOP_HOME/etc/hadoop/core-site.xml sed -i "s/@HDOOP_YARN_MASTER@/$HDOOP_YARN_MASTER/g" $HADOOP_HOME/etc/hadoop/yarn-site.xml yarn-master HADOOP_NODE="${HADOOP_NODE_TYPE}" if [ $HADOOP_NODE = "datanode" ]; then echo "Start DataNode ..." hdfs datanode -regular else if [ $HADOOP_NODE = "namenode" ]; then echo "Start NameNode ..." hdfs namenode else if [ $HADOOP_NODE = "resourceman" ]; then echo "Start Yarn Resource Manager ..." yarn resourcemanager else if [ $HADOOP_NODE = "yarnnode" ]; then echo "Start Yarn Resource Node ..." yarn nodemanager else echo "not recoginized nodetype " fi fi fi fi 我们注意到,启动命令里把Hadoop配置文件(core-site.xml与yarn-site.xml)中的HDFS Master节点地址用环境变量中的参数HDFS_MASTER_SERVICE来替换,YARN Master节点地址则用HDOOP_YARN_MASTER来替换。下图是Hadoop HDFS 2节点集群的完整建模示意图: Hadoop 运行在 Kubernetes平台实践 图中的圆圈表示Pod,可以看到,Datanode并没有建模Kubernetes Service,而是建模为独立的Pod,这是因为Datanode并不直接被客户端所访问,因此无需建模Service。当Datanode运行在Pod容器里的时候,我们需要修改配置文件中的以下参数,取消DataNode节点所在主机的主机名(DNS)与对应IP地址的检查机制: dfs.namenode.datanode.registration.ip-hostname-check=false 如果上述参数没有修改,就会出现DataNode集群“分裂”的假象,因为Pod的主机名无法对应Pod的IP地址,因此界面会显示2个节点,这两个节点都状态都为异常状态。 下面是HDFS Master节点Service对应的Pod定义: apiVersion: v1 kind: Pod metadata: name: k8s-hadoop-master labels: app: k8s-hadoop-master spec: containers: name: k8s-hadoop-master image: kubeguide/hadoop imagePullPolicy: IfNotPresent ports: containerPort: 9000 containerPort: 50070 env: name: HADOOP_NODE_TYPE value: namenode name: HDFS_MASTER_SERVICE valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDFS_MASTER_SERVICE name: HDOOP_YARN_MASTER valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDOOP_YARN_MASTER restartPolicy: Always 下面是HDFS的Datanode的节点定义(hadoop-datanode-1): apiVersion: v1 kind: Pod metadata: name: hadoop-datanode-1 labels: app: hadoop-datanode-1 spec: containers: name: hadoop-datanode-1 image: kubeguide/hadoop imagePullPolicy: IfNotPresent ports: containerPort: 9000 containerPort: 50070 env: name: HADOOP_NODE_TYPE value: datanode name: HDFS_MASTER_SERVICE valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDFS_MASTER_SERVICE name: HDOOP_YARN_MASTER valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDOOP_YARN_MASTER restartPolicy: Always 实际上,Datanode可以用DaemonSet方式在每个Kubernerntes节点上部署一个,在这里为了清晰起见,就没有用这个方式 定义。接下来,我们来看看Yarn框架如何建模,下图是Yarn框架的集群架构图: Hadoop 运行在 Kubernetes平台实践 我们看到,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集群的建模示意图: Hadoop 运行在 Kubernetes平台实践 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定义: apiVersion: v1 kind: Service metadata: name: yarn-node-1 spec: clusterIP: None selector: app: yarn-node-1 ports: port: 8040 注意到定义中“clusterIP:None”这句话,表明这是一个Headless Service,没有自己的Cluster IP地址,下面给出YAM文件定义: apiVersion: v1 kind: Pod metadata: name: yarn-node-1 labels: app: yarn-node-1 spec: containers: name: yarn-node-1 image: kubeguide/hadoop imagePullPolicy: IfNotPresent ports: containerPort: 8040 containerPort: 8041 containerPort: 8042 env: name: HADOOP_NODE_TYPE value: yarnnode name: HDFS_MASTER_SERVICE valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDFS_MASTER_SERVICE name: HDOOP_YARN_MASTER valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDOOP_YARN_MASTER restartPolicy: Always ResourceManager的YAML定义没有什么特殊的地方,其中Service定义如下: apiVersion: v1 kind: Service metadata: name: ku8-yarn-master spec: type: NodePort selector: app: yarn-master ports: name: "8030" port: 8030 name: "8031" port: 8031 name: "8032" port: 8032 name: http port: 8088 targetPort: 8088 nodePort: 32088 对应的Pod定义如下: apiVersion: v1 kind: Pod metadata: name: yarn-master labels: app: yarn-master spec: containers: name: yarn-master image: kubeguide/hadoop imagePullPolicy: IfNotPresent ports: containerPort: 9000 containerPort: 50070 env: name: HADOOP_NODE_TYPE value: resourceman name: HDFS_MASTER_SERVICE valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDFS_MASTER_SERVICE name: HDOOP_YARN_MASTER valueFrom: configMapKeyRef: name: ku8-hadoop-conf key: HDOOP_YARN_MASTER restartPolicy: Always 目前这个方案,还遗留了一个问题有待解决:HDFS NameNode节点重启后的文件系统格式化问题,这个问题可以通过启动脚本来解决,即判断HDFS文件系统是否已经格式化过,如果没有,就启动时候执行格式化命令,否则跳过格式化命令。 安装完毕后,我们可以通过浏览器访问Hadoop的HDFS管理界面,点击主页上的Overview页签会显示我们熟悉的HDFS界面: Hadoop 运行在 Kubernetes平台实践 切换到Datanodes页签,可以看到每个Datanodes的的信息以及当前状态: Hadoop 运行在 Kubernetes平台实践 接下来,我们可以登录到NameNode所在的Pod里并执行HDSF命令进行功能性验证,下面的命令执行结果是建立一个HDFS目录,并且上传一个文件到此目录中: root@hadoop-master:/usr/local/hadoop/bin# hadoop fs -ls / root@hadoop-master:/usr/local/hadoop/bin# hadoop fs -mkdir /leader-us root@hadoop-master:/usr/local/hadoop/bin# hadoop fs -ls / Found 1 items drwxr-xr-x - root supergroup 0 2017-02-17 07:32 /leader-us root@hadoop-master:/usr/local/hadoop/bin# hadoop fs -put hdfs.cmd /leader-us 然后,我们可以在HDFS管理界面中浏览HDFS文件系统,验证刚才的操作结果: Hadoop 运行在 Kubernetes平台实践 接下来,我们再登录到hadoop-master对应的Pod上,启动一个Map-Reduce测试作业——wordcount,作业启动后,我们可以在Yarn的管理界面中看到作业的执行信息,如下图所示: Hadoop 运行在 Kubernetes平台实践 当作业执行完成后,可以通过界面看到详细的统计信息,比如wordcount的执行结果如下图所示: Hadoop 运行在 Kubernetes平台实践 最后,我们进行了裸机版Hadoop集群与Kubernetes之上的Hadoop集群的性能对比测试,测试环境为十台服务器组成的集群,具体参数如下: 硬件: CPU:2E5-2640v3-8Core 内存:1616G DDR4 网卡:210GE多模光口 硬盘:123T SATA 软件: BigCloud Enterprise Linux 7(GNU/Linux 3.10.0-514.el7.x86_64 x86_64) Hadoop2.7.2 Kubernetes 1.7.4+ Calico V3.0.1 我们执行了以下这些标准测试项: TestDFSIO:分布式系统读写测试 NNBench:NameNode测试 MRBench:MapReduce测试 WordCount:单词频率统计任务测试 TeraSort:TeraSort任务测试 综合测试下来,Hadoop跑在Kuberntes集群上时,性能有所下降,以TestDFSIO的测试为例,下面是Hadoop集群文件读取的性能测试对比: Hadoop 运行在 Kubernetes平台实践 我们看到,Kubernetes集群上的文件读性能与物理机相比,下降了差不多30%左右,并且任务执行时间也增加不少,再来对比文件写入的性能,测试结果如下下图所示: Hadoop 运行在 Kubernetes平台实践 我们看到,写文件性能的差距并不大,这里的主要原因是在测试过程中,HDFS写磁盘的速度远远低于读磁盘的速度,因此无法拉开差距。 之所以部署在Kuberntes上的Hadoop集群的性能会有所下降,主要一个原因是容器虚拟网络所带来的性能损耗,如果用Host Only模型,则两者之间的差距会进一步缩小,下图是TestDFSIO测试中Hadoop集群文件读取的性能测试对比: Hadoop 运行在 Kubernetes平台实践 因此我们建议在生产环境中采用Host Only的网络模型,以提升Hadoop的集群性能。 攻下Hadoop在Kubernetes上的部署,并且在生产中加以验证,我们可以很自豪的说,现在没有什么能够难倒应用向Kubernetes的迁移的步伐,采用统一的PaaS构建企业的应用集群和大数据集群,实现资源的共享和服务的统一管理将会大大的提升企业的业务部署速度和管理的效率。 赞 收藏 评论 分享 举报 上一篇:大数据hadoop入门之hadoop家族详解 下一篇:没有什么内存问题,是一行Python代码解决不了的 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 Kubernetes最佳实践 @[TOC]Kubernetes(K8s)作为当前最流行的容器编排工具之一,已经在云原生应用开发中扮演着关键的角色。在这篇文章中,我们将深入探讨一些Kubernetes的最佳实践和进阶技巧,帮助开发者更好地利用和优化这一强大的容器编排平台。1. 自定义调度策略Kubernetes的调度器负责将Pod分配到集群中的节点上。在某些情况下,你可能希望定义自己的调度策略,以便更灵活地控制Pod的分配。这可 Pod 自定义 Docker Kubernetes容器实践深度解析 在当今云原生时代,容器技术已经成为构建、部署和管理应用程序的关键工具之一。而在众多的容器编排系统中,Kubernetes(简称K8s)因其强大的自动化、弹性和可扩展性而备受欢迎。本文将深入探讨Kubernetes容器实践,从基础概念到高级应用,为读者提供全面的指南。 应用程序 Pod nginx Kubernetes容器实践基础解析 @[TOC]引言在当今云原生时代,容器技术已经成为构建、部署和管理应用程序的关键工具之一。而在众多的容器编排系统中,Kubernetes(简称K8s)因其强大的自动化、弹性和可扩展性而备受欢迎。本文将深入探讨Kubernetes容器实践,从基础概念到高级应用,为读者提供全面的指南。1. Kubernetes基础概念1.1 容器与Docker容器技术的崛起离不开Docker的贡献。Docker是一款 Pod 应用程序 nginx 在Kubernetes平台上运行Hadoop的实践 hpe ku8team 分布式实验室 Hadoop与Kubernetes就好像江湖里的两大绝世高手,一个是成名已久的长者,至今仍然名声远扬,一个则是初出茅庐的青涩少年,骨骼惊奇,不走寻常路,一出手便惊诧了整个武林。Hadoop与Kubernetes之间有很深的渊源,因为都出自IT豪门——Google,只不过,后者是亲儿子,正因为有大佬背书,所以Kubernetes一出山,江湖各路门派便都蜂拥而至 Java 147 Mahout运行在Hadoop集群 Hadoop 执行脚本hadoop jar mahout-examples-0.9-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /sanbox/movie/10M.txt --output /sanbox/movie/r -s SIMILARITY_LOGLIKELIHOOD参数说明:–inp... 数据 文件包含 hadoop C .net 运行在信创平台 .NET 运行在信创平台==================## 引言在现代软件开发中,构建可靠,高性能的应用程序是非常重要的。为了满足这些要求,微软公司开发了.NET框架。.NET框架是一个跨平台的开发框架,它提供了一个统一的编程模型和一组库,用于构建各种类型的应用程序,从桌面应用程序到Web应用程序和移动应用程序。.NET框架不仅可以运行在Windows操作系统上,还可以运行在其 应用程序 Azure CIL mrjob运行在hadoop上的命令 mrjob是一个用于在Hadoop集群上运行MapReduce任务的Python库。它提供了一种简单而强大的方式来编写和运行MapReduce作业,而无需编写Java代码。本文将介绍mrjob的一些基本概念和如何使用它在Hadoop上运行MapReduce任务。# mrjob的基本概念在深入探讨如何在Hadoop上运行mrjob之前,让我们先了解一些mrjob的基本概念。## MapR Hadoop python 键值对 hadoop 运行在k8s Hadoop是一个开源分布式存储和计算系统,而Kubernetes(简称K8S)是一个开源的容器编排引擎,可以实现自动化部署、扩展和管理容器化应用程序。将Hadoop运行在K8S上可以有效地利用资源,并且具有高可靠性和灵活性。接下来我将详细介绍如何实现这个过程。## 实现Hadoop运行在K8S的流程| 步骤 | 操作 || ---- Hadoop HDFS hadoop Linux app如何运行在Android平台 # 项目方案:在Android平台上运行Linux app## 1. 背景和目标随着移动设备的普及和性能的提升,越来越多的用户希望在Android手机上运行Linux应用程序。本项目的目标是创建一个方案,使得Linux app能够在Android平台上运行,并提供一个示例来演示该方案的可行性。## 2. 方案概述本方案的核心思想是通过使用容器技术,在Android上创建一个Linu Android Docker 应用程序 Kubernetes容器云平台实践 容器云平台实践 容器云平台 Project Savanna:让Hadoop运行在OpenStack之上 Apache Hadoop基本上已经成为MapReduce实现的产业标准,并且被各个机构广泛采用,而Savanna项目旨在让用户可以在OpenStack上运行和管理Hadoop集群。值得一提的是,Amazon通过EMR(Elastic MapReduce)提供Hadoop服务已达数年之久。用户需要给Savanna提供一些信息来建立集群,比如Hadoop版本、集群拓扑、节点硬件详 项目 能力 信息 机构 通用 hadoop能否运行在k8s上 在传统的Hadoop部署中,我们通常会使用独立的集群进行数据处理,但是随着容器化技术的发展,我们也可以将Hadoop部署在Kubernetes集群上。这样做可以更好地利用资源、提高扩展性和灵活性。接下来我将向你介绍如何在Kubernetes上运行Hadoop。首先,我们来看一下在Kubernetes上运行Hadoop的整个流程:| 步骤 | 操作 || ---- | ---- || 1 Hadoop HDFS bash kubernetes可以运行在单一的docker容器中 Kubernetes(简称K8s)是一个开源的容器编排管理工具,它可以帮助我们自动化地部署、扩展和管理容器化的应用程序。在Kubernetes中,我们可以通过使用单一的Docker容器来部署应用程序。本文将详细介绍如何在Kubernetes中实现单一的Docker容器部署,并提供相应的代码示例。整体流程如下:步骤 | 操作---- | ------1 | 创建一个Docke 应用程序 Deployment Docker hadoop 运行 hadoop运行在什么平台 Hadoop是什么?Hadoop是由Apache基金会所开发的分布式基础架构。Hadoop是一种分布式存储数据和计算的框架,擅长存储大量的半结构化数据集,擅长分布式计算-快速的跨多台机器处理大型数据集合。Hadoop也泛指一组相关的项目,这些项目都使用这个基础平台进行分布式计算和海量数据处理。并构成了Hadoop生态系统。Hadoop的发行版本:1.x、0.22和2.x。Hadoop核心架构 hadoop 运行 大数据 hadoop 分布式 hdfs hadoop是离线处理平台吗 hadoop运行在什么平台上 Hadoop是开源的、可运行在大规模计算机集群上的分布式计算平台,它可以完成海量数据的存储与处理分析,被公认为行业大数据标准开源软件,在行业内得到了广泛的应用。 文章目录一、 Hadoop概述1. Hadoop简介2. Hadoop的特性3.Hadoop的版本二、Hadoop生态系统1.Hadoop存储系统2.Hadoop计算框架3.Hadoop数据仓库4.Hadoop数据转换与日志处理5.Had hadoop是离线处理平台吗 大数据 hadoop hive zookeeper apache hadoop运行在哪个平台上 apache hadoop官网 官网地址:http://hadoop.apache.org/ 一 Hadoop是什么呢二 开始三 下载 Hadoop四 谁使用Hadoop 一. Hadoop是什么呢?Apache™ Hadoop®的项目开发开源软件可靠,可扩展,分布式计算。Apache Hadoop 软件库是一个允许跨集群用简单的模型对于大数据的分布式处理的框架。它的目的是扩大从单一服务器到成千上万的机器,提供每个本地计算和存储 Hadoop Apache 数据 hadoop运行 Hadoop运行在哪些方面 一、Hadoop简介: Hadoop是由Apache基金会所开发的分布式系统基础架构,实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS;Hadoop框架最核心设计就是HDFS和MapReduce,HDFS为海量数据提供了存储,MapReduce为海量数据提供了计算。 Hadoop要解决的问题:海量数据的存储(HDFS)、海量数据的分析(Ma hadoop运行 大数据 运维 java hadoop Hadoop集群运行jps hadoop集群运行在什么系统 Overview Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求, Hadoop集群运行jps hadoop HDFS Text .net 运行在信创平台 net平台开发 “.NET平台开发规范”包括两方面内容:代码规范、最佳实践。(1) 规范和优美的代码风格有助于思路清晰。(2) 规范和优美的代码有助于团队沟通交流。 .net 运行在信创平台 c# java 设计模式 System java能运行在什么平台 java支持的平台 JRE组成java虚拟机java源程序文件(扩展名为java)被编译为类文件(扩展名为class)后,后者包含的字节码无法直接被cup理解,需要由一个特殊的程序进行翻译和解释,该程序被称为java虚拟机,不同的软硬件平台只需安装对应的java虚拟机,同一个类文件便能不加修改地运行在这些平台上,从而保证了java程序的可移植性。APIAPI是编程语言提供的一组具有基本功能的组件库,开发者可以在程序中 java能运行在什么平台 java 应用程序 类文件