大資料學習日記day1

Chaos_001發表於2017-08-21

複習

  • hdfs的讀寫
  • secondary namenode的工作原理
  • shell指令碼定時採集資料到hdfs

mapreduce

  • 是一個程式設計框架
  • 分為兩個階段:
    1. map階段,task併發例項各司其職
    2. reduce階段,task併發例項依然各司其職,但依賴第一階段的task併發例項
  • mapreduce只能分為1個map階段和1個reduce階段
  • 可以通過多個mapreduce串聯解決大型複雜問題
  • mr application master的作用

實踐

  • wordcount案例
    1. mapper類
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
    //map方法的生命週期:  框架每傳一行資料就被呼叫一次
    //key :  這一行的起始點在檔案中的偏移量
    //value: 這一行的內容
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //拿到一行資料轉換為string
        String line = value.toString();
        //將這一行切分出各個單詞
        String[] words = line.split(" ");
        //遍歷陣列,輸出<單詞,1>
        for(String word:words){
            context.write(new Text(word), new IntWritable(1));
        }
    }
}
2. reducer類
//生命週期:框架每傳遞進來一個kv 組,reduce方法被呼叫一次
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //定義一個計數器
        int count = 0;
        //遍歷這一組kv的所有v,累加到count中
        for(IntWritable value:values){
            count += value.get();
        }
        context.write(key, new IntWritable(count));
    }
}
3.  定義一個主類,用來描述job並提交job
    //把業務邏輯相關的資訊(哪個是mapper,哪個是reducer,要處理的資料在哪裡,輸出的結果放哪裡……)描述成一個job物件
    //把這個描述好的job提交給叢集去執行
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job wcjob = Job.getInstance(conf);
        //指定我這個job所在的jar包
//      wcjob.setJar("/home/hadoop/wordcount.jar");
        wcjob.setJarByClass(WordCountRunner.class);

        wcjob.setMapperClass(WordCountMapper.class);
        wcjob.setReducerClass(WordCountReducer.class);
        //設定我們的業務邏輯Mapper類的輸出key和value的資料型別
        wcjob.setMapOutputKeyClass(Text.class);
        wcjob.setMapOutputValueClass(IntWritable.class);
        //設定我們的業務邏輯Reducer類的輸出key和value的資料型別
        wcjob.setOutputKeyClass(Text.class);
        wcjob.setOutputValueClass(IntWritable.class);

        //指定要處理的資料所在的位置
        FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");
        //指定處理完成之後的結果所儲存的位置
        FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));

        //向yarn叢集提交這個job
        boolean res = wcjob.waitForCompletion(true);
        System.exit(res?0:1);
    }
  • 用debug追蹤FileInputFormat()的執行

相關文章