正确提交spark到yarn的demo

    通过Spark-submit在xshell提交命令行,如果集群配置了keberos的话需要在打包的jar中进行认证,认证文件上传到节点并且需要分发到每一个节点,节点之间需要无密码ssh登录。

    因为是通过Spark-submit提交程序,所以在代码当中的SparkConf设置为

.setMaster("yarn-cluster")

如果提交显示classnotfound可能是当前用户没有权限操作打包在集群上的jar包,或者是缺少命令--master yarn-cluster 。在这里,--master yarn-cluster 要和.setMaster("yarn-cluster")一致,不然会导致节点之间Connection的异常,而xshell一直显示Accepted。

以下是spark-submit提交的命令:

 spark-submit  \
 --class sparkDemo.WordCount \
 --master yarn-cluster \
 --num-executors 5 \
 --driver-memory 5g \
 --driver-cores 4 \
 --executor-memory 10g \
 --executor-cores 5 \
  hdfs://1.2.3.4:8020/bulkload/Jars/sub/SparkDemo.jar
"param1" "param2" "param3"

其中,param是可以传到spark程序main方法的args[]。 

以下是需要打包的类:

package sparkDemo;

import java.util.Arrays;

import kerberos.KerberosService;

import org.apache.hadoop.conf.Configuration;
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.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;

import common.HadoopUtil;

public class ParseAttachment {
	
    public static void main(String[] args) {
    	
		
		SparkConf conf_ = new SparkConf()
				.setMaster("yarn-cluster")
				.setAppName("parseAttachment");

		JavaSparkContext sc = new JavaSparkContext(conf_);
		JavaRDD<String> text = sc.textFile(HadoopUtil.hdfs_url + "/bulkload/Spark_in");

    	System.out.println("ok");
    	
    	JavaRDD<String> words = text.flatMap(new FlatMapFunction<String, String>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Iterable<String> call(String line) throws Exception {
                return Arrays.asList(line.split(" "));//把字符串转化成list
            }
        });
        
        JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<String, Integer> call(String word) throws Exception {
                // TODO Auto-generated method stub
                return new Tuple2<String, Integer>(word, 1);
            }
        });
        
        JavaPairRDD<String, Integer> results = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {            
            private static final long serialVersionUID = 1L;
            @Override
            public Integer call(Integer value1, Integer value2) throws Exception {
                // TODO Auto-generated method stub
                return value1 + value2;
            }
        });
        
        JavaPairRDD<Integer, String> temp = results.mapToPair(new PairFunction<Tuple2<String,Integer>, Integer, String>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<Integer, String> call(Tuple2<String, Integer> tuple)
                    throws Exception {
                return new Tuple2<Integer, String>(tuple._2, tuple._1);
            }
        });
        
        JavaPairRDD<String, Integer> sorted = temp.sortByKey(false).mapToPair(new PairFunction<Tuple2<Integer,String>, String, Integer>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<String, Integer> call(Tuple2<Integer, String> tuple)
                    throws Exception {
                // TODO Auto-generated method stub
                return new Tuple2<String, Integer>(tuple._2,tuple._1);
            }
        });
        
        sorted.foreach(new VoidFunction<Tuple2<String,Integer>>() {
            private static final long serialVersionUID = 1L;
            @Override
            public void call(Tuple2<String, Integer> tuple) throws Exception {
                System.out.println("word:" + tuple._1 + " count:" + tuple._2);
            }
        });
        
        sc.close();
    }
}

至于spark的依赖包:spark-assembly-1.5.2-hadoop2.6.0.jar 导进去就可以了。

 

注:

1.如果报错:the directory item limit is exceed: limit=1048576。因为一般使用spark进行批处理,所以输出的结果文件数量可能非常多,事实上Linux会限制一个文件夹的文件数量,这时候参考:https://blog.csdn.net/sparkexpert/article/details/51852944修改hdfs-site.xml吧;

2.因为一般处理的文件数量很庞大,所以在代码规范上一定要注意,比如读取文件的流要及时手动关闭,或者通过参数:spark.yarn.executor.memoryOverhead来调节内存分配;

3.报错:YarnScheduler: Lost executor。修改执行器等待参数(10分钟): --conf spark.core.connection.ack.wait.timeout=600。

### 回答1: 答:Spark提交Yarn的流程主要包括以下几个步骤:1.运行Spark应用程序;2.将Spark应用程序打包成jar或zip文件;3.使用spark-submit命令提交应用程序到Yarn;4.Yarn接收应用程序并将其分配给节点;5.Yarn调度器负责调度应用程序;6.Yarn监控应用程序的执行;7.应用程序结束时,Yarn将结果发送给用户。 ### 回答2: 将Spark程序提交YARN的流程如下: 1. 准备YARN集群:首先需要搭建一个YARN集群,包括至少一个YARN管理节点(ResourceManager)和多个YARN工作节点(NodeManager)。ResourceManager负责整个集群的资源分配和任务调度,NodeManager负责执行具体的计算任务。 2. 准备Spark程序和配置:将要运行的Spark程序编写好,并进行必要的配置。Spark程序可以使用Scala、Java或Python等语言编写,配置文件可以设置Spark应用的相关参数,如内存分配、并行度等。 3. 打包Spark应用程序:将编写好的Spark程序及其依赖库打包成一个可执行的Jar包,以方便在YARN上运行。 4. 提交Spark应用到YARN:使用YARN提供的命令或客户端工具,将打包好的Spark应用程序提交YARN集群。在提交时,需要指定应用程序的配置信息,如所需的资源、启动脚本、提交人等。 5. YARN任务调度:一旦Spark应用程序被提交YARN集群,YARN的ResourceManager会对其进行资源分配和任务调度。根据应用程序的需求,ResourceManager会为其分配合适的资源,并确定在哪些节点上启动相应的任务。 6. 启动Spark任务:YARN的NodeManager接收到Spark任务后,负责启动Executor进程。每个Executor进程是一个独立的Java进程,负责执行Spark应用程序的具体计算任务。 7. 执行Spark应用程序:一旦Executor进程启动,Spark应用程序开始在YARN集群上执行。Executor会根据应用程序的逻辑,调度并执行具体的计算任务,包括读取数据、转换处理等操作。 8. 监控和管理:在Spark应用程序执行的过程中,可以通过YARN提供的监控工具来查看任务的运行状态、资源使用情况等。此外,还可以通过YARN的管理命令对任务进行调度、监控和管理。 9. 完成和收集结果:一旦Spark应用程序执行完毕,可以从YARN集群上收集各个任务的输出结果。根据需要,可以将结果存储到HDFS、本地文件系统或其他存储介质中。 以上是将Spark程序提交YARN的基本流程,通过YARN的资源管理和任务调度,可以有效地管理和利用集群资源,并实现分布式的Spark计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值