详细信息请参考:大数据集群之Hadoop集群(HA)
数据结构
山西省,3,朔州市,朔城区,2013,LZW6450PF,上汽通用五菱汽车股份有限公司,五菱,小型普通客车,个人,非营运,1,L3C,8424,79,汽油,4490,1615,1900,2,3050,1386,175/70R14LT,4,2110,1275,7,上汽通用五菱汽车股份有限公司,客车,1913,男性 …
这是一行数据,每个字段之间用’,'分割。
任务:统计乘用车和商用车的比例
完整数据已经上传到Github:点击跳转
使用 xftp 或其他工具将本机数据上传至Linux系统上。
将数据上传至hdfs上:
hdfs dfs -mkdir -p /carSaiesAnalysis/input # 在hdfs上创建一个输入目录,输入数据放在这里 hdfs dfs -mkdir -p /carSaiesAnalysis/output # 在hdfs上创建输入目录,运算结果存放在此目录 hdfs dfs -put cars.txt /carSaiesAnalysis/input # 将文件上传至hdfs 文件系统中在map结束阶段将键相同的值进行合并
package com.yc.hadoop.project.carSaiesAnalysis.test1; import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; // 在map结束阶段将键相同的值进行合并 public class CountCarCombiner extends Reducer<Text, LongWritable, Text, LongWritable> { private LongWritable result = new LongWritable(); public void reduc(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException{ Long sum = new Long(0); for (LongWritable val : values){ sum += val.get(); } result.set(sum); context.write(key , result); } }将各个map的数据进行整合
package com.yc.hadoop.project.carSaiesAnalysis.test1; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class CountCarReducer extends Reducer<Text, LongWritable, Text, Text> { Map<String, Long> map = new HashMap<>(); double all = 0; // 将各个map中的数据拉取并进行运算 protected void reduce(Text key,Iterable<LongWritable> values, Context context){ long sum = 0; for (LongWritable val : values) { sum += val.get(); } all += sum; map.put(key.toString(), sum); } // Reducer生命周期函数 在reduce函数执行完之后调用 // 计算各个类型所占的比例,并将结果写出。 @Override protected void cleanup(Reducer<Text, LongWritable, Text, Text>.Context context) throws IOException, InterruptedException { Set <String> keySet = map.keySet(); for(String key:keySet){ long value = map.get(key); double percent = value/all; context.write(new Text(key), new Text(value+"\t"+percent)); } } }将程序打包成jar包,并上传至Linux系统中。
执行:
hadoop jar car.jar com.yc.hadoop.project.carSaiesAnalysis.test1.App /carSaiesAnalysis/input/cars.txt /carSaiesAnalysis/output/ hadoop jar 为Hadoop执行jar程序的指令car.jar 是我将上述程序打包后的jar包。com.yc.hadoop.project.carSaiesAnalysis.test1.App 为main函数所在的类名,类名为全称,即包含包名/carSaiesAnalysis/input/cars.txt 为待读取数据的路径(hdfs系统中的路径)/carSaiesAnalysis/output/ 结果输出的路径(hdfs系统中的路径)成功执行后会打印出任务清单 查看计算结果
hdfs dfs -cat /carSaiesAnalysis/output/part-r-00000可以在Hadoop web 端查看结果
其他几个类似的案例也已上传 Github