Hadoop——基础练习题

论坛 期权论坛     
选择匿名的用户   2021-5-30 01:55   559   0
<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&lt;LongWritable, Text,Text, IntWritable&gt;
           第一个参数类型 只能为LongWritable表示读入文件的偏移量 这个偏移量是读入行的Key
           第二个参数类型 表示传进来的每一行数据 这一行数据内容是读入文件的值
           第三个参数类型 表示出入的Key的类型
           第四个参数类型 标书输出的Value的类型
           继承Mapper后需要重写方法 map(LongWritable key, Text value, Context context)
               map方法中的参数为Mapper的前两个参数类型 context表示上下文 输出给Reduce
               在文件读出的每一行都要去调用一次map方法
       Reduce主要用于数据的计算
           计算的类继承Reduce后需要填入他的泛型
           Reduce&lt;Text,IntWritable,Text,IntWritable&gt;
           表示&lt;从Mapper接受他输出Key的类型,从Mapper接受的value的数据类型,从Reduce输出到文件Key的类型,从Reduce输出到文件Value的类型&gt;
           重写reduce方法reduce(Text key, Iterable&lt;IntWritable&gt; 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&lt;LongWritable, Text,Text, IntWritable&gt;{<!-- --><span style="color:#008000;">//</span><span style="color:#008000;">编写继承Mapper的类用于拆分
        </span><span style="color:#008000;">//</span><span style="color:#0080
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP