当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » Java  » 编程基础
分享到: 
收藏 +0
1
标签: Hadoop

代码片段(1) [全屏查看所有代码]

1. [代码]CSDN十大常用密码     跳至 [1] [全屏预览]

import java.io.IOException;
import java.util.Random;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
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 csdn{

  public static class CountMapper extends Mapper<Object, Text, Text, IntWritable>{
    
    private final static IntWritable one = new IntWritable(1);
    private Text password = new Text();
      
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
      
        String eachline=value.toString();
        String [] eachterm=eachline.split("#");
        
        password.set(eachterm[1]);
        
    	context.write(password, one);
      
    }
  } 
  
  public static class CountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable total = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
      
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      total.set(sum);
      context.write(key,total);
    }
  }
  

  public static class SortMapper extends Mapper<Object, Text, IntWritable,Text>{
	    
	    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
	      
	    	IntWritable times = new IntWritable(1);
	 	    Text password = new Text();
	 	   
	 	    
	    	String eachline=value.toString();
	    	String[] eachterm =eachline.split("	");
	    	
	    	if(eachterm.length==2){
	    		password.set(eachterm[0]);
	    		times.set(Integer.parseInt(eachterm[1]));
	    		context.write(times,password);
	    	}else{
	    		password.set("errorpassword");
	    		context.write(times,password);
	    	}
	    }
	  } 
	  
	  public static class SortReducer extends Reducer<IntWritable,Text,IntWritable,Text> {
		  private Text password = new Text();

		  public void reduce(IntWritable key,Iterable<Text> values, Context context) throws IOException, InterruptedException {
	      
			//不同的密码可能出现相同的次数
	    	for (Text val : values) {
	        	password.set(val);
	        	context.write(key,password);
	    	}
	    }
	}
  
  
  private static class IntDecreasingComparator extends IntWritable.Comparator {
      public int compare(WritableComparable a, WritableComparable b) {
        return -super.compare(a, b);
      }
      
      public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
          return -super.compare(b1, s1, l1, b2, s2, l2);
      }
  }
  
  

  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: csdn <in> <out>");
	      System.exit(2);
	    }
	    
	    Job job = new Job(conf, "csdn");
	    job.setJarByClass(csdn.class);
	    job.setMapperClass(CountMapper.class);
	    job.setCombinerClass(CountReducer.class);
	    job.setReducerClass(CountReducer.class);
	    
	    job.setOutputKeyClass(Text.class);
	    job.setOutputValueClass(IntWritable.class);
	    
	    //定义一个临时目录,先将词频统计任务的输出结果写到临时目录中, 下一个排序任务以临时目录为输入目录。
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
	    Path tempDir = new Path("csdn-temp-" + Integer.toString(new Random().nextInt(Integer.MAX_VALUE))); 
	    FileOutputFormat.setOutputPath(job, tempDir);
		
	    
	    if(job.waitForCompletion(true))
		{
			Job sortJob = new Job(conf, "csdnsort");
			sortJob.setJarByClass(csdn.class);
			
			FileInputFormat.addInputPath(sortJob, tempDir);
			
			sortJob.setMapperClass(SortMapper.class);
            FileOutputFormat.setOutputPath(sortJob, new Path(otherArgs[1]));
            
        	sortJob.setOutputKeyClass(IntWritable.class);
			sortJob.setOutputValueClass(Text.class);
			
            sortJob.setSortComparatorClass(IntDecreasingComparator.class);
 
            FileSystem.get(conf).deleteOnExit(tempDir);
            
			System.exit(sortJob.waitForCompletion(true) ? 0 : 1);
		}
	    
	    System.exit(job.waitForCompletion(true) ? 0 : 1);
	    
		
	    
  }
  
  
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(32)

  • 1楼:IdleMan 发表于 2012-02-23 08:29 回复此评论
    好像很牛逼的样子
  • 2楼:溪涧顽石 发表于 2012-02-23 08:57 回复此评论
    好像很牛逼的样子
  • 3楼:FeiFan 发表于 2012-02-23 09:16 回复此评论
    如果用dumbo写的话:
    # -*- coding: utf-8 -*- 
    from dumbo import sumreducer
    
    def mapper(key, value):    
        pwd = map(lambda x: x.strip(), value.split('#'))[1]
        yield pwd, 1
    
    
    if __name__ == "__main__":
        import dumbo
        dumbo.run(mapper, sumreducer)



    执行
    dumbo start csdntoppwd.py -hadoop ~/Desktop/hadoop-0.22.0/ -input csdn.dat -output toppwd

    最后加上个显示结果
    dumbo cat toppwd/part* -hadoop ~/Desktop/hadoop-0.22.0/ | sort -t $'\t' -k2,2nr | head -n 10 






  • 4楼:路人丙 发表于 2012-02-23 12:30 回复此评论
    好像都很NB的样子,反正我都看不懂,看不懂的都是很高深的,所以果断膜拜
  • 5楼:chenbilly 发表于 2012-02-24 20:24 回复此评论
    各路大神 请接受小弟的膜拜...
  • 6楼:wad12302 发表于 2012-02-25 14:51 回复此评论

    引用来自“路人丙”的评论

    好像都很NB的样子,反正我都看不懂,看不懂的都是很高深的,所以果断膜拜
    受教
  • 7楼:Fred 发表于 2012-02-26 10:42 回复此评论
    汗~
  • 8楼:洪文军 发表于 2012-02-26 20:53 回复此评论
    JAVA 怎么比 C/C++ 啰唆多了
    用 C++ 应该 没有几行代码吧
  • 9楼:洪文军 发表于 2012-02-26 21:37 回复此评论
    #include <iostream>
    #include <unordered_map>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        char buffer[100];
        char userid[32];
        char password[32];
        unordered_map<string, size_t> mapPassWord;
    
        FILE* pFile;
        pFile = fopen("C:/temp/www.csdn.net.sql" , "r");
        if (pFile == NULL) perror("Error opening file");
        else {
            while (! feof(pFile)) {
                fgets(buffer , 100 , pFile);
                sscanf(buffer, "%s # %s #" , userid , password);
                ++mapPassWord[string(password)];
                if (mapPassWord[string(password)] == 10000)
                    cout <<  string(password) << "\t密码使用超过10000 " << endl;
            }
        }
    
        fclose(pFile);
        return 0;
    }
    
    //        123456789       密码使用超过10000
    //        12345678        密码使用超过10000
    //        11111111        密码使用超过10000
    //        00000000        密码使用超过10000
    //        dearbook        密码使用超过10000
    //        123123123       密码使用超过10000
    //        1234567890      密码使用超过10000
    //        88888888        密码使用超过10000
    //
    //        Process returned 0 (0x0)   execution time : 39.797 s
    //        Press any key to continue.


  • 10楼:findyouthme 发表于 2012-02-27 10:37 回复此评论
    表示无语中。。
  • 11楼:intergret 发表于 2012-02-27 13:01 回复此评论

    引用来自“洪文军”的评论

    JAVA 怎么比 C/C++ 啰唆多了
    用 C++ 应该 没有几行代码吧
    很多代码是跟hadoop的mapreduce函数相关。单单从每行中取出userid、password Java也用不了加行~
  • 12楼:何世友 发表于 2012-02-28 09:55 回复此评论
    不该如此啰嗦啊,可否精简?     
  • 13楼:gtd 发表于 2012-02-28 11:06 回复此评论

    引用来自“findyouthme”的评论

    表示无语中。。
    。。。。
  • 14楼:FeiFan 发表于 2012-02-28 11:36 回复此评论

    引用来自“洪文军”的评论

    #include <iostream>
    #include <unordered_map>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        char buffer[100];
        char userid[32];
        char password[32];
        unordered_map<string, size_t> mapPassWord;
    
        FILE* pFile;
        pFile = fopen("C:/temp/www.csdn.net.sql" , "r");
        if (pFile == NULL) perror("Error opening file");
        else {
            while (! feof(pFile)) {
                fgets(buffer , 100 , pFile);
                sscanf(buffer, "%s # %s #" , userid , password);
                ++mapPassWord[string(password)];
                if (mapPassWord[string(password)] == 10000)
                    cout <<  string(password) << "\t密码使用超过10000 " << endl;
            }
        }
    
        fclose(pFile);
        return 0;
    }
    
    //        123456789       密码使用超过10000
    //        12345678        密码使用超过10000
    //        11111111        密码使用超过10000
    //        00000000        密码使用超过10000
    //        dearbook        密码使用超过10000
    //        123123123       密码使用超过10000
    //        1234567890      密码使用超过10000
    //        88888888        密码使用超过10000
    //
    //        Process returned 0 (0x0)   execution time : 39.797 s
    //        Press any key to continue.


    你的code 虽然比JAVA短, 但是不容易分布式运算啊
  • 15楼:Jekey 发表于 2012-02-28 11:56 回复此评论

    效果如何?

  • 16楼:hit9 发表于 2012-02-28 17:10 回复此评论

    引用来自“suren”的评论

    好像很牛逼的样子
    +1
  • 17楼:洪文军 发表于 2012-02-28 21:36 回复此评论

    引用来自“intergret”的评论

    引用来自“洪文军”的评论

    JAVA 怎么比 C/C++ 啰唆多了
    用 C++ 应该 没有几行代码吧
    很多代码是跟hadoop的mapreduce函数相关。单单从每行中取出userid、password Java也用不了加行~
    没注意看你是用 分布式 系统的,不好意思

    搜索了下分本式,C++ 也可以用分布式
    http://www.codelast.com/?p=825
    用C++开发一个简单的hadoop分布式计算应用程序
  • 18楼:intergret 发表于 2012-02-29 09:33 回复此评论

    引用来自“洪文军”的评论

    引用来自“intergret”的评论

    引用来自“洪文军”的评论

    JAVA 怎么比 C/C++ 啰唆多了
    用 C++ 应该 没有几行代码吧
    很多代码是跟hadoop的mapreduce函数相关。单单从每行中取出userid、password Java也用不了加行~
    没注意看你是用 分布式 系统的,不好意思

    搜索了下分本式,C++ 也可以用分布式
    http://www.codelast.com/?p=825
    用C++开发一个简单的hadoop分布式计算应用程序
    hadoop 支持开发者使用c++编写mapreduce接口,叫做Pipes。实际上任何编程语言通过标准流都可以编写Mapreduce~
  • 19楼:四小牛 发表于 2012-02-29 10:49 回复此评论
    观摩了
  • 20楼:四小牛 发表于 2012-02-29 10:49 回复此评论
    观摩了
开源从代码分享开始 分享代码
intergret的其它代码 全部(35)...