设为首页 收藏本站
查看: 640|回复: 0

[经验分享] hadoop 简单实现的一些代码集锦(可以运行)

[复制链接]

尚未签到

发表于 2015-7-14 07:57:21 | 显示全部楼层 |阅读模式
  该部分代码采用的hadoop 0.21.0的库,使用的API都是最新的
  1.实现最简单的wordcount,这个部分map函数的key输入应该设置为longwritable类型,object类型就不够规范了


DSC0000.gif DSC0001.gif View Code


import java.io.IOException;
import java.util.StringTokenizer;
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.Mapper.Context;
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 wordcount
{
    public static class TokenizerMapper extends Mapper
    {
        private final static IntWritable one=new IntWritable(1);
        private Text word=new Text();
        //map
        public void map(Object key,Text value,Context context) throws IOException,InterruptedException
        {
            //split the string to words
            StringTokenizer itr=new StringTokenizer(value.toString());
            while(itr.hasMoreTokens()){
                word.set(itr.nextToken());//push the split's word to the word class
                context.write(word,one);
            }
        }
    }
    public static class IntSumReduce extends Reducer {
        private IntWritable result=new IntWritable();
        //reduce
        public void reduce(Text key,Iterable values,Context context) throws IOException,InterruptedException
        {
            int sum=0;
            for(IntWritable val:values){
                sum+=val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        Configuration conf=new Configuration();
        //parameters
        String[] otherArgs=new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length!=2){
            System.err.println("Usage:wordcount");
            System.exit(2);
        }
        Job job=new Job(conf,"word count");
        job.setJarByClass(wordcount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReduce.class);
        job.setReducerClass(IntSumReduce.class);
        job.setOutputKeyClass(Text.class);
        //set output value
        job.setOutputValueClass(IntWritable.class);
        //set the path of input file
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        //set the path of output file
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        //submit the task and wait until it's end
        System.exit(job.waitForCompletion(true)?0:1);
    }
}
  2.实现简单的line Indexer,该部分代码实现的功能即是将输入文件中出现的word分词出来,并且对每个word输出其所在的行,以及该行的文本
  注意:这个程序对中文的实现以及带数字的文本实现并不好


View Code


import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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;
//会出现问题“Type mismatch in key from map” 是因为我的winscp软件的汉化作者尼玛的英文水平太他妈弱了
public class lineIndexer {
    public static  class LineIndexerMapper extends Mapper{
        private Text word = new Text();
        private Text summary = new Text();
        //  ->
        @Override
        public void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            String line = value.toString();
            StringTokenizer itr = new StringTokenizer(line.toLowerCase());
            summary.set(key.toString() + ":" + line);
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, summary);
            }
        }
    }
    public static class LineIndexerReducer extends Reducer{
        @Override
        public void reduce(Text key, Iterable values, Context context)
                throws IOException, InterruptedException {
            boolean first = true;
            StringBuilder str = new StringBuilder();
            Iterator itr = values.iterator();
            while(itr.hasNext()){
                if(!first){
                    str.append('^');
                }
                first=false;
                str.append(itr.next().toString());
            }
            context.write(key, new Text(str.toString()));
        }
    }
    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: LineIndexer  ");
            System.exit(2);
        }
        Job job;
        try {
            job = new Job(conf, "Line Indexer");
            job.setJarByClass(lineIndexer.class);
            job.setMapperClass(LineIndexerMapper.class);
            //????comment it or not?
            job.setCombinerClass(LineIndexerReducer.class);
            job.setReducerClass(LineIndexerReducer.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);
        } catch (InterruptedException ie) {
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  3.文档倒排索引,就是将输入文档中的单词统计出来,并输出每个单词出现的文档名以及偏移量,输出结果如下所示
  bird doc3@0
blue doc2@9
fish doc2@9;doc2@0;doc1@9;doc1@0
one doc1@0;doc3@0
red doc3@0;doc2@0
two doc1@9


View Code


import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class invert {
    public static class InvertedIndexMapper extends Mapper
    {
        protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
        {
            //default RecordReader:LineRecordReader;key:line offset;value;line string
            FileSplit fileSplit=(FileSplit)context.getInputSplit();
            String fileName=fileSplit.getPath().getName();
            Text word=new Text();
            Text fileName_lineOffset=new Text(fileName+"@"+key.toString());
            StringTokenizer itr=new StringTokenizer(value.toString());
            for(;itr.hasMoreTokens();){
                word.set(itr.nextToken());
                context.write(word,fileName_lineOffset);
            }
        }
    }
    public static class InvertedIndexReducer extends Reducer{
        protected void reduce(Text key,Iterablevalues,Context context) throws IOException,InterruptedException{
            Iterator it=values.iterator();
            StringBuilder all=new StringBuilder();
            if(it.hasNext())
            {
                all.append(it.next().toString());
            }
            for(;it.hasNext();)
            {
                all.append(";");
                all.append(it.next().toString());
            }
            context.write(key, new Text(all.toString()));
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try{
            Configuration conf=new Configuration();
            Job job = new Job(conf,"invert index");
            job.setJarByClass(invert.class);
            job.setInputFormatClass(TextInputFormat.class);
            job.setMapperClass(InvertedIndexMapper.class);
            job.setReducerClass(InvertedIndexReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
            FileInputFormat.addInputPath(job,new Path(args[0]));
            FileOutputFormat.setOutputPath(job,new Path(args[1]));
            System.exit(job.waitForCompletion(true)?0:1);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-86358-1-1.html 上篇帖子: hadoop集群监控工具ambari安装 下篇帖子: hadoop安装遇到的各种异常及解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表