首页 > 系统相关 >xshell7上实现MapReduce初级编程实践:对给定的表格进行信息挖掘

xshell7上实现MapReduce初级编程实践:对给定的表格进行信息挖掘

时间:2024-11-15 08:50:57浏览次数:3  
标签:String parent xshell7 编程 MapReduce hadoop child new name

  实验环境:

操作系统:Linux(Centos7);  

Xsell 7

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

下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。

输入文件内容如下:(保证之间空格为1,否则可能输出会出错)

child parent

Steven Lucy

Steven Jack

Jone Lucy

Jone Jack

Lucy Mary

Lucy Frank

Jack Alice

Jack Jesse

David Alice

David Jesse

Philip David

Philip Alma

Mark David

Mark Alma

输出文件内容如下:

grandchild grandparent

Steven Alice

Steven Jesse

Jone Alice

Jone Jesse

Steven Mary

Steven Frank

Jone Mary

Jone Frank

Philip Alice

Philip Jesse

Mark Alice

Mark Jesse

具体步骤:

1、首先启动hadoop

start-all.sh

2、新建文件夹以及相应的文件child-parent

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

mkdir MapReduce

 进入该文件夹

cd MapReduce

创建文件并存储

vi child-parent

 输入数据:

child parent

Steven Lucy

Steven Jack

Jone Lucy

Jone Jack

Lucy Mary

Lucy Frank

Jack Alice

Jack Jesse

David Alice

David Jesse

Philip David

Philip Alma

Mark David

Mark Alma

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

3、然后编码JAVA文件

vi MapReduce3.java

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

import java.io.IOException;
import java.util.*;
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.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 MapReduce3 {
	public static int time = 0;
	public static class Map extends Mapper<Object, Text, Text, Text>{
		public void map(Object key, Text value, Context context) throws IOException,InterruptedException{
			String child_name = new String();
			String parent_name = new String();
			String relation_type = new String();
			String line = value.toString();
			int i = 0;
			while(line.charAt(i) != ' '){
				i++;
			}
			String[] values = {line.substring(0,i),line.substring(i+1)};
			if(values[0].compareTo("child") != 0){
				child_name = values[0];
				parent_name = values[1];
				relation_type = "1";
				context.write(new Text(values[1]), new Text(relation_type+"+"+child_name+"+"+parent_name));
				relation_type = "2";
				context.write(new Text(values[0]), new Text(relation_type+"+"+child_name+"+"+parent_name));
			}
		}
	}
	public static class Reduce extends Reducer<Text, Text, Text, Text>{
		public void reduce(Text key, Iterable<Text> values,Context context) throws IOException,InterruptedException{
			if(time == 0){   
				context.write(new Text("grand_child"), new Text("grand_parent"));
				time++;
			}
			int grand_child_num = 0;
			String grand_child[] = new String[10];
			int grand_parent_num = 0;
			String grand_parent[]= new String[10];
			Iterator ite = values.iterator();
			while(ite.hasNext()){
				String record = ite.next().toString();
				int len = record.length();
				int i = 2;
				if(len == 0) continue;
				char relation_type = record.charAt(0);
				String child_name = new String();
				String parent_name = new String();
				while(record.charAt(i) != '+'){
					child_name = child_name + record.charAt(i);
					i++;
				}
				i=i+1;
				while(i<len){
					parent_name = parent_name+record.charAt(i);
					i++;
				}
				if(relation_type == '1'){
					grand_child[grand_child_num] = child_name;
					grand_child_num++;
				}
				else{
					grand_parent[grand_parent_num] = parent_name;
					grand_parent_num++;
				}
			}
			if(grand_parent_num != 0 && grand_child_num != 0 ){
				for(int m = 0;m<grand_child_num;m++){
					for(int n=0;n<grand_parent_num;n++){
						context.write(new Text(grand_child[m]), new Text(grand_parent[n]));
					}
				}
			}
		}
	}
	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,"Single table join");
		job.setJarByClass(simple_data_mining.class);
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.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 MapReduce3.java

7、打包为jar包

jar -cvf MapReduce3.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 ./child-parent input

使用生成的jar包

/export/servers/hadoop/bin/hadoop jar MapReduce3.jar MapReduce3

 查看输出

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

 成功输出:

标签:String,parent,xshell7,编程,MapReduce,hadoop,child,new,name
From: https://blog.csdn.net/2201_75467743/article/details/143722828

相关文章

  • GPU编程
    来源:https://worktile.com/kb/p/2155928 gpu编程有什么用? 图形处理单元(GPU)编程具有多种用途,主要包括:1、加速大规模计算任务、2、图形和视频渲染、3、深度学习和机器学习。GPU编程在深度学习和机器学习领域尤为重要。它允许数据科学家和研究人......
  • 2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的......
  • 编程之路,从0开始:知识补充篇
            Hello大家好,很高兴我们又见面了!    给生活添点passion,开始今天的编程之路!        这一篇我们来补充一下在之前篇目没讲到的知识,并结合一些码友的私信提问和我在编程中遇到的问题,做一些易错点或易混点的讲解。1、储存期        在......
  • Shell编程 - 变量篇
    变量1.系统变量在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过export导出成用户变量。一些写Shell脚本时常用的系统变量:$SHELL默认Shell$HOME当前用户家目录$IFS内部字段分隔符......
  • shell编程 - 基础篇
    1.Shell简介 Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。2.Shell编程语言必知必会shell命令解释器:bash编程常用命令解释器.命令解释器bash目前应用最广......
  • 深入浅出C#编程语言
    引言随着.NET框架的发展,C#(发音为“CSharp”)已经成为一种非常流行且功能强大的面向对象和类型安全的编程语言。自2002年由微软首次发布以来,C#已经经历了多个版本的迭代,每个新版本都带来了更多的特性和改进。本文旨在为初学者提供一个C#编程语言的基础概述,并探讨其一些核心......
  • C++基础编程(一)
    If语句,条件运算符&&||,运算符优先级,for循环语句,switch语句,continue,break,do,while打印一个锥形1~9矩阵,打印9*9乘法表,For(初始化;条件;每次循环必执行语句)输出abcd....ABCD....0123....输出从1~1000,能被7整除的数While输入一组数,0为结束,计算他们的和......
  • Python并行编程1并行编程简介(上)高频面试题:GIL进程线程协程
    1并行编程简介首先,我们将讨论允许在新计算机上并行执行的硬件组件,如CPU和内核,然后讨论操作系统中真正推动并行的实体:进程和线程。随后,将详细说明并行编程模型,介绍并发性、同步性和异步性等基本概念。介绍完这些一般概念后,我们将讨论全局解释器锁(GIL)及其带来的问题,从而了解Py......
  • 哋它亢 编程语言
    哋它亢是一门易于学习、功能强大的编程语言[1]。它提供了高效的高级数据结构,还能简单有效地面向对象编程。哋它亢优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。哋它亢官网(https://www.datacon-14302.xyz/[2])上免费提供了......
  • Spring Boot编程训练系统:核心特性与实现策略
    3系统分析3.1可行性分析通过对本编程训练系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。3.1.1技术可行性本编程训练系统采用SSM框架,JAVA作为开发语言,是基于WEB平台的B/S架构系统......