Java大數據開發(三)Hadoop(15)-MapReduce2

導讀:上一節咱們認識了MapReduce,知道了它的概念和結構,下面跟着我繼續探尋它的奧祕吧。


Java類型和hadoop序列化類型對比 
java


Java類型spring

Hadoop Writable類型apache

boolean編程

BooleanWritableswift

byte微信

ByteWritableapp

intide

IntWritableoop

float大數據

FloatWritable

long

LongWritable

double

DoubleWritable

String

Text

map

MapWritable

array

ArrayWritable

重點注意:Java裏的String,在hadoop裏是Text類型。


MapReduce編程規範


用戶編寫的程序分紅三個部分:Mapper,Reducer,Driver(提交運行mr程序的客戶端)


一、Mapper階段


(1)用戶自定義的Mapper要繼承本身的父類


(2)Mapper的輸入數據是KV對的形式(KV的類型可自定義)


(3)Mapper中的業務邏輯寫在map()方法中


(4)Mapper的輸出數據是KV對的形式(KV的類型可自定義)


(5)map()方法(maptask進程)對每個<K,V>調用一次


二、Reducer階段


(1)用戶自定義的Reducer要繼承本身的父類


(2)Reducer的輸入數據類型對應Mapper的輸出數據類型,也是KV


(3)Reducer的業務邏輯寫在reduce()方法中


(4)Reducetask進程對每一組相同k的<k,v>組調用一次reduce()方法


三、Driver階段


整個程序須要一個Drvier來進行提交,提交的是一個描述了各類必要信息的job對象


 WordCount案例實操


1.需求


在給定的文本文件中統計輸出每個單詞出現的總次數


2.需求分析


按照MapReduce編程規範,分別編寫Mapper,Reducer,Driver


3編碼


(1)建立項目,添加如下依賴,如已添加,忽略此步。


<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.2</version> </dependency></dependencies>


(2)添加log4j配置文件


log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%nlog4j.appender.logfile=org.apache.log4j.FileAppenderlog4j.appender.logfile.File=target/spring.loglog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n


(3)編寫mapper類


public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
Text k = new Text(); IntWritable v = new IntWritable(1);
@Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 1 獲取一行 String line = value.toString(); // 2 切割 String[] words = line.split(" "); // 3 輸出 for (String word : words) { k.set(word); context.write(k, v); } }}


(4)編寫reducer類


public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
int sum; IntWritable v = new IntWritable();
@Override protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
// 1 累加求和 sum = 0; for (IntWritable count : values) { sum += count.get(); } // 2 輸出 v.set(sum); context.write(key,v); }}


(5)編寫Driver驅動類


public class WordcountDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 1 獲取配置信息以及封裝任務 Configuration configuration = new Configuration(); Job job = Job.getInstance(configuration);
// 2 設置jar加載路徑 job.setJarByClass(WordcountDriver.class);
// 3 設置map和reduce類 job.setMapperClass(WordcountMapper.class); job.setReducerClass(WordcountReducer.class);
// 4 設置map輸出 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class);
// 5 設置最終輸出kv類型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);
// 6 設置輸入和輸出路徑 FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1]));
// 7 提交 boolean result = job.waitForCompletion(true);
System.exit(result ? 0 : 1); }}


(6)在d盤下建立input目錄,該目錄下再建立inputword目錄,建立txt文檔,裏邊編寫單詞



(7)在idea裏運行,指定運行的輸入目錄和輸出目錄



(8)運行程序,查看輸出目錄



 2cs 1heima 3itcast 1ss 1


關注「跟我一塊兒學大數據」

跟我一塊兒學大數據

本文分享自微信公衆號 - 跟我一塊兒學大數據(java_big_data)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索