知识点
相关文章
更多最近更新
更多Hadoop集群(第9期)_MapReduce初级案例
2019-03-28 13:15|来源: 网络
相关系列目录:
Hadoop集群安装配置系列(目录) http://www.linuxidc.com/Linux/2012-12/76696.htm
1、数据去重
"数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重。下面就进入这个实例的MapReduce程序设计。
1.1 实例描述
对数据文件中的数据进行去重。数据文件中的每行都是一个数据。
样例输入如下所示:
1)file1:
2012-3-1 a
2012-3-2 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-7 c
2012-3-3 c
2)file2:
2012-3-1 b
2012-3-2 a
2012-3-3 b
2012-3-4 d
2012-3-5 a
2012-3-6 c
2012-3-7 d
2012-3-3 c
样例输出如下所示:
2012-3-1 a
2012-3-1 b
2012-3-2 a
2012-3-2 b
2012-3-3 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-6 c
2012-3-7 c
2012-3-7 d
1.2 设计思路
数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。我们自然而然会想到将同一个数据的所有记录都交给一台reduce机器,无论这个数据出现多少次,只要在最终结果中输出一次就可以了。具体就是reduce的输入应该以数据作为key,而对value-list则没有要求。当reduce接收到一个<key,value-list>时就直接将key复制到输出的key中,并将value设置成空值。
在MapReduce流程中,map的输出<key,value>经过shuffle过程聚集成<key,value-list>后会交给reduce。所以从设计好的reduce输入可以反推出map的输出key应为数据,value任意。继续反推,map输出数据的key为数据,而在这个实例中每个数据代表输入文件中的一行内容,所以map阶段要完成的任务就是在采用Hadoop默认的作业输入方式之后,将value设置为key,并直接输出(输出中的value任意)。map中的结果经过shuffle过程之后交给reduce。reduce阶段不会管每个key有多少个value,它直接将输入的key复制为输出的key,并输出就可以了(输出中的value被设置成空了)。
1.3 程序代码
程序代码如下所示:
package com.hebut.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.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 Dedup {
//map将输入中的value复制到输出数据的key上,并直接输出
public static class Map extends Mapper<Object,Text,Text,Text>{
private static Text line=new Text();//每行数据
//实现map函数
public void map(Object key,Text value,Context context)
throws IOException,InterruptedException{
line=value;
context.write(line, new Text(""));
}
}
//reduce将输入中的key复制到输出数据的key上,并直接输出
public static class Reduce extends Reducer<Text,Text,Text,Text>{
//实现reduce函数
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{
Configuration conf = new Configuration();
//这句话很关键
conf.set("mapred.job.tracker", "192.168.1.2:9001");
String[] ioArgs=new String[]{"dedup_in","dedup_out"};
String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: Data Deduplication <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "Data Deduplication");
job.setJarByClass(Dedup.class);
//设置Map、Combine和Reduce处理类
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);
}
}
相关问答
更多-
HADOOP MapReduce的tasktracker问题[2022-10-29]
首先,一个job具体启动多少个map,是由你配置的inputformat来决定的。inputformat在分配任务之前会对输入进行切片。最终启动的map数目,就是切片的结果数目。具体来看 一、如果使用是自定义的inputformat,那么启动多少个map,是由你实现的public InputSplit[] getSplits(JobConf job, int numSplits)方法决定的,返回的切片有多少个就启动多少个map任务。 二、如果是使用系统系统的TextInputFormat(或FileInpu ... -
hadoop mapreduce 可以访问另一个集群的hbase数据吗[2020-12-09]
应该是Hadoop在hbase和Hive中的作用吧。 hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储。而hbase是作为分布式数据库,而hive是作为分布式数据仓库。当然hive还是借用hadoop的MapReduce来完成一些hive中的命令的执行。而hbase与hive都是单独安装的。你需要哪个安装哪个,所以不存在重复信息。 hadoop作为底层存储是说HDFS吗 HDFS和HBase 还有Hive到底谁担任数据库呢 具体怎么分工? 我的意思是 如果有多个数据库的话 数 ... -
它需要这样的东西: conf.set("hadoop.security.authentication", "Kerberos"); UserGroupInformation.setConfiguration(conf); It requires something like this: conf.set("hadoop.security.authentication", "Kerberos"); UserGroupInformation.setConfiguration(conf);
-
创建一个目录来存放已编译的类: mkdir WordCount_classes 编译你的课程: javac -classpath $ {HADOOP_HOME} / hadoop - $ {HADOOP_VERSION} -core.jar -d WordCount_classes WordCount.java 从编译的类创建一个jar文件: jar -cvf $ HOME / code / hadoop / WordCount.jar -C WordCount_classes /。 为您的输入创建一个目录 ...
-
可用于使用Hadoop / MapReduce框架的集群[关闭](Clusters available for using Hadoop/MapReduce framework [closed])[2021-04-18]
亚马逊EC2已经准备好按时间租用Hadoop集群,即使是玩游戏也不是很贵。 其他方法是使用Cloudera Hadoop VM http://www.cloudera.com/downloads/virtual-machine/ 。 您可以在多个虚拟机上运行群集。 Amazon EC2 has ready to use Hadoop cluster for per time rent, not very expensive even for play. Other way is to play with C ... -
有多种方法可以模拟您的群集。 Hortonworks或cloudera docker图像,您可以在代码中生成并连接到它。 通过设置conf.set(“fs.default.name”,“file:///”)在本地运行MR; conf.set(“mapred.job.tracker”,“local”); 请参阅集成测试: http : //bytepadding.com/big-data/map-reduce/word-count-map-reduce/ 使用hbase-testing-util,它产生HDF ...
-
我不确定当你执行hadoop命令时,你实际上在客户端jar中执行代码时会有什么效果。 你能不能使用MR1? 问题说这个问题只发生在你使用MR2时,所以除非你真的需要Yarn,否则你可能更好地使用MR1库来运行你的map / reduce。 I'm not sure how that would work as when you're executing the hadoop command you're actually executing code in the client jar. Can you n ...
-
事实证明,我忘了部署MapReduce“客户端配置”,因此我的整个集群都以本地模式运行:“>已解决。 It turned out to be that I forgot to deploy MapReduce "client configuration" so my entire cluster was running in local mode :"> Solved.
-
我通过更改Reducer中的以下内容解决了这个问题: public void cleanup(Context context)=> public void cleanup(Reducer.Context context) hashtag.put()=> this.hashtag.put() sortedMap = sortByComparator(hashtag.asMap())=> sortedMap = sortByComparator(this.hashtag.asMap()) I solved th ...
-
映射器数量取决于InputSplits而不取决于复制因子。 有关了解InputSplits内部的信息,请参阅以下帖子: Hadoop流程记录如何跨块边界分割? 映射器和缩减 器的数量由Hadoop Framework决定。 有关详细信息,请参阅以下帖子: 默认减速机数量 为简单起见,假设HDFS块和InputSplit相同而没有跨越多个数据节点的数据。 在您的情况下, 1 TB文件处理需要8192个地图。 在启动Map任务时,map任务尝试在存在数据的节点上运行Mapper。 1个8192块的TB文件可能无 ...