`

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包

    这个压缩包文件包含了运行和开发Hadoop应用程序所需的所有jar包。这些jar包是Hadoop生态系统的关键组成部分,它们提供了核心Hadoop的功能,包括分布式文件系统(HDFS)和MapReduce计算模型。 1. **Hadoop核心**:...

    运行hadoop jar

    在Hadoop生态系统中,`hadoop jar` 是一个命令行工具,它允许用户通过指定的JAR(Java档案)文件来运行包含在其中的主类。 描述中提到的链接可能是一个博客文章,虽然内容未给出,但我们可以推测它可能包含了如何...

    hadoop-jar.zip

    配置管理则负责处理Hadoop配置文件的读取和解析,为Hadoop组件提供运行时参数。 **Hadoop MapReduce** `hadoop-mapreduce-client-core-2.7.7.jar`是Hadoop MapReduce客户端的核心库,它主要实现了MapReduce编程模型...

    hadoop的各种jar包

    本文将详细介绍如何在Eclipse中使用Hadoop的各种JAR包,包括HDFS、MapReduce、YARN、HTTPFS和KMS,以实现高效的数据操作。 首先,我们需要理解这些组件在Hadoop生态系统中的角色: 1. HDFS(Hadoop Distributed ...

    hadoop的外部依赖jar包

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

    hadoop jar包.rar

    Hadoop是一款开源的大数据处理框架,由Apache基金会开发,它主要设计用于分布式...用户在使用时,通常需要通过`hadoop jar [jar_file] [main_class] [args...]`命令来执行包含在jar包中的主类,从而启动Hadoop作业。

    hadoop2.7.6jar包整理

    在Windows环境下,可以使用Eclipse的本地模式测试代码,或通过配置提交到Hadoop集群运行。 6. **推荐系统**: 推荐系统通常基于用户行为数据、兴趣偏好等信息进行预测。在Hadoop中,可以通过MapReduce处理大规模...

    hadoop 所用的jar包

    - **类路径设置**:在运行Java程序时,通过`-cp`或`-classpath`参数指定JAR包的位置。 总的来说,"hadoop 所用的jar包"是开发和运行Hadoop应用必不可少的组成部分,它们提供了Hadoop框架的核心功能和API,使得...

    hadoop集群jar包大全

    这个“hadoop集群jar包大全”集合了在Hadoop环境中开发、运行项目所必需的各种库文件,这些库涵盖了Hadoop的核心组件,以及与之紧密相关的其他大数据技术如Hive、HBase、SFTP和JUnit。以下是对这些关键组件的详细...

    hadoop2 MR运行修改jar

    6. **JAR打包**:在Windows上运行Hadoop MapReduce程序,可能需要将所有依赖的JAR文件(包括上述两个JAR文件)一起打包成一个可执行的JAR,以便在集群上正确运行。 总之,Windows环境下使用Java调用Hadoop 2.x ...

    hadoop 2.7.5 eclipse jar

    2. **运行配置**:能够创建和配置MapReduce作业,包括指定输入输出路径、设置主类、配置集群参数等。 3. **调试支持**:在Eclipse内部可以直接调试MapReduce程序,设置断点,查看变量状态,以及控制执行流程。 4. **...

    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-2.7.2-hbase-jar.tar.gz

    集成Hadoop和HBase时,通常会将HBase的JAR包添加到Hadoop的类路径中,确保Hadoop集群能够识别并处理HBase的相关操作。这个过程可能涉及到配置Hadoop的环境变量,如HADOOP_CLASSPATH,以及修改HBase的配置文件,如...

    spark-assembly-1.5.2-hadoop2.6.0jar包

    使用Spark-assembly-1.5.2-hadoop2.6.0.jar时,开发者需要将其添加到项目的类路径中,以确保所有Spark相关的依赖都被正确引入。在Scala项目中,这通常通过构建工具如sbt或Maven来完成。例如,在sbt的build.sbt文件中...

    基于Hadoop的分布式系统依赖的所有JAR包

    6. **启动与运行**:在部署Hadoop时,用户需要确保所有必要的JAR包都在类路径中,这通常通过修改`hadoop-env.sh`或`hadoop-classpath.sh`脚本来完成。然后,可以通过`start-dfs.sh`和`start-yarn.sh`命令启动HDFS和...

    用eclipse将Hadoop程序打包成jar及直接设定参数运行

    Eclipse 中将 Hadoop 程序打包成 JAR 文件并直接设定参数运行 本文将详细介绍如何使用 Eclipse 将 Hadoop 程序打包成 JAR 文件,并直接设定参数运行。通过本文,您将了解到 Eclipse 中的项目导出、JAR 文件生成、...

    win10下编译过的hadoop2.7.2 jar包

    这个压缩包文件“win10下编译过的hadoop2.7.2 jar包”是专门为在Windows 10操作系统上运行Hadoop 2.7.2版本而准备的。这个版本的Hadoop包含了所有必要的库文件和依赖,使得开发者能够在本地环境中配置和运行Hadoop...

    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 ...

    hadoop+hbase jar包

    5. 集成与开发:开发人员在使用Hadoop和HBase时,需要在代码中引入对应的jar包,并配置相关环境变量。例如,通过`addDependency`或者`classpath`指定jar路径,然后使用Hadoop的API读写HDFS,使用HBase的API操作...

Global site tag (gtag.js) - Google Analytics