首页 > 编程语言 >MapReduce初级编程实践:编写程序实现对输入文件的排序

MapReduce初级编程实践:编写程序实现对输入文件的排序

时间:2024-11-13 11:46:42浏览次数:3  
标签:bin IntWritable 编写程序 编程 hadoop MapReduce export apache import

 实验环境:

操作系统:Linux(Centos7);  

Xsell 7

Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)

现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。

输入文件1的样例如下:

33

37

12

40

输入文件2的样例如下:

4

16

39

5

输入文件3的样例如下:

1

45

25

根据输入文件1、2和3得到的输出文件如下:

1 1

2 4

3 5

4 12

5 16

6 25

7 33

8 37

9 39

10 40

11 45

具体步骤:

1、首先启动hadoop

start-all.sh

2、新建文件夹以及相应的文件1、2和3

(若之前创建过,则可以跳过此步)

mkdir MapReduce

 进入该文件夹

cd MapReduce

创建文件并存储

vi 1

 输入数据:

33

37

12

40

vi 2

输入数据:

4

16

39

5

vi 3

输入数据:

1

45

25

(切记要保存后退出!!!)

3、然后编码JAVA文件

vi MapReduce2.java

编写内容如下:(记得修改连接) 

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.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class MapReduce2{
	public static class Map extends Mapper<Object, Text, IntWritable, IntWritable>{
		
		private static IntWritable data = new IntWritable();
		public void map(Object key, Text value, Context context) throws IOException,InterruptedException{
			String text = value.toString();
			data.set(Integer.parseInt(text));
			context.write(data, new IntWritable(1));
		}
	}
	public static class Reduce extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>{
		private static IntWritable line_num = new IntWritable(1);
		public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException,InterruptedException{
			for(IntWritable val : values){
				context.write(line_num, key);
				line_num = new IntWritable(line_num.get() + 1);
			}
		}
	}
	public static class Partition extends Partitioner<IntWritable, IntWritable>{
		public int getPartition(IntWritable key, IntWritable value, int num_Partition){
			int Maxnumber = 65223;
			int bound = Maxnumber/num_Partition+1;
			int keynumber = key.get();
			for (int i = 0; i<num_Partition; i++){
				if(keynumber<bound * (i+1) && keynumber>=bound * i){
					return i;
				}
			}
			return -1;
		}
	}
	public static void main(String[] args) throws Exception{
		Configuration conf = new Configuration();
		conf.set("fs.default.name","hdfs://hadoop01:9000");//根据自己的对hadoop01:9000进行修改
		String[] otherArgs = new String[]{"input","output"}; 
		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in><out>");
			System.exit(2);
			}
		Job job = Job.getInstance(conf,"Merge and sort");
		job.setJarByClass(MergeSort.class);
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setPartitionerClass(Partition.class);
		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

4、赋予权限

sudo chown -R root MapReduce

这里的root为用户名,可以更改为你使用的用户名,后面的MapReduce则是存放文件的文件夹。

(前面做过可跳过)(为后面的创建目录做准备)

5、 配置环境

(前面修改过的话可以跳过)

//进入所修改的目标
vim ~/.bashrc
//所需要添加的内容
export HADOOP_HOME=/export/servers/hadoop  //这里的路径改为你的hadoop安装目录即可
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH  
//使更改生效
source ~/.bashrc

 6、编译

(此时仍然在创建的MapReduce文件夹中)

javac MapReduce2.java

7、打包为jar包

jar -cvf MapReduce2.jar *.class

8、输入与输出

创建目录(需要与前面赋予权限的用户名相同,我前面是root,所以这里也是root)

这里我还在MapReduce文件夹中,所以用的这个,你也可以直接转到hadoop的bin目录下使用hdfs指令来完成。

/export/servers/hadoop/bin/hdfs dfs -mkdir -p /user/root

先删除原来的input和output文件夹(如果原本没有可以跳过) 

注意:一开始一定要没有,否则影响实验运行,导致最后生成jar包失败,即output文件夹内容错误或没有变化。

/export/servers/hadoop/bin/hdfs dfs -rm input/*
/export/servers/hadoop/bin/hdfs dfs -rm -r output

创建input文件夹

/export/servers/hadoop/bin/hdfs dfs -mkdir input

上传输入文件

/export/servers/hadoop/bin/hdfs dfs -put ./1 input
/export/servers/hadoop/bin/hdfs dfs -put ./2 input
/export/servers/hadoop/bin/hdfs dfs -put ./3 input

使用生成的jar包

/export/servers/hadoop/bin/hadoop jar MapReduce2.jar MapReduce2

 查看输出

/export/servers/hadoop/bin/hdfs dfs -cat output/*

 成功输出:

标签:bin,IntWritable,编写程序,编程,hadoop,MapReduce,export,apache,import
From: https://blog.csdn.net/2201_75467743/article/details/143722472

相关文章

  • 【Cursor】揭秘Cursor:如何免费无限使用这款AI编程神器?
    在当今科技飞速发展的时代,人工智能编程工具层出不穷,其中Cursor凭借其卓越的功能和用户友好的体验,迅速在国际市场上引发了广泛关注。最近,该公司成功获得了OpenAI的6000万美元投资,进一步验证了其潜力和市场价值。那么,Cursor究竟具备怎样的强大能力?又该如何实现免费无限制使用......
  • sprintboot-aop切面编程demo
    AOP(面向切面编程)的核心概念是“切面”。切面是一个跨越多个对象的类,它封装了横切关注点的具体实现。通过定义切面,开发人员可以将通用功能从业务逻辑中分离出来,形成独立的模块。在SpringAOP中,切面由切点(Pointcut)、通知(Advice)和连接点(Joinpoint)组成。切点用于定义哪些连接点上应......
  • 编程判断主机字节序并了解大小端序
    1.主机字节序(1)概念:主机字节序又叫做CPU字节序,其不是又操作系统决定的,而是由CPU指令集架构决定的(2)分为两种:大端字节序:高序字节储存在低位地址,低序字节储存在高位地址小端字节序:高序字节储存在高位地址,低序字节储存在低位地址(3)储存方式:如0x12345678,其中78为低序字节,12为高序......
  • 树莓派开发资源知识点概览 树莓派基础介绍 树莓派编程环境搭建
    树莓派开发资源知识点概览章节目录一、树莓派基础介绍二、树莓派硬件资源三、树莓派系统安装与配置四、树莓派编程环境搭建五、树莓派常用开发工具与库六、树莓派网络配置与远程访问七、树莓派应用案例与实践八、树莓派学习资源与社区九、树莓派开发技巧与最佳实践一、树......
  • 【java编程】深入揭秘 Java 中 Person person = new Person(); 背后的奥秘
    当你在Java中写下Personperson=newPerson();时,这行代码看似简单,却蕴藏着深奥的计算机科学原理,甚至能揭示Java内存管理的神秘面纱。每当你创建一个对象,你实际上是在与Java的内核进行一场交互。今天,我们就来一起揭开这行代码的面纱,探索Java的对象创建机制,理解它是如何......
  • AOP(面向切面编程)
    五、AOP(1)AOP简介1.AOP(AspectOrientedProgramming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(ObjectOrientedProgramming)面向对象编程2.作用:在不惊动原始设计的基础上为其进行功能增强3.Spring理念:无入侵式/无侵入式(2)核心概念连接点(JoinPoint)程......
  • Go语言并发编程:轻松驾驭多线程世界(九)
    Go语言并发编程:轻松驾驭多线程世界在这里插入图片描述在现代编程中,并发是让你的程序变得更强大、更高效的关键技能。幸运的是,Go语言提供了一种简单、直观的方式来处理并发任务,使用轻量级的Goroutine和Channel,让我们能够像指挥交通一样简单地处理多个任务。今天,我们将......
  • Go 语言已立足主流,编程语言排行榜24 年 11 月
    Go语言概述Go语言,简称Golang,是由Google的RobertGriesemer、RobPike和KenThompson在2007年设计,并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标,以及简洁的语法、快速的编译速度和出色的并发处理能......
  • ResumeSDK简历解析库编程案例
    目录1、软件概述2、编程案例2.1、官网案例(阿里云)2.2、优化案例3、解析结果1、软件概述ResumeSDK简历解析是北京无奇科技有限公司研发,业界领先的智能简历解析和人岗匹配算法厂商,提供专业的AI招聘技术服务,致力于人力资源行业智能化这一进程。并已经上线阿里云或腾讯云,......
  • MapReduce解析简历存储到Postgres数据库
    目录一、功能描述二、代码实现1、代码结构2、ResumeDBWritable代码3、ResumeWritable代码4、ResumeSDK代码 5、ResumeDBMapper代码6、ResumeDBReducer代码7、ResumeDBPartationer代码8、ResumeDBDriver代码一、功能描述简历数据经过ETL流程,已经上传到HDFS上,需要针......