hadoop以jar形式运行代码 并运行时动态指定参数

本文介绍如何在Hadoop环境下实现WordCount任务,并允许用户在执行时动态指定输入输出文件路径,而非在代码中固定。文章提供了一个具体的Java实现案例,包括工程打包成jar、上传至Hadoop环境及执行命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言: 在执行 wordcount代码中,文件参数在代码中写死,如果希望动态指定 文件参数的话,可以将工程打成jar方式,在hadoop环境下执行,步骤如下:

 

1 wordcount类适量修改成如下:

[java]  view plain  copy
  1. package mapreduce;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URI;  
  5. import java.net.URISyntaxException;  
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.conf.Configured;  
  9. import org.apache.hadoop.fs.FileSystem;  
  10. import org.apache.hadoop.fs.Path;  
  11. import org.apache.hadoop.io.LongWritable;  
  12. import org.apache.hadoop.io.Text;  
  13. import org.apache.hadoop.mapreduce.Job;  
  14. import org.apache.hadoop.mapreduce.Mapper;  
  15. import org.apache.hadoop.mapreduce.Reducer;  
  16. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  17. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;  
  18. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  19. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;  
  20. import org.apache.hadoop.util.Tool;  
  21. import org.apache.hadoop.util.ToolRunner;  
  22.   
  23. /** 
  24.  * 打包到处方式,参数在执行时手动输入 而非在代码中固定写死 
  25.  * 实现单词计数功能 
  26.  * 测试文件 hello内容为: 
  27.     hello   you 
  28.     hello   me  me  me 
  29.  * @author zm 
  30.  * 
  31.  */  
  32. public class MyWordCountConfig extends Configured implements Tool{  
  33.   
  34.     static String FILE_ROOT = "";  
  35.     static String FILE_INPUT = "";  
  36.     static String FILE_OUTPUT = "";  
  37.     public static void main(String[] args) throws Exception {  
  38.           
  39.         ToolRunner.run(new MyWordCountConfig(), args);  
  40.     }  
  41.     @Override  
  42.     public int run(String[] args) throws Exception {  
  43.           
  44.         FILE_ROOT = args[0];  
  45.         FILE_INPUT = args[1];  
  46.         FILE_OUTPUT = args[2];  
  47.           
  48.         Configuration conf = new Configuration();  
  49.         FileSystem fileSystem = FileSystem.get(new URI(FILE_ROOT),conf);  
  50.         Path outpath = new Path(FILE_OUTPUT);  
  51.         if(fileSystem.exists(outpath)){  
  52.             fileSystem.delete(outpath, true);  
  53.         }  
  54.           
  55.         // 0 定义干活的人  
  56.         Job job = new Job(conf);  
  57.         //打包运行必须执行的方法  
  58.         job.setJarByClass(MyWordCountConfig.class);  
  59.         // 1.1 告诉干活的人 输入流位置     读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数  
  60.         FileInputFormat.setInputPaths(job, FILE_INPUT);  
  61.         // 指定如何对输入文件进行格式化,把输入文件每一行解析成键值对  
  62.         job.setInputFormatClass(TextInputFormat.class);  
  63.           
  64.         //1.2 指定自定义的map类  
  65.         job.setMapperClass(MyMapper2.class);  
  66.         job.setMapOutputKeyClass(Text.class);  
  67.         job.setMapOutputValueClass(LongWritable.class);  
  68.           
  69.         //1.3 分区  
  70.         job.setNumReduceTasks(1);  
  71.           
  72.         //1.4 TODO 排序、分组    目前按照默认方式执行  
  73.         //1.5 TODO 规约  
  74.           
  75.         //2.2 指定自定义reduce类  
  76.         job.setReducerClass(MyReducer2.class);  
  77.         job.setOutputKeyClass(Text.class);  
  78.         job.setOutputValueClass(LongWritable.class);  
  79.           
  80.         //2.3 指定写出到哪里  
  81.         FileOutputFormat.setOutputPath(job, outpath);  
  82.         job.setOutputFormatClass(TextOutputFormat.class);  
  83.           
  84.         // 让干活的人干活  
  85.         job.waitForCompletion(true);  
  86.         return 0;  
  87.     }  
  88.       
  89. }  
  90.   
  91. /** 
  92.  * 继承mapper 覆盖map方法,hadoop有自己的参数类型 
  93.  * 读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数, 
  94.  * 这样,对于文件hello而言,调用MyMapper方法map后得到结果: 
  95.  * <hello,1>,<you,1>,<hello,1>,<me,1> 
  96.  * 方法后,得到结果为:  
  97.  * KEYIN,      行偏移量 
  98.  * VALUEIN,    行文本内容(当前行) 
  99.  * KEYOUT,     行中出现的单词 
  100.  * VALUEOUT    行中出现单词次数,这里固定写为1 
  101.  * 
  102.  */  
  103. class MyMapper2 extends Mapper<LongWritable, Text, Text, LongWritable>{  
  104.   
  105.     @Override  
  106.     protected void map(LongWritable k1, Text v1, Context context)  
  107.             throws IOException, InterruptedException {  
  108.           
  109.         String[] v1s = v1.toString().split(" ");  
  110.         for(String word : v1s){  
  111.             context.write(new Text(word), new LongWritable(1));  
  112.         }  
  113.     }  
  114. }  
  115.   
  116. /** 
  117.  * <hello,{1,1}>,<me,{1}>,<you,{1}>, 每个分组调用一次 reduce方法 
  118.  *  
  119.  * KEYIN,     行中出现单词 
  120.  * VALUEIN,   行中出现单词个数 
  121.  * KEYOUT,    文件中出现不同单词 
  122.  * VALUEOUT   文件中出现不同单词总个数 
  123.  */  
  124. class MyReducer2 extends Reducer<Text, LongWritable, Text, LongWritable>{  
  125.   
  126.     protected void reduce(Text k2, Iterable<LongWritable> v2s,Context ctx)  
  127.             throws IOException, InterruptedException {  
  128.         long times = 0L;  
  129.         for(LongWritable l : v2s){  
  130.             times += l.get();  
  131.         }  
  132.         ctx.write(k2, new LongWritable(times));  
  133.     }  
  134.       
  135. }  


2 将工程打成jar包,这里是通过eclipse的export方式打成Jar包,注意细节如下:

 



3 将打好的包上传到hadoop环境中,执行命令如下:

[java]  view plain  copy
  1. [root@master ~]# hadoop jar wordcountconfig.jar  hdfs://master:9000/ hdfs://master:9000/hello hdfs://master:9000/out  
4 结果如下:

[java]  view plain  copy
  1. [root@master ~]# hadoop fs -text /out/part-r-00000  
  2. Warning: $HADOOP_HOME is deprecated.  
  3.   
  4. hello   2  
  5. me      3  
  6. you     1  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值