<div class="blogpost-body" id="cnblogs_post_body">
<h1>一、Wordcount练习</h1>
<h2> 1.需求:通过hadoop分析文件中单词总数</h2>
<p> 1.要被分析的文件内容如图所示,每个单词之间以空格分开</p>
<p> <img alt="" height="519" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6708b50bf69d2c973de7ff8c51b99dc7.png" width="795"></p>
<p> 2.实现的效果如图</p>
<p> <img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-889221b17afe18fcadeb1037e8a0e0ad.png"></p>
<p> </p>
<h2> 2.代码实现</h2>
<h3> 1.<span style="color:#ff6600;">解决数据倾斜问题</span></h3>
<p> 考虑到在机器运行过程中 Reduce阶段每个相同的Key会由一个ReduceTask来处理,而java共有十六万个,其他的单词只有几个,分出的ReduceTask处理少的单词很快就完成,但是处理的java的单词会用一些时间才处理完,这就造成了严重的数据倾斜的状况,所以在这种情况下应该创建多个分区,将整个数据分到不同的分区中, 然后分区中在处理的java单词数量就会大大减少工作时间,然后将各个分区的统计在相加得出最终结果.具体实现看代码</p>
<h3> 2.编写代码</h3>
<p> </p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#0000ff;">package</span><span style="color:#000000;"> com.wxw.superwc;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.conf.Configuration;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.fs.FileSystem;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.fs.Path;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.io.IntWritable;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.io.LongWritable;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.io.Text;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.Job;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.Mapper;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.Partitioner;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.Reducer;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> java.io.IOException;
</span><span style="color:#0000ff;">import</span><span style="color:#000000;"> java.util.Random;
</span><span style="color:#008000;">/*</span><span style="color:#008000;">在Hadoop中想要实现数据整合就必须有类去继承 Mapper 和 Reduce 这两个类
Map主要用于数据的拆分后 以键值对的形式向Reduce输出
在继承Mapper中 需要填入泛型约束他的参数类型
Mapper<LongWritable, Text,Text, IntWritable>
第一个参数类型 只能为LongWritable表示读入文件的偏移量 这个偏移量是读入行的Key
第二个参数类型 表示传进来的每一行数据 这一行数据内容是读入文件的值
第三个参数类型 表示出入的Key的类型
第四个参数类型 标书输出的Value的类型
继承Mapper后需要重写方法 map(LongWritable key, Text value, Context context)
map方法中的参数为Mapper的前两个参数类型 context表示上下文 输出给Reduce
在文件读出的每一行都要去调用一次map方法
Reduce主要用于数据的计算
计算的类继承Reduce后需要填入他的泛型
Reduce<Text,IntWritable,Text,IntWritable>
表示<从Mapper接受他输出Key的类型,从Mapper接受的value的数据类型,从Reduce输出到文件Key的类型,从Reduce输出到文件Value的类型>
重写reduce方法reduce(Text key, Iterable<IntWritable> values, Context context)
在Reduce是处理的相同键不同值的value结合
创建继承分区Partitioner的类 并重写方法
getPartition(Text text, IntWritable intWritable, int i)
三个参数表示从Mapper接受的键和值的类型及在主程序中设置的分区个数的值
</span><span style="color:#008000;">*/</span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> SuperWc {
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> SupWcMa <span style="color:#0000ff;">extends</span> Mapper<LongWritable, Text,Text, IntWritable>{<!-- --><span style="color:#008000;">//</span><span style="color:#008000;">编写继承Mapper的类用于拆分
</span><span style="color:#008000;">//</span><span style="color:#0080 |
|