当前位置: 首页 > ai >正文

Spark(19)Yarn-tool接口

需求

让自己编写的程序也可以支持动态参数。编写Yarn的Tool接口。

Tool接口定义

org.apache.hadoop.util.Tool 是 Apache Hadoop 框架里的一个接口,其用途是协助开发可通过命令行运行的 Hadoop 应用程序。该接口能够让程序解析命令行参数,并且以一致的方式和 Hadoop 配置系统交互。

接口定义如下:

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.util.Tool;

public interface Tool {

    int run(String[] args) throws Exception;

    void setConf(Configuration conf);

    Configuration getConf();

}

接口方法解释

  1. run(String[] args):此方法为应用程序的主要执行逻辑,接收命令行参数,返回一个整数代表执行结果(通常 0 表示成功,非 0 表示失败)。
  2. setConf(Configuration conf):用来设置 Hadoop 的配置对象。
  3. getConf():用于获取当前的 Hadoop 配置对象。

使用Tool接口步骤

步骤 1:实现 Tool 接口

你需要创建一个类来实现 Tool 接口,同时实现其中的run, setConf, getConf方法。

步骤 2:使用 ToolRunner 运行应用程序

ToolRunner 是 Hadoop 提供的一个实用类,可用于运行实现了 Tool 接口的应用程序。可以可以main方法中通过ToolRunner.run()来运行程序。

(四)示例代码

以下是一个简单示例,展示了如何使用 Tool 接口:

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.util.Tool;

import org.apache.hadoop.util.ToolRunner;

// 实现 Tool 接口

public class MyTool implements Tool {

    private Configuration conf;

    @Override

    public int run(String[] args) throws Exception {

        // 打印命令行参数

        for (String arg : args) {

            System.out.println("Argument: " + arg);

        }

        // 这里可以添加你的主要业务逻辑

        return 0; // 返回 0 表示执行成功

    }

    @Override

    public void setConf(Configuration conf) {

        this.conf = conf;

    }

    @Override

    public Configuration getConf() {

        return conf;

    }

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

        // 使用 ToolRunner 运行应用程序

        int exitCode = ToolRunner.run(new Configuration(), new MyTool(), args);

        System.exit(exitCode);

    }

}

代码解释

MyTool 类实现了 Tool 接口,并且实现了 run、setConf 和 getConf 方法。

run 方法会打印出接收到的命令行参数,你可以在此添加自己的业务逻辑。

main 方法使用 ToolRunner.run 方法来运行应用程序,并根据返回结果调用 System.exit 退出程序。

6. 运行示例

假设你已经将上述代码保存为 MyTool.java,可以按照以下步骤编译和运行:

(五)具体步骤

(1)新建Maven项目YarnDemo,并设置pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu.hadoop</groupId>

    <artifactId>yarn_tool_test</artifactId>

    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>

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

            <artifactId>hadoop-client</artifactId>

            <version>3.1.3</version>

        </dependency>

    </dependencies>

</project>

(2)新建一个包,名字为com.yarn。

(3)在这个包下创建类WordCountDriver并实现Tool接口:

package com.example.mapreduce;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.util.Tool;

import org.apache.hadoop.util.ToolRunner;

import java.io.IOException;

import java.util.Arrays;

//mapreduce: 分布式计算框架

// 提交任务给hadoop集群执行

// 它要做7件事 hadoop jar mc8.js com.example.mapreduce.WordCountDriver /要处理的文件夹 /结果路径

public class WordCountDriverTool implements Tool {

    private Configuration conf;

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

        switch(args[0]) {

            case "wordcount":

                int run = ToolRunner.run(new Configuration(), new WordCountDriverTool(), Arrays.copyOfRange(args,1, args.length));

                System.exit(run);

                break;

            default:

                throw new RuntimeException("no such tool" +args[0]);

        }

    }

    @Override

    public int run(String[] args) throws Exception {

        // 连接到hadoop集群

        // conf.set("fs.defaultFS", "hdfs://hadoop100:8020");

        Job job = Job.getInstance(conf);

        // 2. 关联本地的jar包

        job.setJarByClass(WordCountDriverTool.class);

        // 3. 关联Mapper和Reducer

        job.setMapperClass(WordCountMapper.class);

        job.setReducerClass(WordCountReducer.class);

        // 4. 设置Map的键值对泛型

        job.setMapOutputKeyClass(Text.class);

        job.setMapOutputValueClass(LongWritable.class);

        // 5. 设置Reduce的键值对泛型

        job.setOutputKeyClass(Text.class);

        job.setOutputValueClass(LongWritable.class);

        // 6. 设置输入路径(D:\vm\wcinput)和输出路径(D:\vm\output01)

        FileInputFormat.setInputPaths(job, new Path(args[0]));

        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        // 7. 提交job,根据返回值设置程序退出code

        return job.waitForCompletion(true) ? 0 : 1;

    }

    @Override

    public void setConf(Configuration configuration) {

 this.conf = configuration;

    }

    @Override

    public Configuration getConf() {

        return conf;

    }

}

重新打包生成jar,假设名称为MapReduceDemo1-1.0-SNAPSHOT.jar

上传到集群的节点上。

运行jar

hadoop jar MapReduceDemo1-1.0-SNAPSHOT.jar com.example.mapreduce.WordCountDriverTool wordcount  /wcinput /a1

不使用-D参数,测试运行。

接下来,使用-D参数运行效果。

hadoop jar MapReduceDemo1-1.0-SNAPSHOT.jar com.example.mapreduce.WordCountDriverTool wordcount -Dmapreduce.job.queue.name=test /wcinput /a2

运行结果如下

http://www.xdnf.cn/news/927.html

相关文章:

  • 力扣热题100——矩阵
  • 安卓的桌面 launcher是什么
  • 【AI】SpringAI 第三弹:接入通用大模型平台
  • CSS字体
  • 什么是SPA,SPA与MAP区别
  • redis-7 安装
  • 机器学习中,什么叫监督学习?什么叫非监督学习?
  • MCP(Minecraft Coder Pack)完全指南:从入门到精通
  • JavaScript 渲染内容爬取:Puppeteer 入门
  • PCIE Spec ---Base Address Registers
  • 每日算法-250421
  • 应急物资管理系统DW-S300|构建应急物资保障体系
  • Netdata 监控多台服务器
  • 树莓派5+L298N控制电机
  • Linux:进程控制
  • 《Learning Langchain》阅读笔记5-RAG(1)
  • 《作用域大冒险:从闭包到内存泄漏的终极探索》
  • 文字、语音、图片、视频四大领域的大模型、AI工具及其对比的详细分析及表格总结
  • 【Python】如何查找电脑上的Python解释器
  • C++编程指南38 - 使用 static_assert 检查类是否符合某个 concept
  • 极刻云搜-专业的软件网址搜索引擎
  • 基于Python(Django)+SQLite实现(Web)校园助手
  • redis常用的五种数据类型
  • DAY8:Oracle高可用架构深度解析与Data Guard单节点搭建实战
  • 在 macOS 上合并 IntelliJ IDEA 的项目窗口
  • Promise 原理、用法与在 Vue 中的最佳实践
  • XCTF-web(五)
  • Tez原理
  • 稳压二极管详解:原理、作用、应用与选型要点
  • 参加新手训练五十题平台 TUST-ACM实验室