-
2021-11-22 19:17:10
一、实验目的
- 通过实验掌握基本的MapReduce编程方法;
- 掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。
二、实验平台
- 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04)
- Hadoop版本:3.1.3
三、实验内容
编程实现文件合并和去重操作
对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。
输入文件A的样例如下:
20150101 x 20150102 y 20150103 x 20150104 y 20150105 z 20150106 x
输入文件B的样例如下:
20150101 y 20150102 y 20150103 x 20150104 z 20150105 y
根据输入文件A和B合并得到的输出文件C的样例如下:
20150101 x 20150101 y 20150102 y 20150103 x 20150104 y 20150104 z 20150105 y 20150105 z 20150106 x
四、实验步骤
进入 Hadoop 安装目录,启动 hadoop:
cd /usr/local/hadoop sbin/start-dfs.sh
新建文件夹,创建文件 A、B:
sudo mkdir MapReduce && cd MapReduce sudo vim A sudo vim B
编写 Java 文件实现 MapReduce:
sudo vim Merge.java
实现的 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.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 Merge { /** * @param args * 对A,B两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C */ //重载map函数,直接将输入中的value复制到输出数据的key上 public static class Map extends Mapper<Object, Text, Text, Text>{ private static Text text = new Text(); public void map(Object key, Text value, Context context) throws IOException,InterruptedException{ text = value; context.write(text, new Text("")); } } //重载reduce函数,直接将输入中的key复制到输出数据的key上 public static class Reduce extends Reducer<Text, Text, Text, Text>{ public void reduce(Text key, Iterable<Text> values, Context context ) throws IOException,InterruptedException{ context.write(key, new Text("")); } } public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Configuration conf = new Configuration(); conf.set("fs.default.name","hdfs://localhost: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 duplicate removal"); job.setJarByClass(Merge.class); job.setMapperClass(Map.class); job.setCombinerClass(Reduce.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); } }
赋予用户相关权限:
sudo chown -R hadoop /usr/local/hadoop
添加编译所需要使用的 jar 包:
vim ~/.bashrc
添加下面一行到文件的最后:
export HADOOP_HOME=/usr/local/hadoop export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
使更改立即生效:
source ~/.bashrc
编译 Merge.java:
javac Merge.java
打包生成的 class 文件为 jar 包:
jar -cvf Merge.jar *.class
创建 Hadoop 主目录为 /user/hadoop 并创建 input 文件夹:
/usr/local/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop /usr/local/hadoop/bin/hdfs dfs -mkdir input
若 intput 已存在则删除原有文件:
/usr/local/hadoop/bin/hdfs dfs -rm input/*
上传 A、B 文件到 input 文件夹中:
/usr/local/hadoop/bin/hdfs dfs -put ./A input /usr/local/hadoop/bin/hdfs dfs -put ./B input
使用之前确保 output 文件夹不存在:
/usr/local/hadoop/bin/hdfs dfs -rm -r output
使用我们刚生成的 Merge.jar 包:
/usr/local/hadoop/bin/hadoop jar Merge.jar Merge
查看输出结果:
/usr/local/hadoop/bin/hdfs dfs -cat output/*
输出如下:
hadoop@fzqs-Laptop:/usr/local/hadoop$ hdfs dfs -cat output/* 20170101 x 20170101 y 20170102 y 20170103 x 20170104 y 20170104 z 20170105 y 20170105 z 20170106 x hadoop@fzqs-Laptop:/usr/local/hadoop$
此外,有想用 Python 写的可以参考我这篇博客:实验5 MapReduce初级编程实践(Python实现)
更多相关内容 -
C++初级编程代码篇
2011-07-17 20:35:38初步C++入门代码,让初学者找到合适的实例,进行有效的练习编程。 -
C语言初级代码
2019-12-21 22:40:49每种编程语言在最开始写代码时,总是先打印 *hello world* #include<stdio.h> //引入头文件 //主函数 int main() { printf("hello world\n"); //printf()为输出函数,该函数是在stdio头文件中的;'\n'是换...打印hello world
- 每种编程语言在最开始写代码时,总是先打印 hello world
#include<stdio.h> //引入头文件 //主函数 int main() { printf("hello world\n"); //printf()为输出函数,该函数是在stdio头文件中的;'\n'是换行符 return 0; }
- 数据类型字符长度
#include<stdio.h> int main() { printf("sizeof(char)=%d\n",sizeof(char)); printf("sizeof(short)=%d\n",sizeof(short)); printf("sizeof(int)=%d\n",sizeof(int)); printf("sizeof(long)=%d\n",sizeof(long)); printf("sizeof(_int64)=%d\n",sizeof(_int64)); printf("sizeof(float)=%d\n",sizeof(float)); printf("sizeof(double)=%d\n",sizeof(double)); printf("sizeof(long double)=%d\n",sizeof(long double)); return 0; }
- 打印一个温度表
#include<stdio.h> int main() { printf("1\t-17\n"); printf("20\t-6\n"); printf("40\t4\n"); return 0; }
- 从1累加到100
#include<stdio.h> int main() { int num=0; int i; for(i=1;i<=100;i++) { num+=i; } printf("num=%d\n",num); return 0; }
- 阶乘(以10的阶乘为例)
#include<stdio.h> /*方式一*/ //int main() //{ int num=1; int i=1; /*while(i<=10) { num*=i; i++; } printf("num=%d\n",num); return 0; } /*方式二*/ int main() { do { num*=i; i++; } while(i<=10); printf("num=%d\n",num); return 0; } */ /*方式三*/ int main() { int num=1; int i; for(i=1;i<=10;i++) { num*=i; } printf("num=%d\n",num); return 0; }
- 打印一个的棋盘并产生随机数
#include<stdio.h> int main() { int a[10][10]={0}; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { printf("%d ",a[i][j]); } printf("\n"); } return 0; }
- 打印一个数据的二进制
#include<stdio.h> //打印一个数据的二进制 void disBin(char ch) { int i =8; while(i--) { if((1<<i)&&ch) printf("1"); else printf("0"); if(i%4==0) { printf(" "); } } putchar(10); } int main() { char a=0; disBin(a); char b=1; disBin(b); char c=2; disBin(c); char d=127; disBin(d); char e=-128; disBin(e); char f=-2; disBin(f); char g=-1; disBin(g); disBin(f+b); return 0; }``` - 打印一个九九乘法表 ```c #include<stdio.h> int main() { int i=1; int j=1; while(i<=9) { while(j<=i) { printf(" %d*%d=%2d ",j,i,i*j); j++; } printf("\n"); i++; } return 0; }
- 判断闰年
#include<stdio.h> int main() { int a; printf("请输入一个年份:"); scanf("%d",&a); if(a%4==0&&a%100!=0) { printf("是普通闰年\n"); } else if(a%400==0) { printf("是世纪闰年\n"); } else { printf("不是闰年\n"); } return 0; }
- 百钱买百鸡问题
公元前五世纪,我国古代数学家张邱健再《算经》一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁,鸡母,鸡雏各几何?
#include<stdio.h> //方法一,for循环 int main() { int w,m,c; int sum; int num; for(w=0;w<=20;w++) { for(m=0;m<=33;m++) { for(c=0;c<=300;c++) { sum=w*5+m*3+c/3; num=w+m+c; if(sum==100&&num==100) printf("鸡翁:%d,鸡母:%d,鸡雏:%d\n",w,m,c); } } } return 0; } //方式二,while循环 int main() { int w=0,m=0,c=0; int sum; int num; while(c<=300) { while(m<=33) { while(w<=20) { sum=w*5+m*3+c/3; num=w+m+c; if(sum==100&&num==100) { printf("鸡翁:%d,鸡母:%d,鸡雏:%d\n",w,m,c); } w++; } m++; } c++; } return 0; }
-
MFC初级编程
2011-10-17 21:52:04MFC初级编程代码,MFC应用程序编程,MFC相关类的说明,达内课程培训代码。 -
scratch编程项目源代码文件案例素材-我的声音我做主初级.zip
2022-05-16 11:54:12scratch编程项目源代码文件案例素材-我的声音我做主初级.zip -
Python学习初级编程实例(一)
2018-09-26 15:19:14题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?...程序源代码: for i in range(1,5): for j in range(1,5): for k in range(1,5): if(i!=k) and (i!=j) and (j!...题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
程序源代码:
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if(i!=k) and (i!=j) and (j!=k):
print(i*100+j*10+k)题目:一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?
程序分析:在10000以内判断,将该数加上100后再开方,加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:
程序源代码:
for i in range(10000):
x=int(math.sqrt(i+100))
y=int(math.sqrt(i+268))
if(x*x==i+100)and (y*y==i+268):
print (i)题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
程序源代码:
1=[]
for i in range(3):
x=int(raw_input("integer:\n"))
1.append(x) #append() 方法向列表的尾部添加一个新的元素
1.sort() #sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数
print(1) -
scratch编程项目源代码文件案例素材-[冬天来了,雪花飞舞--初级].zip
2022-05-16 10:46:03scratch编程项目源代码文件案例素材-[冬天来了,雪花飞舞--初级].zip -
scratch编程项目源代码文件案例素材-初级体验课-小卡搭的健康之战1.zip
2022-05-16 11:44:50scratch编程项目源代码文件案例素材-初级体验课-小卡搭的健康之战1.zip -
scratch编程初级探险
2021-06-18 07:00:54随着智能时代的到来,编程将会像阅读和写作一样成为孩子最基本的能力之一。编程已不是工程师的专利,将会成为下一个“通用语言”。 -
在窗口内显示图片,delphi初级代码
2021-05-18 09:47:12摘要:Delphi源码,界面编程,图片框 delphi初级代码:在窗口内显示图片,Delphi高手就免看了,初学Delphi的有需要了就下载源码吧。 -
程序员大神教你,新手零基础学C语言编程代码训练
2021-05-20 19:14:59我在文章中讲的东西他们都看懂了但具体到自己写代码的时候却完全不知道从何入手其实看懂知识点例程和真正学会写代码之间相差了好几条街我一再强调学编程没有捷径只有老老实实地敲代码接下来以训练为主1. 例题今天...我在文章中讲的东西他们都看懂了
但具体到自己写代码的时候却完全不知道从何入手
其实看懂知识点例程和真正学会写代码之间相差了好几条街
我一再强调
学编程没有捷径
只有老老实实地敲代码
接下来以训练为主
1. 例题
今天我们先来讲解一道C语言的经典例题,也是从零开始系列中的一道课后练习题。
请用控制台程序绘制如下图案。
循环经典例题
2. 分析
这个题目是要求打印30行"*",每行打印的个数不同。通过这个信息,我们应该立刻反映出运用循环来完成。那么我们想想,在循环部分我们都学到了什么。
关于循环,我首先会想到一些例题:
2.1 例题1
打印30个"*",每个"*"占一行。
2.2 例题2
打印一行"*",个数为30
这两个题目的代码只差一个,结果却完全不同。掌握了这两个例题,我们自然能够完成下面这个例题了。
2.3 例题3
打印一个由"*"组成的30行30列的矩阵。
执行结果如下:
30*30矩阵
我们再把例3的要求改一改,要求如下
2.4 例题4
打印30行“*”。第一行打印1个“*”,第二行打印3个“*”,第三行打印5个“*”,... ,第三十行打印59个“*”。
在前面的程序中,我们用变量i控制行的循环,变量j控制列的循环。i的范围0~29,j的范围0~29。那么在例题4中,i和j有什么样的关系呢?
于是得到这样一个关系:
那么如何实现循环2i + 1次呢,就是让j从0到2i + 1。
按照这个思路,可以得到下面的代码:
执行结果如下:
例题4
这里要说一个问题,其实for循环有两种常见形式:
for (i = 0; i
和
for (i = 1; i
这种写法执行的次数相同,可以相互代替。大部分C语言程序员喜欢第一种方式,因为数组的下标访问是从0开始的,这样写更方便。目前大家可以选择自己喜欢的方法。
好了,回到例题中来。现在我们的代码距离目标输出已经很接近了,缺少的是在每行“*”之前需要输入不同数量的空格。我们分析i和空格数量,可以得到如下关系:
每行输出LINE - i个空格
于是,我们得到了最终的实现程序。
3. 答案
运行一下这段代码,你会看到打印结果就是最前面的那张图。
4. 课后练习
自己编写代码,打印出下面这张图。
菱形
下一篇会讲解这个程序,请大家先做练习。
-
万能代码生成实战初级篇
2021-06-09 11:44:54基于独创的界面化拖拽式功能控件,结合流式处理模式,支持自定义编写javascript语言、java语言、freemaker模板语言,有效便捷的实现代码生成,不限平台、语言、框架生成需要的一切代码,以手把手的方式,通过示例... -
JAVA经典编程50题(附全部代码).pdf
2019-12-20 03:37:14JAVA经典编程50题涉及经典算法、初中级语法运用。适合初级开发者学习和探索;中级开发者回顾与提高;更适合在校学生备考以及求职者为技术面准备。 -
实验7 Spark初级编程实践
2021-12-23 10:07:16接下来,可以通过如下代码将整个应用程序打包成 JAR: /usr/local/sbt/sbt package 打包成功输出如下: 运行如下代码使用生成的 jar 包: /usr/local/spark/bin/spark-submit --class "HDFStest" /usr/local/spark/... -
5--[冬天来了,雪花飞舞--初级].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码
2022-04-16 17:04:385--[冬天来了,雪花飞舞--初级].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[冬天来了,雪花飞舞--初级].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[冬天来了,雪花飞舞--初级].zip... -
Flink初级编程实践(使用macOS上的IDEA远程调试服务器)——大数据基础编程实验之八
2021-10-10 17:18:25Flink初级编程实践——大数据基础编程实验之八 一、实验目的 (1)通过实验掌握基本的Flink编程方法。 (2)掌握用IntelliJ IDEA工具编写Flink程序的方法。 二、实验平台 (1)服务器 Ubuntu 16.04。 (2)个人电脑 ... -
MapReduce初级编程实践
2020-06-13 22:31:43(一)编程实现文件合并和去重操作 任务描述 本关任务:编程实现文件合并和去重操作。 相关知识 为了实现文件的合并去重,我们首先要知道文件中都有些什么,将文件内容进行“拆解”,映射(Map)到不同节点;然后在... -
初学者的编程逻辑
2018-08-31 17:14:56千锤百炼之后,终于总结出了一整套从零开始的贯穿始终的编程逻辑,特别适合初学者进入程序员的殿堂,也能帮助有一定经验的程序员快速编写代码。 这是一本真正告诉初学者如何通过推理进行编程的书,而不是介绍语法的... -
10行代码带你入门Windows编程
2022-04-22 12:21:08Windows编程——Hello World 开发工具 效果展示 源代码 主函数 主函数参数 HINSTANCE hInstancce hPreInstance LPSTR lpCmdLine nCmdShow MessageBox 小知识 开发工具 Visual Studio 2013 效果展示 源代码 #include ... -
实验5 MapReduce初级编程实践(Python实现)
2021-11-14 14:25:121. 编程实现文件合并和去重操作 对于两个输入文件,即文件A和文件B,请编写 MapReduce 程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。 2.编写程序实现对输入文件的排序 现在有多个输入... -
初级JavaSE入门视频教程(免费下载源代码)
2021-06-09 11:06:38初级JavaSE入门视频教程 -
MapReduce编程初级实践
2021-04-28 19:54:58MapReduce编程初级实践MapReduce编程初级实践1.编程实现文件合并和去重操作2. 编写程序实现对输入文件的排序功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片... -
初学者电脑编程入门
2017-05-25 14:00:001、首先要对编程有个比较大概的了解,编程的对象,编程的原理,编程的目的等等。2、在了解编程基本知识后,要想想自己学习编程后到底要干什么以确定学习的方向。比如说是想要开发手机app,网站开发,企业系统等。... -
源代码.zip_Windows编程_Java__Windows编程_Java_
2021-08-09 21:01:33具体要求如下:(1)扫雷小游戏分为新手、初级、中级、高级、大师五个级别,即挖出全部的地雷并且用时最少为胜利。(2)游戏默认的是初级级别,用户可以选择不同级别将出现对应级别的扫雷区域,单击重新开始菜单可以... -
RDD编程初级实践
2021-06-14 14:23:23首先,通过对RDD编程初级实践的练习,我们会通过spark采用textFile()方法来从文件系统中加载数据创建RDD、各种操作API以及持久化和分区方法;其中,需要注意常用的RDD转换操作API:filter(func)、map(func)、flatMap... -
实验5 MapReduce初级编程实践(2)——编写程序实现对输入文件的排序
2021-11-24 15:49:01通过实验掌握基本的MapReduce编程方法; 掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。 二、实验平台 操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04) Hadoop版本:3.1.3 ... -
[代码的艺术]20行代码的贪吃蛇
2016-09-21 10:33:42[代码的艺术]20行代码的贪吃蛇 -
RDD编程初级实践(Spark编程)
2021-06-05 17:27:12实现目录一、pyspark交互式编程1.该系总共有多少学生2.该系共开设了多少门课程3.Tom同学的总成绩平均分是多少4.求每名同学的选修的课程门数5.该系DataBase课程共有多少人选修6.各门课程的平均分是多少7.使用累加器... -
C语言编程初级入门
2018-04-12 22:29:05C语言 很强大 优点: 十分灵活, 强大 短小, 精悍 语言简洁 共有32个关键字, 9种控制语句, 书写形式自由 缺点: 太灵活, 编程自由度大, 入门有一定困难 运算符和运算优先级过多 不适合写大的东西