`

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

 
阅读更多

 

 

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

 

1 wordcount类适量修改成如下:

package mapreduce;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * 打包到处方式,参数在执行时手动输入 而非在代码中固定写死
 * 实现单词计数功能
 * 测试文件 hello内容为:
	hello	you
	hello	me	me	me
 * @author zm
 *
 */
public class MyWordCountConfig extends Configured implements Tool{

	static String FILE_ROOT = "";
	static String FILE_INPUT = "";
	static String FILE_OUTPUT = "";
	public static void main(String[] args) throws Exception {
		
		ToolRunner.run(new MyWordCountConfig(), args);
	}
	@Override
	public int run(String[] args) throws Exception {
		
		FILE_ROOT = args[0];
		FILE_INPUT = args[1];
		FILE_OUTPUT = args[2];
		
		Configuration conf = new Configuration();
		FileSystem fileSystem = FileSystem.get(new URI(FILE_ROOT),conf);
		Path outpath = new Path(FILE_OUTPUT);
		if(fileSystem.exists(outpath)){
			fileSystem.delete(outpath, true);
		}
		
		// 0 定义干活的人
		Job job = new Job(conf);
		//打包运行必须执行的方法
		job.setJarByClass(MyWordCountConfig.class);
		// 1.1 告诉干活的人 输入流位置     读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数
		FileInputFormat.setInputPaths(job, FILE_INPUT);
		// 指定如何对输入文件进行格式化,把输入文件每一行解析成键值对
		job.setInputFormatClass(TextInputFormat.class);
		
		//1.2 指定自定义的map类
		job.setMapperClass(MyMapper2.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);
		
		//1.3 分区
		job.setNumReduceTasks(1);
		
		//1.4 TODO 排序、分组    目前按照默认方式执行
		//1.5 TODO 规约
		
		//2.2 指定自定义reduce类
		job.setReducerClass(MyReducer2.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		
		//2.3 指定写出到哪里
		FileOutputFormat.setOutputPath(job, outpath);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		// 让干活的人干活
		job.waitForCompletion(true);
		return 0;
	}
	
}

/**
 * 继承mapper 覆盖map方法,hadoop有自己的参数类型
 * 读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数,
 * 这样,对于文件hello而言,调用MyMapper方法map后得到结果:
 * <hello,1>,<you,1>,<hello,1>,<me,1>
 * 方法后,得到结果为: 
 * KEYIN,      行偏移量
 * VALUEIN,    行文本内容(当前行)
 * KEYOUT,     行中出现的单词
 * VALUEOUT    行中出现单词次数,这里固定写为1
 *
 */
class MyMapper2 extends Mapper<LongWritable, Text, Text, LongWritable>{

	@Override
	protected void map(LongWritable k1, Text v1, Context context)
			throws IOException, InterruptedException {
		
		String[] v1s = v1.toString().split(" ");
		for(String word : v1s){
			context.write(new Text(word), new LongWritable(1));
		}
	}
}

/**
 * <hello,{1,1}>,<me,{1}>,<you,{1}>, 每个分组调用一次 reduce方法
 * 
 * KEYIN,     行中出现单词
 * VALUEIN,   行中出现单词个数
 * KEYOUT,    文件中出现不同单词
 * VALUEOUT   文件中出现不同单词总个数
 */
class MyReducer2 extends Reducer<Text, LongWritable, Text, LongWritable>{

	protected void reduce(Text k2, Iterable<LongWritable> v2s,Context ctx)
			throws IOException, InterruptedException {
		long times = 0L;
		for(LongWritable l : v2s){
			times += l.get();
		}
		ctx.write(k2, new LongWritable(times));
	}
	
}

 

 

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

 


 

 

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

[root@master ~]# hadoop jar wordcountconfig.jar  hdfs://master:9000/ hdfs://master:9000/hello hdfs://master:9000/out

 

4 结果如下:

 

[root@master ~]# hadoop fs -text /out/part-r-00000
Warning: $HADOOP_HOME is deprecated.

hello   2
me      3
you     1

 

 

5 打好的包见附件


 

  • 大小: 55.3 KB
分享到:
评论

相关推荐

    hadoop的外部依赖jar包

    有时候在eclipse上运行项目,需要引用的Hadoop的jar包,也就是hadoop的外部依赖包,有conf,fs,io,mapreduce等等,这里列举了一部分,基本上hadoop的所有外部依赖jar包都包含在内了,如果下载了不会使用,可以看我...

    hadoop jar包.rar

    完整的Hadoop jar包,解压直接用。

    hadoop-2.10.0jar.zip

    包含hadoop平台Java开发的所有所需jar包,例如activation-1.1.jar apacheds-i18n-2.0.0-M15.jar apacheds-kerberos-codec-2.0.0-M15.jar api-asn1-api-1.0.0-M20.jar api-util-1.0.0-M20.jar asm-3.2.jar avro-1.7.7...

    Hadoop的jar包

    涵盖所有Hadoop所需要的jar包,希望对大家有帮助!

    hadoop最新版本3.1.1全量jar包

    hadoop-annotations-3.1.1.jar hadoop-common-3.1.1.jar hadoop-mapreduce-client-core-3.1.1.jar hadoop-yarn-api-3.1.1.jar hadoop-auth-3.1.1.jar hadoop-hdfs-3.1.1.jar hadoop-mapreduce-client-hs-3.1.1.jar ...

    spark-assembly-1.5.2-hadoop2.6.0jar包

    使用scala开发spark应用时用到的jar包:spark-assembly-1.5.2-hadoop2.6.0jar包

    hadoop-jar.zip

    hadoop中常用的jar包,hadoop-common-0.23.8.jar和hadoop-mapreduce-client-core-2.7.7.jar

    flume-hadoop-jar.zip

    Flume要想将数据输出到HDFS,必须持有Hadoop相关jar包:commons-configuration-1.6.jar、 hadoop-auth-2.7.2.jar、 hadoop-common-2.7.2.jar、 hadoop-hdfs-2.7.2.jar、 commons-io-2.4.jar、 htrace-core-...

    hadoop2.7.6jar包整理

    用来做一个推荐系统。hadoop框架用的,搭建环境,再windows下,导入到eclipse中。

    win10下编译过的hadoop2.7.2 jar包

    win10下编译过的hadoop2.7.2 jar包,配置hadoop客户端环境必备

    hadoop2 MR运行修改jar

    windows使用java调用hadoop2需要修改的jar,具体可以参考博主博客

    hadoop-eclipse-plugin-2.10.0.jar

    Eclipse集成Hadoop2.10.0的插件,使用`ant`对hadoop的jar包进行打包并适应Eclipse加载,所以参数里有hadoop和eclipse的目录. 必须注意对于不同的hadoop版本,` HADDOP_INSTALL_PATH/share/hadoop/common/lib`下的jar包...

    hadoop集群jar包大全

    包含hadoop集群开发项目所需所有jar包,其中包含支持hive,hbase,sftp,junit等等以及一些小实例

    elasticsearch 与hadoop 相关的jar

    包含 elasticsearch-hadoop-6.6.1.jar elasticsearch-hadoop-hive-6.6.1.jar elasticsearch-spark-20_2.11-6.6.1.jar elasticsearch-storm-6.6.1.jar 等

    hadoop 2.7.5 eclipse jar

    hadoop 2.7.5 eclipse jar 包,只需要放到eclipse的plugin目录下重启即可

    hadoop的各种jar包

    使用ecplice操作hadoop所需要的各种jar包。包括hdfs,maprudce,yarn,httpfs,kms。

    hadoop-common-2.7.2.jar

    hadoop-common-2.7.2.jar

    Hadoop中单词统计案例运行的代码

    Hadoop中单词统计案例运行的代码

    hadoop_common.jar包

    hadoop操作的文档文献和hadoopjar包

Global site tag (gtag.js) - Google Analytics