MapReduce中的老版本API案例和多个job依赖执行案例——千峰视频

本文介绍了一个使用MapReduce实现的依赖执行案例,包括两个Job的设置与执行过程。首先通过GrepMyMapper过滤特定词汇,然后CountMapper统计剩余词汇出现次数,最后由CountReducer汇总结果。文章详细展示了如何使用Hadoop的JobControl进行Job之间的依赖控制。

MapReduced的多个job依赖执行案例(这里是两个job)

改了条件

到此,依赖执行就已经OK了。

package qf.com.mr;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * 依赖执行
 *
 */
public class DepenDemo {
	public static class GrepMyMapper extends Mapper<LongWritable, Text, Text, Text> {
		public static Text k = new Text();
		public static Text v = new Text();

		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			// 1.从输入数据中获取每一个文件中的每一行的值
			String line = value.toString();
			// 2.对每一行的数据进行切分(有的不用)
			String[] words = line.split(" ");
			// 3.循环处理
			for (String word : words) {
				if (!word.equals("is") && !word.equals("hello")) {
					k.set("");
					v.set(word);
					// map阶段的输出 context上下文环境变量
					context.write(k, v);// 这个输出在循环里面 有一个输出一个
				}
			}
		}

	}

	public static class CountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
		public static Text k = new Text();
		public static IntWritable v = new IntWritable();
		
		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			System.out.println("我能进来 ");
			// 1.从输入数据中获取每一个文件中的每一行的值
			String line = value.toString();
			// 2.对每一行的数据进行切分(有的不用)
			String[] words = line.split("\t");
			// 3.循环处理
			System.out.println("我能拆分 ");
			for (String word : words) {
				k.set(word);
				v.set(1);
				System.out.println(word);
				// map阶段的输出 context上下文环境变量
				context.write(k, v);// 这个输出在循环里面 有一个输出一个
			}
			System.out.println("我运行完了 ");
		}
		

	}

	public static class CountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

		@Override
		protected void reduce(Text key, Iterable<IntWritable> values, Context context)
				throws IOException, InterruptedException {
			// 1.自定义一个计数器
			int counter = 0;
			for (IntWritable i : values) {
				counter += i.get();
			}
			// 2.reduce阶段的最终输出
			context.write(key, new IntWritable(counter));
			// 这个输出在循环外面 等统计完了这一个容器再输出
		}

	}

	// 驱动
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		// 1.获取配置对象信息
		Configuration conf = new Configuration();
		// 2.对conf进行设置(没有就不用)
		conf.set("mapred.jar", "wc.jar");
		// grepjob
		// 3.获取job对象 (注意导入的包)
		Job grepjob = Job.getInstance(conf, "grep job");
		// 4.设置job的运行主类
		grepjob.setJarByClass(DepenDemo.class);
		// 5.对map阶段进行设置
		grepjob.setMapperClass(GrepMyMapper.class);
		grepjob.setMapOutputKeyClass(Text.class);
		grepjob.setMapOutputValueClass(Text.class);
		FileInputFormat.addInputPath(grepjob, new Path(args[0]));// 具体路径从控制台输入
		FileOutputFormat.setOutputPath(grepjob, new Path(args[1]));

		// =========
		// countjob
		Job countjob = Job.getInstance(conf, "count job");
		
		countjob.setMapperClass(CountMapper.class);
		countjob.setMapOutputKeyClass(Text.class);
		countjob.setMapOutputValueClass(IntWritable.class);
		System.out.println("我在运行");
		FileInputFormat.addInputPath(countjob, new Path(args[1]));// 具体路径从控制台输入
		System.out.println(new Path(args[1]+"/part-r-00000"));
		System.out.println(new Path(args[2]+"/part-r-00000"));
		countjob.setReducerClass(CountReducer.class);
		countjob.setOutputKeyClass(Text.class);
		countjob.setOutputValueClass(IntWritable.class);
		FileOutputFormat.setOutputPath(countjob, new Path(args[2]));

		// 创建单个作业控制器
		ControlledJob gcj = new ControlledJob(grepjob.getConfiguration());
		ControlledJob ccj = new ControlledJob(countjob.getConfiguration());

		// 再添加依赖
		ccj.addDependingJob(gcj);
		// 定义一个总的作业控制器
		JobControl jc = new JobControl("grebjob and countjob");
		// 将单个作业控制器放入总的作业控制器中
		jc.addJob(gcj);
		jc.addJob(ccj);
		// 获取一个线程
		Thread th = new Thread(jc);
		// 启动线程
		th.start();
		// 判断job是否完全运行完成
		if (jc.allFinished()) {
			th.sleep(2000);
			th.stop();
			jc.stop();
			System.exit(0);

		}

	}
}

MapReduce中的老版本API案例

老版本导入的包都是短包

 

有三四处不相同,右键导出jar包, 上传文件到home目录下面

到此也就OK了。

package qf.com.mr;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;


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.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.RunningJob;



/*
*类说明:hadoop 1.X的写法
*老版本
*/
public class OldApi {
	public static class MyMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, Text>{

		public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter)
				throws IOException {
			String line = value.toString();			
			//StringTokenizer 这个类默认用空格或者\t来切分
			StringTokenizer st =  new StringTokenizer(line);
			while(st.hasMoreTokens()) {
				output.collect(new Text(st.nextToken()), new Text(1+""));
			}
			
		}
		
	}
	public static class MyReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text>{

		public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter)
				throws IOException {
			int counter = 0;
			while(values.hasNext()) {
				counter += Integer.parseInt(values.next().toString());
			}
			output.collect(key, new Text(counter+""));
		}

		
	}
	public static void main(String[] args) {
		Configuration conf = new Configuration();
		
		try {
			JobConf job = new JobConf(conf);
			job.setJarByClass(OldApi.class);
			
			job.setMapperClass(MyMapper.class);
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(Text.class);
			FileInputFormat.addInputPath(job, new Path(args[0]));
			
			job.setReducerClass(MyReducer.class);
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(Text.class);
			FileOutputFormat.setOutputPath(job, new Path(args[1]));
			
			//提交
			JobClient jc = new JobClient(job);
			RunningJob rj = jc.runJob(job);
			int isok = rj.getJobState();
			if(isok == 2) {
				System.exit(0);
			}else {
				System.exit(1);
			}
			
		} catch (Exception e) {
		}
	}
}

 

 

Nano-ESG数据资源库的构建基于2023年初至2024年秋季期间采集的逾84万条新闻文本,从中系统提炼出企业环境、社会及治理维度的信息。其构建流程首先依据特定术语在德语与英语新闻平台上检索,初步锁定与德国DAX 40成分股企业相关联的报道。随后借助嵌入技术对文本段落执行去重操作,以降低内容冗余。继而采用GLiNER这一跨语言零样本实体识别系统,排除与目标企业无关的文档。在此基础上,通过GPT-3.5与GPT-4o等大规模语言模型对文本进行双重筛选:一方面判定其与ESG议题的相关性,另一方面生成简明的内容概要。最终环节由GPT-4o模型完成,它对每篇文献进行ESG情感倾向(正面、中性或负面)的判定,并标注所涉及的ESG具体维度,从而形成具备时序特征的ESG情感与维度标注数据集。 该数据集适用于多类企业可持续性研究,例如ESG情感趋势分析、ESG维度细分类别研究,以及企业可持续性事件的时序演变追踪。研究者可利用数据集内提供的新闻摘要、情感标签与维度分类,深入考察企业在不同时期的环境、社会及治理表现。此外,借助Bertopic等主题建模方法,能够从数据中识别出与企业相关的核心ESG议题,并观察这些议题随时间的演进轨迹。该资源以其开放获取特性与连续的时间覆盖,为探究企业可持续性表现的动态变化提供了系统化的数据基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值