当前位置:首页 » 网页前端 » yarn脚本推荐
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

yarn脚本推荐

发布时间: 2022-05-04 22:49:20

Ⅰ 学习hadoop需要理解启动脚本

1 基本概述
Hadoop的命令位于${HADOOP_HOME}/bin、${HADOOP_HOME}/sbin、${HADOOP_HOME}/libexec下面。包含了Linux的shell脚本和windows的批处理文件。本文主要解析linux下的shell脚本。
2 脚本详解
2.1 start-all.sh
要启动Hadoop的各节点和其他服务,这是一个绕不开的启动脚本,该脚本位于${HADOOP_HOME}/sbin下。不过在Hadoop的2.x版本中,Hadoop官方已经宣布被弃用了。接下来,就详细地分析一下该脚本是如何工作的:
1、首先脚本开头有一段注释:# Start all hadoop daemons. Run this on master node.中文意思是:启动所有的进程(也就是各节点),在管理节点(也就是namenode-名称节点)上运行该脚本
2、如果是2.x版本会有echo "This script is Deprecated. Instead usestart-dfs.sh and start-yarn.sh"的提示,意思该脚本已经过时,该脚本已经被start-dfs.sh和 start-yarn.sh替代使用。
3、bin=`dirname"${BASH_SOURCE-$0}"`,提取start-all.sh的所在的绝对路径。
4、bin=`cd"$bin"; pwd`,切换到start-all.sh的所在目录下,并将路径赋值给bin。
5、DEFAULT_LIBEXEC_DIR="$bin"/../libexec,获取${HADOOP_HOME}/libexec的绝对路径以备后用。
6、HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR},为HADOOP_LIBEXEC_DIR变量三元赋值。如果HADOOP_LIBEXEC_DIR为空或者环境变量没有配置,就赋值默认的绝对路径,为下一步执行该目录下面的脚本做准备。

Ⅱ 如何使用spark将程序提交任务到yarn-Spark-about云开发

使用脚本提交
1.使用spark脚本提交到yarn,首先需要将spark所在的主机和hadoop集群之间hosts相互配置(也就是把spark主机的ip和主机名配置到hadoop所有节点的/etc/hosts里面,再把集群所有节点的ip和主机名配置到spark所在主机的/etc/hosts里面)。
2.然后需要把hadoop目录etc/hadoop下面的*-sit.xml复制到${SPARK_HOME}的conf下面.
3.确保hadoop集群配置了 HADOOP_CONF_DIR or YARN_CONF_DIR

1.yarn-standalone方式提交到yarn
在${SPARK_HOME}下面执行:

SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \

./bin/spark-class org.apache.spark.deploy.yarn.Client \

--jar ./examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \

--class org.apache.spark.examples.SparkPi \

--args yarn-standalone \

--num-workers 3 \

--master-memory 2g \

--worker-memory 2g \

--worker-cores 1

复制代码

2. yarn-client 方式提交到yarn
在${SPARK_HOME}下面执行:

SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \

SPARK_YARN_APP_JAR=examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \

./bin/run-example org.apache.spark.examples.SparkPi yarn-client

复制代码

二、使用程序提交
1.必须使用linux主机提交任务,使用windows提交到linux hadoop集群会报
org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: 第 0 行: fg: 无任务控制

复制代码

错误。hadoop2.2.0不支持windows提交到linux hadoop集群,网上搜索发现这是hadoop的bug。

2.提交任务的主机和hadoop集群主机名需要在hosts相互配置。

3.因为使用程序提交是使用yarn-client方式,所以必须像上面脚本那样设置环境变量SPARK_JAR 和 SPARK_YARN_APP_JAR
比如我的设置为向提交任务主机~/.bashrc里面添加:

export SPARK_JAR=file:///home/ndyc/software/sparkTest/lib/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar

export SPARK_YARN_APP_JAR=file:///home/ndyc/software/sparkTest/ndspark-0.0.1.jar

复制代码

file:// 表明是本地文件,如果使用hdfs上的文件将file://替换为hdfs://主机名:端口号。建议使用hdfs来引用 spark-assembly-0.9.0-incubating-hadoop2.2.0.jar,因为这个文件比较大,如果使用file://每次提交任务都需要上传这个jar到各个集群,很慢。

其中SPARK_JAR是${SPARK_HOME}/assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar
SPARK_YARN_APP_JAR是自己程序打的jar包,包含自己的测试程序。

4.程序中加入hadoop、yarn、依赖。
注意,如果引入了hbase依赖,需要这样配置

<dependency>

<groupId>org.apache.hbase</groupId>

<artifactId>hbase-thrift</artifactId>

<version>${hbase.version}</version>

<exclusions>

<exclusion>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-maprece-client-jobclient</artifactId>

</exclusion>

<exclusion>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-client</artifactId>

</exclusion>

</exclusions>

</dependency>

复制代码

然后再加入

<dependency>

<groupId>org.ow2.asm</groupId>

<artifactId>asm-all</artifactId>

<version>4.0</version>

</dependency>

复制代码

否则会报错:

IncompatibleClassChangeError has interface org.objectweb.asm.ClassVisitor as super class
复制代码

异常是因为Hbase jar hadoop-maprece-client-jobclient.jar里面使用到了asm3.1 而spark需要的是asm-all-4.0.jar

5. hadoop conf下的*-site.xml需要复制到提交主机的classpath下,或者说maven项目resources下面。

6.编写程序
代码示例:

package com.sdyc.ndspark.sys;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.JavaPairRDD;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.JavaSparkContext;

import org.apache.spark.api.java.function.Function2;

import org.apache.spark.api.java.function.PairFunction;

import scala.Tuple2;

import java.util.ArrayList;

import java.util.List;

/**

* Created with IntelliJ IDEA.

* User: zarchary

* Date: 14-1-19

* Time: 下午6:23

* To change this template use File | Settings | File Templates.

*/

public class ListTest {

public static void main(String[] args) throws Exception {

SparkConf sparkConf = new SparkConf();

sparkConf.setAppName("listTest");

//使用yarn模式提交

sparkConf.setMaster("yarn-client");

JavaSparkContext sc = new JavaSparkContext(sparkConf);

List<String> listA = new ArrayList<String>();

listA.add("a");

listA.add("a");

listA.add("b");

listA.add("b");

listA.add("b");

listA.add("c");

listA.add("d");

JavaRDD<String> letterA = sc.parallelize(listA);

JavaPairRDD<String, Integer> letterB = letterA.map(new PairFunction<String, String, Integer>() {

@Override

public Tuple2<String, Integer> call(String s) throws Exception {

return new Tuple2<String, Integer>(s, 1);

}

});

letterB = letterB.receByKey(new Function2<Integer, Integer, Integer>() {

public Integer call(Integer i1, Integer i2) {

return i1 + i2;

}

});

//颠倒顺序

JavaPairRDD<Integer, String> letterC = letterB.map(new PairFunction<Tuple2<String, Integer>, Integer, String>() {

@Override

public Tuple2<Integer, String> call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {

return new Tuple2<Integer, String>(stringIntegerTuple2._2, stringIntegerTuple2._1);

}

});

JavaPairRDD<Integer, List<String>> letterD = letterC.groupByKey();

// //false说明是降序

JavaPairRDD<Integer, List<String>> letterE = letterD.sortByKey(false);

System.out.println("========" + letterE.collect());

System.exit(0);

}

}

复制代码

代码中master设置为yar-client表明了是使用提交到yarn.

关于spark需要依赖的jar的配置可以参考我的博客spark安装和远程调用。
以上弄完之后就可以运行程序了。
运行后会看到yarn的ui界面出现:

正在执行的过程中会发现hadoop yarn 有的nodemanage会有下面这个进程:

13247 org.apache.spark.deploy.yarn.WorkerLauncher

复制代码

这是spark的工作进程。
如果接收到异常为:

WARN YarnClientClusterScheler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory

复制代码

出现这个错误是因为提交任务的节点不能和spark工作节点交互,因为提交完任务后提交任务节点上会起一个进程,展示任务进度,大多端口为4044,工作节点需要反馈进度给该该端口,所以如果主机名或者IP在hosts中配置不正确,就会报

WARN YarnClientClusterScheler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory错误。
所以请检查主机名和IP是否配置正确。

我自己的理解为,程序提交任务到yarn后,会上传SPARK_JAR和SPARK_YARN_APP_JAR到hadoop节点, yarn根据任务情况来分配资源,在nodemanage节点上来启动org.apache.spark.deploy.yarn.WorkerLauncher工作节点来执行spark任务,执行完成后退出。

Ⅲ 为什么我要选择使用Yarn来做Docker的调度引擎

可部署性

先说明下,这里探讨的是Yarn或者Mesos集群的部署,不涉其上的应用。Yarn除了依赖JDK,对操作系统没有任何依赖,基本上放上去就能
跑。Mesos因为是C/C++开发的,安装部署可能会有库依赖。
这点我不知道大家是否看的重,反正我是看的相当重的。软件就应该是下下来就可以Run。所以12年的时候我就自己开发了一套Java服务框架,开发完之后
运行个main方法就行。让应用包含容器,而不是要把应用丢到Tomcat这些容器,太复杂,不符合直觉。

二次开发

Yarn 对Java/Scala工程师而言,只是个Jar包,类似索引开发包Lucene,你可以把它引入项目,做任何你想要的包装。 这是其一。

其二,Yarn提供了非常多的扩展接口,很多实现都是可插拔。可替换的,在XML配置下,可以很方便的用你的实现替换掉原来的实现,没有太大的侵入性,所以就算是未来Yarn升级,也不会有太大问题。

相比较而言,Mesos更像是一个已经做好的产品,部署了可以直接用,但是对二次开发并不友好。

生态优势

Yarn 诞生于Hadoop这个大数据的“始作俑者”项目,所以在大数据领域具有先天优势。

底层天然就是分布式存储系统HDFS,稳定高效。
其上支撑了Spark、MR等大数据领域的扛顶之座,久经考验。
社区强大,最近发布版本也明显加快,对于长任务的支持也越来越优秀。

长任务支持

谈及长任务(long running
services)的支持,有人认为早先Yarn是为了支持离线短时任务的,所以可能对长任务的支持有限。其实大可不必担心,譬如现在基于其上的
Spark Streaming就是7x24小时运行的,跑起来也没啥问题。一般而言,要支持长任务,需要考虑如下几个点:

Fault tolerance,主要是AM的容错。
Yarn Security,如果开启了安全机制,令牌等的失效时间也是需要注意的。
日志收集到集群。
还有就是资源隔离和优先级。如果资源隔离做的太差,会对长时任务产生影响。

大家感兴趣可以先参考Jira。我看这个Jira 13年就开始了,说明这事很早就被重视起来了。下面我们队提到的几个点做下解释。

Fault tolerance

Yarn 自身高可用。目前Yarn的Master已经实现了HA。
AM容错,我看从2.4版本(看的源码,也可能更早的版本就已经支持)就已经支持 keep containers across
attempt
的选项了。什么意思呢?就是如果AM挂掉了,在Yarn重新启动AM的过程中,所有由AM管理的容器都会被保持而不会被杀掉。除非Yarn多次尝试都没办
法把AM再启动起来(默认两次)。 这说明从底层调度上来看,已经做的很好了。

日志收集到集群

日志收集在2.6版本已经是边运行边收集了。

资源隔离

资源隔离的话,Yarn做的不好,目前有效的是内存,对其他方面一直想做支持,但一直有限。这估计也是很多人最后选择Mesos的缘由。但是现在这
点优势Mesos其实已经荡然无存,因为Docker容器在资源隔离上已经做的足够好。Yarn和Docker一整合,就互补了。

小结

Mesos 和 Yarn 都是非常优秀的调度框架,各有其优缺点,弹性调度,统一的资源管理是未来平台的一个趋势,类似的这种资源管理调度框架必定会大行其道。

一些常见的误解

脱胎于Hadoop,继承了他的光环和生态,然而这也会给其带来一定的困惑,首先就是光环一直被Hadoop给盖住了,而且由于固有的惯性,大家会理所当然的认为Yarn只是Hadoop里的一个组件,有人会想过把Yarn拿出来单独用么?

然而,就像我在之前的一篇课程里,反复强调,Hadoop是一个软件集合,包含分布式存储,资源管理调度,计算框架三个部分。他们之间没有必然的关
系,是可以独立开来的。而Yarn
就是一个资源管理调度引擎,其一开始的设计目标就是为了通用,不仅仅是跑MR。现在基于Yarn之上的服务已经非常多,典型的比如Spark。

这里还有另外一个误区,MR目前基本算是离线批量的代名词,这回让人误以为Yarn也只是适合批量离线任务的调度。其实不然,我在上面已经给出了分析,Yarn 是完全可以保证长任务的稳定可靠的运行的。

如何基于Yarn开发分布式程序

本文不会具体教你如何使用Yarn的API,不过如果你想知道Yarn的API,但是又觉得官方文档太过简略,我这里倒是可以给出两个建议:

代码使用范例可以参看Spark Yarn相关的代码。算的上是一个非常精简的Yarn的adaptor。
买本Yarn相关的书,了解其体系结构也有助于你了解其API的设计。

接下来的内容会探讨以下两个主题:

基于Yarn开发分布式程序需要做的一些准备工作
基于Yarn开发容器调度系统的一些基本思路

基于Yarn开发分布式程序需要做的一些准备工作

肯定不能撸起袖子就开始干。开始动手前,我们需要知道哪些事情呢?

Yarn原生的API太底层,太复杂了

如果你想愉快的开发Yarn的应用,那么对Yarn的API进行一次封装,是很有必要的。
Yarn为了灵活,或者为了能够满足开发者大部分的需求,底层交互的API就显得比较原始了。自然造成开发难度很大。这个也不是我一个人觉得,现在
Apache的Twill,以及Hulu他们开发的时候Adaptor那一层,其实都是为了解决这个问题。那为什么我没有用Twill呢,第一是文档实在
太少,第二是有点复杂,我不需要这么复杂的东西。我觉得,Twill与其开发这么多功能,真的不如好好写写文档。

最好是能开发一个解决一类问题的Framework

Yarn只是一个底层的资源管理和调度引擎。一般你需要基于之上开发一套解决特定问题的Framework。以Spark为例,他是解决分布式计算
相关的一些问题。而以我开发的容器调度程序,其实是为了解决动态部署Web应用的。在他们之上,才是你的应用。比如你要统计日志,你只要在Spark上开
发一个Application 。 比如你想要提供一个推荐系统,那么你只要用容器包装下,就能被容器调度程序调度部署。

所以通常而言,基于Yarn的分布式应用应该符合这么一个层次:

Yarn -> Adapter -> Framework -> Application

Adapter 就是我第一条说的,你自个封装了Yarn的API。 Framework就是解决一类问题的编程框架,Application才是你真正要解决业务的系统。通过这种解耦,各个层次只要关注自己的核心功能点即可。

保证你上层的Framework/Application可以移植

Spark是个典型,他可以跑在Mesos上,也可以跑在Yarn上,还可以跑在自己上面(Standalone),实时上,泡在Yarn上的,以及跑Standalone模式的,都挺多的。这得益于Spark本身不依赖于底层的资源管理调度引擎。

这其实也是我上面说的两条带来的好处,因为有了Adaptor,上层的Framework可以不用绑死在某个资源调度引擎上。而Framework则可以让Applicaiton 无需关注底层调度的事情,只要关注业务即可。

另外,你费尽心机开发的Framework上,你自然是希望它能跑在更多的平台上,已满足更多的人的需求,对吧。

基于Yarn开发容器调度系统的一些基本思路

首先我们需要了解两个概念:

哑应用。所谓哑应用指的是无法和分布式系统直接进行交互,分布式系统也仅仅透过容器能进行生命周期的控制,比如关闭或者开启的应用。典型的比如MySQL、Nginx等这些基础应用。他们一般有自己特有的交互方式,譬如命令行或者socket协议或者HTTP协议。
伴生组件。因为有了哑应用的存在,分布式系统为了能够和这些应用交互,需要有一个代理。而这个代理和被代理的哑应用,具有相同的生命周期。典型
的比如,某个服务被关停后,该事件会被分布式系统获知,分布式系统会将该事件发送给Nginx的伴生组件,伴生组件转化为Nginx能够识别的指令,将停
止的服务从Nginx的ProxyBackend列表中剔除。

在容器调度系统中,如果Yarn的NodeManager直接去管理Docker则需要Yarn本身去做支持,我觉得这是不妥的。Yarn的职责就是做好资源管理,分配,调度即可,并不需要和特定的某个技术耦合,毕竟Yarn是一个通用型的资源调度管理框架。

那基于上面的理论,我们基于Yarn,开发一套框架,这个框架会是典型的 master-slave结构(这是Yarn决定的)。这个框架的 slaves 其实都是Docker 的伴生对象。master 可以通过这些Slave 对容器实现间接的管理。

我们简单描述下他们的流程:

用户提交Application,申请资源;
Yarn启动Framework的master;
Yarn启动Framework的slave;
slave 连接上master,并且发送心跳,从而master知道slave的状况slave启动Docker,slave与被启动的这个docker container 一一对应;
slave定时监控Container;
slave发现container crash,slave自动退出,Yarn获得通知,收回资源;
master发现有节点失败,发出新的节点要求,重新在另外一台服务器上启动slave,重复从2开始的步骤。

这里还有一个问题,如果slave 被正常杀掉,可以通过JVM ShudownHook 顺带把Container也关掉。
但是如果slave被kill -9
或者异常crash掉了,那么就可能导致资源泄露了。目前是这个信息是由master上报给集群管理平台,该平台会定时清理。你也可以存储该信息,譬如放
到Redis或者MySQL中,然后启动后台清理任务即可。

了解了这个思路后,具体实施就变得简单了,就是开发一个基于Yarn的master-slave程序即可,然后slave去管理对应的Docker容器,包括接受新的指令。master提供管理界面展示容器信息,运行状态即可。

当然,你还可以再开发一套Framework B专门和Nginx交互,这样比如上面的系统做了节点变更,通知B的master,然后B的master 通过自己的伴生组件Slave 完成Nginx的更新,从而实现后端服务的自动变更和通知。

Ⅳ Mesos和YARN的区别以及它们如何协同工作

Hadoop 2.0之后把对集群资源的管理从MapRece v1的JobTracker中提取出来,在YARN中进行了实现。虽然YARN支持了多种不同的计算框架,但依旧没有很好的解决集群资源的弹性伸缩问题。本文介绍了一个新的项目- Myriad,它把YARN和Mesos两者的优势结合起来,不仅使YARN的运行使用更加灵活,而且让整个数据中心的扩容变得更简单。

这是一个关于两个集群的故事。第一个是Apache Hadoop集群,其中资源与Hadoop以及进程完全隔离。另一个集群是对所有资源的描述,这些资源并不是Hadoop集群的一部分。通过这种方式来区分两个集群是因为Hadoop通过Apache YARN(Yet Another Resource Negotiator)来管理自己的资源。对于Hadoop来说,在没有大数据任务在队列中时,这些资源常常是未被充分使用的。当一个大数据任务运行时,这些资源迅速被用到极限,并且在请求更多资源。这对于第一种集群而言相当困难。

Myriad把YARN和Mesos两者的优势结合起来。通过使用Myriad项目,让Mesos和YARN可以协作,你可以完成一个实时业务。数据分析可以在和运行生产服务的相同硬件上执行。你不再需要面临由静态分区引起的资源限制(和低利用率)。资源可以根据业务的需求弹性的伸缩。

最后的思考

为了确保人们理解这个项目的来源,我认为Mesos和YARN擅长在自己特定的场景下工作,并且都有提升的空间。两者的资源管理器在安全领域都能有所提升;而安全的支持对企业采纳与否至关重要。

Mesos需要一个端到端的安全架构,我个人觉得可以使用Kerberos来提供安全支持,但根据个人经验,这样做应该不会简单。对Mesos其他方面的提升同样十分复杂,主要归纳为资源的抢占和撤销。假设一个业务的所有资源已经分配,当业务依赖运行的一个最重要的资源项需要扩容时,甚至这个扩容工作仅需要数十分钟来完成,你仍然会因为缺少资源而无法完成。资源的抢占和撤销就可以解决这个问题。目前,Mesos围绕着这个问题有多种解决方案,但我十分期待Mesos委员会使用Dynamic Reservations和Optimistic (Revocable) Resources Offers来解决这个问题。

Myriad作为一种新的技术,让我们把数据中心或云端的所有资源当作一个简单的资源池来使用。正如Hadoop消除数据孤岛之间的壁垒一样,Myriad消除了孤立的集群之间的壁垒。通过Myriad,开发者可以专注于业务依赖的数据和应用程序,而运维团队可以更敏捷地管理他们的计算资源。这为我们专注数据而不被基础设施持续困扰打开了另一扇窗。有了Myriad,存储网络的限制和计算与存储之间的协调就成为我们在实现完整的灵活性、敏捷和伸缩上的最后一个需要攻克的难题。

Ⅳ spark中怎样提交任务到import pysparkk

因为spark文档中只介绍了两种用脚本提交到yarn的例子,并没有介绍如何通过程序提交yarn,但是我们的需求需要这样。网上很难找到例子,经过几天摸索,终于用程序提交到yarn成功,下面总结一下。先介绍官网提交的例子,我用的是spark 0.9.0 hadoop2.2.0
一.使用脚本提交
1.使用spark脚本提交到yarn,首先需要将spark所在的主机和hadoop集群之间hosts相互配置(也就是把spark主机的ip和主机名配置到hadoop所有节点的/etc/hosts里面,再把集群所有节点的ip和主机名配置到spark所在主机的/etc/hosts里面)。
2.然后需要把hadoop目录etc/hadoop下面的*-sit.xml复制到${SPARK_HOME}的conf下面.
3.确保hadoop集群配置了 HADOOP_CONF_DIR or YARN_CONF_DIR&
1.yarn-standalone方式提交到yarn
在${SPARK_HOME}下面执行:
SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \
./bin/spark-class org.apache.spark.deploy.yarn.Client \
--jar ./examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \
--class org.apache.spark.examples.SparkPi \
--args yarn-standalone \
--num-workers 3 \
--master-memory 2g \
--worker-memory 2g \

--worker-cores 1
2. yarn-client 方式提交到yarn
在${SPARK_HOME}下面执行:
SPARK_JAR=./assembly/target/scala-2.10.4/spark-assembly-0.9.0-incubating-hadoop2.2.0.jar \
SPARK_YARN_APP_JAR=examples/target/scala-2.10/spark-examples_2.10-assembly-0.9.0-incubating.jar \
./bin/run-example org.apache.spark.examples.SparkPi yarn-client

Ⅵ yarn 硬件配置要求

、相关配置情况

关于内存分配与管理,主要涉及到了ResourceManage、ApplicationMatser、NodeManager这几个概念,相关的优化也要紧紧围绕着这几方面来开展。这里还有一个Container的概念,现在可以先把它理解为运行map/rece task的容器,后面有详细介绍。

1.1 RM的内存资源配置, 配置的是资源调度相关

RM1:yarn.scheler.minimum-allocation-mb=1G #单个容器可申请的最小内存RM2:yarn.scheler.maximum-allocation-mb=4G #单个容器可申请的最大内存l RM2 必须大于等于 RM1l 一旦设置,不可动态改变

1.2 NM的内存资源配置,配置的是硬件资源相关

NM1:yarn.nodemanager.resource.memory-mb=16G #节点最大可用内存NM2:yarn.nodemanager.vmem-pmem-ratio=2.1 #虚拟内存率,默认2.1l NM1 必须大于 RM2l 使用 RM1 和 NM1 可以计算一个节点最大Container数量:max(Container)=NM1/RM1= 16/1 =16 个l 一旦设置,不可动态改变

1.3 AM内存配置相关参数,配置的是 MR 任务相关

AM1:maprece.map.memory.mb=1.5G #分配给 map Container 的内存大小AM2:maprece.rece.memory.mb=3G #分配给 rece Container 的内存大小l AM1、AM2 必须在 RM1和 RM2 之间l AM2 最好是 AM1 的两倍l 这两个值可以在启动时改变AM3:maprece.map.java.opts=-Xmx 1G #运行map任务的jvm参数,如-Xmx,-Xms等选项AM4:maprece.rece.java.opts=-Xmx 2G #运行rece任务的jvm参数,如-Xmx,-Xms等选项l AM3 必须小于 AM1,AM4 必须小于 AM2

二、对于这些配置概念的理解

步骤1:用户提交 Job 到ResourceManager步骤2:ResourceManager 为 ApplicationMaster 申请资源,然后在一个NodeManager 上启动 ApplicationMaster步骤3:ApplicationMaster 与 ResourceManager通信,为要执行的任务申请资源,然后在相应的 NodeManager 上启动对应的任务。步骤4:所有任务运行完成后,ApplicationMaster 向 ResourceManager 注销,整个应用程序运行结束。

3.2 关于Container

(1) Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。它跟Linux Container没有任何关系,仅仅是YARN提出的一个概念(从实现上看,可看做一个可序列化/反序列化的Java类)。(2) Container的申请由ApplicationMaster向 ResourceManager申请,由 ResourceManager中的 ResourceScheler异步分配给 ApplicationMaster;(3) Container的运行由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令(可以使任何命令,比如java、Python、C++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。另外,一个应用程序所需的Container分为两大类,如下:(1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;(2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。Container是YARN中最重要的概念之一,懂得该概念对于理解YARN的资源模型至关重要,望大家好好理解。注意:如下图,map/rece task是运行在Container之中的,所以上面提到的maprece.map(rece).memory.mb大小都大于maprece.map(rece).java.opts值的大小。

四、HDP平台参数调优建议

根据上面介绍的相关知识,我们就可以根据我们的实际情况作出相关参数的设置,当然还需要在运行测试过程中不断检验和调整。以下是hortonworks给出的配置建议:http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html自动生成配置脚本:wget http://public-repo-1.hortonworks.com/HDP/tools/2.1.1.0/hdp_manual_install_rpm_helper_files-2.1.1.385.tar.gz执行命令:python hdp-configuration-utils.py -c 16 -m 64 -d 4 -k True

附:规整化因子介绍

为了易于管理资源和调度资源,Hadoop YARN内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量,也就是说,应用程序获得资源不会小于自己申请的资源,但也不一定相等;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为最小的整数倍对应的值,公式为ceil(a/b)*b,其中a是应用程序申请的资源,b为规整化因子。比如,在yarn-site.xml中设置,相关参数如下:RM1:yarn.scheler.minimum-allocation-mb:最小可申请内存量,默认是1024RM2:yarn.scheler.maximum-allocation-mb:最大可申请内存量,默认是8096yarn.scheler.minimum-allocation-vcores:最小可申请CPU数,默认是1yarn.scheler.maximum-allocation-vcores:最大可申请CPU数,默认是4对于规整化因子,不同调度器不同,具体如下:FIFO和Capacity Scheler,规整化因子等于最小可申请资源量,不可单独配置。Fair Scheler:规整化因子通过以下参数设置yarn.scheler.increment-allocation-mb=1024myarn.scheler.increment-allocation-vcores=1通过以上介绍可知,应用程序申请到资源量可能大于资源申请的资源量,比如YARN的最小可申请资源内存量为1024,规整因子是1024,如果一个应用程序申请1500内存,则会得到2048内存,如果规整因子是512,则得到1536内存。

Ⅶ hadoop的yarn为什么要在resourcemanager上启动脚本

yarn-site.xml里面配置了管理Resourcemanager和nodemanger的配置

Ⅷ 如何基于 yarn 资源管理器 开发分布式应用

这个不难,我擅长.

Ⅸ spark on yarn是运行在spark集群还是yarn集群

Spark集群有三种运行模式:Standalone、Mesos和YARN模式。现在说Standalone模式。这是最简单的模式,Spark靠自己就能运行这个模式(不依靠其它集群管理工具)。方法一:手动运行Standalone模式。前提:Spark各个文件都不做任何修改。1、在master机器上运行./sbin/start-master/sh运行完之后,会打印出url:spark://HOST:PORT,这个就是当前master的SparkURL。2、在slave机器上运行./sbin/start-slave.sh然后在Master的管理界面上查看http://master-ip:8080,查看slave是否已上线。方法二:使用集群运行脚本运行Standalone模式。前提:master节点去访问slave节点需要使用ssh无密码登录,因此需要提前配置无密码登录。1、在master的conf文件夹下新增slaves文件。slaves文件里存放着每一个slave节点的hostname,每行一个。2、在master节点上运行如下脚本即可

Ⅹ 如何运行YARN中的DistributedShell程序

本文介绍YARN自带的一个非常简单的应用程序实例—distributedshell的使用方法。它可以看做YARN编程中的“hello world”,主要功能是并行执行用户提供的shell命令或者shell脚本。
(1)运行参数介绍
DistributedShell的基本运行参数如下:

(2)运行方法
DistributedShell的运行方法如下:
在YARN安装目录下,执行以下命令:
bin/hadoop jar\
share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.0.0-cdh4.1.1.jar\
org.apache.hadoop.yarn.applications.distributedshell.Client\
–jar share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.0.0-cdh4.1.1.jar\
–shell_command ls\
–shell_script ignore.sh\
–num_containers 10\
–container_memory 350\
–master_memory 350\
–priority 10
需要注意的是,在hadoop-2.0.3-alpha(不包括该版本)和CDH 4.1.2版本(包括该版本)之前,DistributedShell存在BUG,具体如下:
1) 必须使用–shell_command参数
2) 当只有shell_command参数而没有shell_script参数时,在分布式模式下(伪分布式下可以)不能执行成功,具体说明和修复方法见: https //issues apache org/jira/browse/YARN-253
在这个实例中,ignore.sh中的内容就是“ls”
3) 内存设置一定要正确,不然会出现以下提示的错误:
Container [pid=4424,containerID=container_1359629844156_0004_01_000001] is running beyond virtual memory limits. Current usage: 90.1mb of 128.0mb physical memory used; 593.0mb of 268.8mb virtual memory used. Killing container.
【附】DistributedShell运行日志:
13/02/01 13:43:11 INFO distributedshell.Client: Initializing Client
13/02/01 13:43:11 INFO distributedshell.Client: Starting Client
13/02/01 13:43:11 INFO distributedshell.Client: Connecting to ResourceManager at c2-23/10.1.1.98:8032
13/02/01 13:43:12 INFO distributedshell.Client: Got Cluster metric info from ASM, numNodeManagers=3
13/02/01 13:43:12 INFO distributedshell.Client: Got Cluster node info from ASM
13/02/01 13:43:12 INFO distributedshell.Client: Got node report from ASM for, nodeId=c2-23:36594, nodeAddressc2-23:8042, nodeRackName/default-rack, nodeNumContainers0, nodeHealthStatusis_node_healthy: true, health_report: “”, last_health_report_time: 1359697377337,
13/02/01 13:43:12 INFO distributedshell.Client: Got node report from ASM for, nodeId=c2-25:41070, nodeAddressc2-25:8042, nodeRackName/default-rack, nodeNumContainers0, nodeHealthStatusis_node_healthy: true, health_report: “”, last_health_report_time: 1359697367180,
13/02/01 13:43:12 INFO distributedshell.Client: Got node report from ASM for, nodeId=c2-24:48383, nodeAddressc2-24:8042, nodeRackName/default-rack, nodeNumContainers0, nodeHealthStatusis_node_healthy: true, health_report: “”, last_health_report_time: 1359699033102,
13/02/01 13:43:12 INFO distributedshell.Client: Queue info, queueName=default, queueCurrentCapacity=0.0, queueMaxCapacity=1.0, queueApplicationCount=0, queueChildQueueCount=0
13/02/01 13:43:12 INFO distributedshell.Client: User ACL Info for Queue, queueName=default, userAcl=SUBMIT_APPLICATIONS
13/02/01 13:43:12 INFO distributedshell.Client: User ACL Info for Queue, queueName=default, userAcl=ADMINISTER_QUEUE
13/02/01 13:43:12 INFO distributedshell.Client: Got new application id=application_1359695803957_0003
13/02/01 13:43:12 INFO distributedshell.Client: Min mem capabililty of resources in this cluster 128
13/02/01 13:43:12 INFO distributedshell.Client: Max mem capabililty of resources in this cluster 10240
13/02/01 13:43:12 INFO distributedshell.Client: Setting up application submission context for ASM
13/02/01 13:43:12 INFO distributedshell.Client: Copy App Master jar from local filesystem and add to local environment
13/02/01 13:43:13 INFO distributedshell.Client: Set the environment for the application master
13/02/01 13:43:13 INFO distributedshell.Client: Trying to generate classpath for app master from current thread’s classpath
13/02/01 13:43:13 INFO distributedshell.Client: Readable bytes from stream=9006
13/02/01 13:43:13 INFO distributedshell.Client: Setting up app master command
13/02/01 13:43:13 INFO distributedshell.Client: Completed setting up app master command ${JAVA_HOME}/bin/java -Xmx350m org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster –container_memory 350 –num_containers 10 –priority 0 –shell_command ls 1>/AppMaster.stdout 2>/AppMaster.stderr
13/02/01 13:43:13 INFO distributedshell.Client: Submitting application to ASM
13/02/01 13:43:14 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=N/A, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=ACCEPTED, distributedFinalState=UNDEFINED, appTrackingUrl=c2-23:8088/proxy/application_1359695803957_0003/, appUser=rmss
13/02/01 13:43:15 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=RUNNING, distributedFinalState=UNDEFINED, appTrackingUrl=, appUser=rmss
13/02/01 13:43:16 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=RUNNING, distributedFinalState=UNDEFINED, appTrackingUrl=, appUser=rmss
13/02/01 13:43:17 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=RUNNING, distributedFinalState=UNDEFINED, appTrackingUrl=, appUser=rmss
13/02/01 13:43:18 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=RUNNING, distributedFinalState=UNDEFINED, appTrackingUrl=, appUser=rmss
13/02/01 13:43:19 INFO distributedshell.Client: Got application report from ASM for, appId=3, clientToken=null, appDiagnostics=, appMasterHost=, appQueue=default, appMasterRpcPort=0, appStartTime=1359697393467, yarnAppState=FINISHED, distributedFinalState=SUCCEEDED, appTrackingUrl=, appUser=rmss
13/02/01 13:43:19 INFO distributedshell.Client: Application has completed successfully. Breaking monitoring loop
13/02/01 13:43:19 INFO distributedshell.Client: Application completed successfully
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦