java提交spark任务到yarn平台

一、背景

    采用spark的方式处理,所以需要将spark的功能集成到代码,采用yarn客户端的方式管理spark任务。不需要将cdh的一些配置文件放到resource路径下,只需要配置一些配置即可,非常方便

 

二、任务管理架构

三、接口

1、任务提交

1.  /** 

2.   * 提交任务到yarn集群 

3.   *  

4.   * @param conditions 

5.   *            yarn集群,sparkhdfs具体信息,参数等 

6.   * @return appid 

7.   */  

8.  public String submitSpark(YarnSubmitConditions conditions) {  

9.      logger.info("初始化spark on yarn参数");  

10.   

11.     // 初始化yarn客户端  

12.     logger.info("初始化spark on yarn客户端");  

13.     List<String> args = Lists.newArrayList("--jar", conditions.getApplicationJar(), "--class",  

14.             conditions.getMainClass());  

15.     if (conditions.getOtherArgs() != null && conditions.getOtherArgs().size() > 0) {  

16.         for (String s : conditions.getOtherArgs()) {  

17.             args.add("--arg");  

18.             args.add(org.apache.commons.lang.StringUtils.join(new String[] { s }, ","));  

19.         }  

20.     }  

21.   

22.     // identify that you will be using Spark as YARN mode  

23.     System.setProperty("SPARK_YARN_MODE""true");  

24.     SparkConf sparkConf = new SparkConf();  

25.     if (org.apache.commons.lang.StringUtils.isNotEmpty(conditions.getJobName())) {  

26.         sparkConf.setAppName(conditions.getJobName());  

27.     }  

28.   

29.     sparkConf.set("spark.yarn.jars", conditions.getSparkYarnJars());  

30.     if (conditions.getAdditionalJars() != null && conditions.getAdditionalJars().length > 0) {  

31.         sparkConf.set("spark.jars", org.apache.commons.lang.StringUtils.join(conditions.getAdditionalJars(), ","));  

32.     }  

33.   

34.     if (conditions.getFiles() != null && conditions.getFiles().length > 0) {  

35.         sparkConf.set("spark.files", org.apache.commons.lang.StringUtils.join(conditions.getFiles(), ","));  

36.     }  

37.     for (Map.Entry e : conditions.getSparkProperties().entrySet()) {  

38.         sparkConf.set(e.getKey().toString(), e.getValue().toString());  

39.     }  

40.   

41.     // 添加这个参数,不然spark会一直请求0.0.0.0:8030,一直重试  

42.     sparkConf.set("yarn.resourcemanager.hostname", conditions.getYarnResourcemanagerAddress().split(":")[0]);  

43.     // 设置为true,不删除缓存的jar包,因为现在提交yarn任务是使用的代码配置,没有配置文件,删除缓存的jar包有问题,  

44.     sparkConf.set("spark.yarn.preserve.staging.files""true");  

45.   

46.     // 初始化 yarn的配置  

47.     Configuration cf = new Configuration();  

48.     String os = System.getProperty("os.name");  

49.     boolean cross_platform = false;  

50.     if (os.contains("Windows")) {  

51.         cross_platform = true;  

52.     }  

53.     cf.setBoolean("mapreduce.app-submission.cross-platform", cross_platform);// 配置使用跨平台提交任务  

54.     // 设置yarn资源,不然会使用localhost:8032  

55.     cf.set("yarn.resourcemanager.address", conditions.getYarnResourcemanagerAddress());  

56.     // 设置namenode的地址,不然jar包会分发,非常恶心  

57.     cf.set("fs.defaultFS", conditions.getSparkFsDefaultFS());  

58.   

59.     ClientArguments cArgs = new ClientArguments(args.toArray(new String[args.size()]));  

60.     Client client = new Client(cArgs, cf, sparkConf);  

61.     logger.info("提交任务,任务名称:" + conditions.getJobName());  

62.   

63.     try {  

64.   

65.         ApplicationId appId = client.submitApplication();  

66.   

67.         return appId.toString();  

68.   

69.     } catch (Exception e) {  

70.         logger.error("提交spark任务失败", e);  

71.         return null;  

72.     } finally {  

73.         if (client != null) {  

74.             client.stop();  

75.         }  

76.     }  

77. }  

 

2、任务进度获取

1.  /** 

2.   * 停止spark任务 

3.   *  

4.   * @param yarnResourcemanagerAddress 

5.   *            yarn资源管理器地址, 例如:master:8032,查看yarn集群获取具体地址 

6.   * @param appIdStr 

7.   *            需要取消的任务id 

8.   */  

9.  public void killJob(String yarnResourcemanagerAddress, String appIdStr) {  

10.     logger.info("取消spark任务,任务id" + appIdStr);  

11.     // 初始化 yarn的配置  

12.     Configuration cf = new Configuration();  

13.     String os = System.getProperty("os.name");  

14.     boolean cross_platform = false;  

15.     if (os.contains("Windows")) {  

16.         cross_platform = true;  

17.     }  

18.     cf.setBoolean("mapreduce.app-submission.cross-platform", cross_platform);// 配置使用跨平台提交任务  

19.     // 设置yarn资源,不然会使用localhost:8032  

20.     cf.set("yarn.resourcemanager.address", yarnResourcemanagerAddress);  

21.   

22.     // 创建yarn的客户端,此类中有杀死任务的方法  

23.     YarnClient yarnClient = YarnClient.createYarnClient();  

24.     // 初始化yarn的客户端  

25.     yarnClient.init(cf);  

26.     // yarn客户端启动  

27.     yarnClient.start();  

28.     try {  

29.         // 根据应用id,杀死应用  

30.         yarnClient.killApplication(getAppId(appIdStr));  

31.     } catch (Exception e) {  

32.         logger.error("取消spark任务失败", e);  

33.     }  

34.     // 关闭yarn客户端  

35.     yarnClient.stop();  

36.   

37. }  

 

3、任务取消

1.  /** 

2.   * 获取spark任务状态 

3.   *  

4.   *  

5.   * @param yarnResourcemanagerAddress 

6.   *            yarn资源管理器地址, 例如:master:8032,查看yarn集群获取具体地址 

7.   * @param appIdStr 

8.   *            需要取消的任务id 

9.   */  

10. public SparkTaskState getStatus(String yarnResourcemanagerAddress, String appIdStr) {  

11.     logger.info("获取任务状态启动,任务id" + appIdStr);  

12.     // 初始化 yarn的配置  

13.     Configuration cf = new Configuration();  

14.     String os = System.getProperty("os.name");  

15.     boolean cross_platform = false;  

16.     if (os.contains("Windows")) {  

17.         cross_platform = true;  

18.     }  

19.     cf.setBoolean("mapreduce.app-submission.cross-platform", cross_platform);// 配置使用跨平台提交任务  

20.     // 设置yarn资源,不然会使用localhost:8032  

21.     cf.set("yarn.resourcemanager.address", yarnResourcemanagerAddress);  

22.     logger.info("获取任务状态,任务id:" + appIdStr);  

23.   

24.     SparkTaskState taskState = new SparkTaskState();  

25.     // 设置任务id  

26.     taskState.setAppId(appIdStr);  

27.     YarnClient yarnClient = YarnClient.createYarnClient();  

28.     // 初始化yarn的客户端  

29.     yarnClient.init(cf);  

30.     // yarn客户端启动  

31.     yarnClient.start();  

32.     ApplicationReport report = null;  

33.     try {  

34.         report = yarnClient.getApplicationReport(getAppId(appIdStr));  

35.     } catch (Exception e) {  

36.         logger.error("获取spark任务状态失败");  

37.     }  

38.   

39.     if(report != null){  

40.         YarnApplicationState state = report.getYarnApplicationState();  

41.         taskState.setState(state.name());  

42.         // 任务执行进度  

43.         float progress = report.getProgress();  

44.         taskState.setProgress(progress);  

45.         // 最终状态  

46.         FinalApplicationStatus status = report.getFinalApplicationStatus();  

47.         taskState.setFinalStatus(status.name());  

48.     }else{  

49.         taskState.setState(ConstParam.SPARK_FAILED);  

50.         taskState.setProgress(0.0f);  

51.         taskState.setFinalStatus(ConstParam.SPARK_FAILED);  

52.     }  

53.       

54.     // 关闭yarn客户端  

55.     yarnClient.stop();  

56.     logger.info("获取任务状态结束,任务状态:" + JSON.toJSONString(taskState));  

57.     return taskState;  

58. }  


四、yarn参数调节

1、可分配给容器的物理内存数量,一个nodemanage分配的内存,如果机器内存是128g,尽量分配2/3

yarn.nodemanager.resource.memory-mb80g

2、可以为容器分配的虚拟 CPU 内核的数量。该参数在 CDH 4.4 以前版本中无效。一个nodemanage分配的核数。如果机器是64和,尽量分配2/3.

yarn.nodemanager.resource.cpu-vcores40

3Java 进程堆栈内存的最大大小(以字节为单位)。已传递到 Java -Xmx

ResourceManager Java 堆栈大小(字节)

ResourceManager Default Group 

 B千字节兆字节吉字节

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章