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);
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();
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。