最近精读Hadoop WordCount的示例,发现里面应该存在一个"可能的"Bug,现斗胆发出,希望有高人指点.
Bug描述:
WordCount数单词的时候,如果遇到大文件会对文件进行切分.但是切分是按照字节来进行的,完全有可能会将一个单词切分成2个单词,这样也就可能会创造2个不存在的单词.
相关代码:
- WordCount main 函数
( FileInputFormat.addInputPath(job, new Path(otherArgs[0]));)
public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //FileInputFormat定义了大的输入文件,如何拆分 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }
- 具体拆分代码:
public InputSplit[] getSplits(JobConf job, int numSplits) throws IOException { FileStatus[] files = listStatus(job); // Save the number of input files in the job-conf job.setLong(NUM_INPUT_FILES, files.length); long totalSize = 0; // compute total size for (FileStatus file: files) { // check we have valid files if (file.isDir()) { throw new IOException("Not a file: "+ file.getPath()); } totalSize += file.getLen(); } long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits); long minSize = Math.max(job.getLong("mapred.min.split.size", 1), minSplitSize); // generate splits ArrayList<FileSplit> splits = new ArrayList<FileSplit>(numSplits); NetworkTopology clusterMap = new NetworkTopology(); //可以很清楚的看出来,这里的拆分全部是基于字节的. for (FileStatus file: files) { Path path = file.getPath(); FileSystem fs = path.getFileSystem(job); long length = file.getLen(); BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length); if ((length != 0) && isSplitable(fs, path)) { long blockSize = file.getBlockSize(); long splitSize = computeSplitSize(goalSize, minSize, blockSize); long bytesRemaining = length; while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) { String[] splitHosts = getSplitHosts(blkLocations, length-bytesRemaining, splitSize, clusterMap); splits.add(new FileSplit(path, length-bytesRemaining, splitSize, splitHosts)); bytesRemaining -= splitSize; } if (bytesRemaining != 0) { splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts())); } } else if (length != 0) { String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap); splits.add(new FileSplit(path, 0, length, splitHosts)); } else { //Create empty hosts array for zero length files splits.add(new FileSplit(path, 0, length, new String[0])); } } LOG.debug("Total # of splits: " + splits.size()); return splits.toArray(new FileSplit[splits.size()]); }
原因猜想:
Hadoop处理的是大数据,拆分中出现几个单词错误是可以接受的,所以Hadoop就没有对这个进行特别严格的处理.
解决方法:
也就是在后期读取文件时,做一些微调. 具体详情可以参考Blog: 大数据笔记--续谈WordCount的Bug
相关推荐
6.1 Hadoop概述 6.2 HDFS 6.2.1 HDFS文件系统的原型GFS 6.2.2 HDFS文件的基本结构 6.2.3 HDFS的存储过程 6.3 MapReduce编程框架 6.3.1 MapReduce的发展历史 ...6.5.7 在Hadoop系统上运行测试程序WordCount
7.1 概述 7.2 MapReduce体系结构 7.3 MapReduce工作流程 7.4 实例分析:WordCount 7.5 MapReduce的具体应用 7.6 MapReduce编程实践
主要介绍了大数据HelloWorld-Flink实现WordCount的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
storm-wordcount例子 storm-wordcount例子 storm-wordcount例子 storm-wordcount例子
1. HSDF获取文件:需要计算的源文本存在于HDFS系统上 2. Input(文件输入):HDFS中的文件都是以块(Block)为单位存储 3. Split
亲自测试的
cs-1660-gcp-wordcount-hw
大数据实验报告Hadoop编程实现wordcount单词统计程序附源码.doc
【大数据入门笔记系列】第五节 SpringBoot集成hadoop开发环境(复杂版的WordCount)前言环境清单创建SpringBoot项目创建包创建yml添加集群主机名映射hadoop配置文件环境变量HADOOP_HOME编写代码添加hadoop依赖jar包...
1.每个实验单元在 50 页的篇幅内完成一份报告 3.实验报告要求:书写工整规范,语言表达清楚,数据和程序真 4.参加实验的每位同学应独立完成实验报告的撰写,其
wc-mode:Emacs的Wordcount次要模式
CKEditor-WordCount-插件 CKEditor v4(或更高版本)的WordCount插件可对单词/字符进行计数,并在编辑器的页脚中显示单词计数和/或字符计数。 演示版 免责声明:这是一个分叉的版本,如果有人知道原始作者,我将...
云计算与大数据 MapReduce实验 Wordcount实验中所需数据包 WordCount.jar 不需要封装,centos7 linux hadoop实验上传所需
项目:maven-hadoop-java-wordcount-template 这是一个 Maven Hadoop Java 项目模板。 这个样板框架代码包含一个 Driver、一个 Mapper 和一个 Reducer,可以用您的代码修改(它们包含经典的 wordcount 示例)。 在您...
用java的MapReduce写了个demo,用于计算文档单词出现个数
wordcount-mapreduce Hadoop MapReduce WordCount 示例应用程序
实验2-在Hadoop平台上部署WordCount程序该项任务请同学作为作业自行完成,并提交实验报告。
005 - Spark框架 - 快速上手 - WordCount - 案例分析.avi 009 - Spark框架 - 快速上手 - WordCount - Spark的实现.avi 010 - Spark框架 - 快速上手 - WordCount - 日志和错误.avi 011 - Spark框架 - 运行环境 - 本地...
四川大学IT企业实训,拓思爱诺大数据第二次作业,MapReduce编程,包括Hadoop wordcount程序,及flowcount流量统计程序,包括重写排序及分区函数
3.2.2.在spark shell中编写WordCount程序 1.首先启动hdfs 2.向hdfs上传一个文件到hdfs://hdp-01:9000/wordcount/input/a.txt 3.在spark shell中用scala语言编写spark程序 scala> sc.textFile("hdfs://hdp-01:...