大資料 (十)Hadoop-第一次使用eclipse&java&hadoop分析簡單資料
阿新 • • 發佈:2019-01-24
一、開啟eclipse
二、新建java專案mapreducer
三、專案下新建lib資料夾,匯入hadoop相關jar,jar在原始碼中有
四、專案下建包,寫如下三個類
1、WorldCountMapper.java
2、WorldCountReducer.javapackage com.zjt.mapreducer.data; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.util.StringUtils; /** * 執行統計單詞數量的map程式 * @author ZhangJintao * Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> * KEYIN ---- 輸入資料的鍵 * VALUEIN ---- 輸入資料的值 * KEYOUT ---- 輸出資料的鍵 * VALUEOUT ---- 輸出資料的值 */ public class WorldCounteMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ @Override /** * 父類的map方法,迴圈呼叫 * 從split碎片段中每行呼叫一次 * 把該行所在下標為key,該行的值為value * 【功能:將單詞以map輸出】 */ protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { String[] words = StringUtils.split(value.toString(), ' '); for (String w : words) { context.write(new Text(w), new IntWritable(1)); } } }
3、RunJob.javapackage com.zjt.mapreducer.data; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WorldCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override /** * 迴圈呼叫 * 洗牌完畢分好組後,每組呼叫一次 * 【功能:計算單詞出現次數】 */ protected void reduce(Text arg0, Iterable<IntWritable> arg1, Reducer<Text, IntWritable, Text, IntWritable>.Context arg2) throws IOException, InterruptedException { int sum = 0 ; for(IntWritable i : arg1){ sum += i.get(); } arg2.write(arg0, new IntWritable(sum)); } }
五、打jar包package com.zjt.mapreducer.data; import java.io.IOException; 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.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** * 執行方法 * @author ZhangJintao */ public class RunJob { public static void main(String[] args) { Configuration config = new Configuration(); try { FileSystem fs = FileSystem.get(config); Job job = Job.getInstance(); //執行mapreducer任務 job.setJarByClass(RunJob.class); job.setJobName("data"); job.setMapperClass(WorldCounteMapper.class); job.setReducerClass(WorldCountReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/usr/input/")); Path outpath = new Path("/usr/input/data"); if (fs.exists(outpath)) { fs.delete(outpath, true); } FileOutputFormat.setOutputPath(job, outpath); boolean f = job.waitForCompletion(true); if (f) { System.out.println("JOB 執行成功"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
六、上傳測試資料
其中data.txt內容如下
hadoop hello world
hello hadoop
hbase zookeeper
六、執行程式
將我們打的jar上傳至任何一臺節點主機,遠端登入節點主機,進入jar包所在目錄,執行如下命令
hadoop jar wc.jar com.zjt.mapreducer.data.RunJob
執行後,我們可以看到控制檯會提示資訊。
我們進入網頁http://192.168.1.201:8088/cluster/apps後點擊 Applications可以看到下圖所示
執行完畢之後,在此進入eclipse
重新整理後會發現多瞭如下幾個資料夾和檔案
通過結果檔案可知,她幫我們統計出了data.txt中hadoop單詞有兩個、hbase有一個、hello有兩個、world有一個、zookeeper有一個