Hadoop之——命令行运行时指定参数

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46056029

本文旨在提供一个Hadoop在运行的时候从命令行输入要统计的文件路径和统计结果的输出路径,不多说直接上代码

1、Mapper类的实现

        /**
	 * KEYIN	即k1		表示行的偏移量
	 * VALUEIN	即v1		表示行文本内容
	 * KEYOUT	即k2		表示行中出现的单词
	 * VALUEOUT	即v2		表示行中出现的单词的次数,固定值1
	 */
	static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
		protected void map(LongWritable k1, Text v1, Context context) throws java.io.IOException ,InterruptedException {
			final String[] splited = v1.toString().split("\t");
			for (String word : splited) {
				context.write(new Text(word), new LongWritable(1));
			}
		};
	}

2、Reducer类的实现

	/**
	 * KEYIN	即k2		表示行中出现的单词
	 * VALUEIN	即v2		表示行中出现的单词的次数
	 * KEYOUT	即k3		表示文本中出现的不同单词
	 * VALUEOUT	即v3		表示文本中出现的不同单词的总次数
	 *
	 */
	static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
		protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s, Context ctx) throws java.io.IOException ,InterruptedException {
			long times = 0L;
			for (LongWritable count : v2s) {
				times += count.get();
			}
			ctx.write(k2, new LongWritable(times));
		};
	}

3、run方法的实现

       @Override
	public int run(String[] args) throws Exception {
		//接收命令行参数
		INPUT_PATH = args[0];
		OUT_PATH = args[1];
		Configuration conf = new Configuration();
		final FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH), conf);
		final Path outPath = new Path(OUT_PATH);
		//如果已经存在输出文件,则先删除已存在的输出文件
		if(fileSystem.exists(outPath)){
			fileSystem.delete(outPath, true);
		}

		final Job job = new Job(conf , WordCount.class.getSimpleName());
		//*******打包运行必须执行的方法*******
		job.setJarByClass(WordCount.class);

		//1.1指定读取的文件位于哪里
		FileInputFormat.setInputPaths(job, INPUT_PATH);
		//指定如何对输入文件进行格式化,把输入文件每一行解析成键值对
		job.setInputFormatClass(TextInputFormat.class);

		//1.2 指定自定义的map类
		job.setMapperClass(MyMapper.class);
		//map输出的<k,v>类型。如果<k3,v3>的类型与<k2,v2>类型一致,下面两行代码可以省略
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);

		//1.3 分区
		job.setPartitionerClass(HashPartitioner.class);
		//有一个reduce任务运行
		job.setNumReduceTasks(1);

		//1.4 TODO 排序、分组

		//1.5 TODO 规约

		//2.2 指定自定义reduce类
		job.setReducerClass(MyReducer.class);
		//指定reduce的输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		//2.3 指定写出到哪里
		FileOutputFormat.setOutputPath(job, outPath);
		//指定输出文件的格式化类
		job.setOutputFormatClass(TextOutputFormat.class);

		//把job提交给JobTracker运行
		job.waitForCompletion(true);
		return 0;
	}

4、程序入口main

//程序入口Main方法
public static void main(String[] args) throws Exception {
      ToolRunner.run(new WordCount(), args);
}

5、完整程序代码

package com.lyz.hadoop.count;

import java.net.URI;

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.mapreduce.lib.partition.HashPartitioner;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
 * 利用Hadoop MapReduce统计文本中每个单词的数量
 * @author liuyazhuang
 */
public class WordCount extends Configured implements Tool{
	//要统计的文件位置
	static String INPUT_PATH = "";
	//统计结果输出的位置
	static String OUT_PATH = "";

	@Override
	public int run(String[] args) throws Exception {
		//接收命令行参数
		INPUT_PATH = args[0];
		OUT_PATH = args[1];
		Configuration conf = new Configuration();
		final FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH), conf);
		final Path outPath = new Path(OUT_PATH);
		//如果已经存在输出文件,则先删除已存在的输出文件
		if(fileSystem.exists(outPath)){
			fileSystem.delete(outPath, true);
		}

		final Job job = new Job(conf , WordCount.class.getSimpleName());
		//*******打包运行必须执行的方法*******
		job.setJarByClass(WordCount.class);

		//1.1指定读取的文件位于哪里
		FileInputFormat.setInputPaths(job, INPUT_PATH);
		//指定如何对输入文件进行格式化,把输入文件每一行解析成键值对
		job.setInputFormatClass(TextInputFormat.class);

		//1.2 指定自定义的map类
		job.setMapperClass(MyMapper.class);
		//map输出的<k,v>类型。如果<k3,v3>的类型与<k2,v2>类型一致,下面两行代码可以省略
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);

		//1.3 分区
		job.setPartitionerClass(HashPartitioner.class);
		//有一个reduce任务运行
		job.setNumReduceTasks(1);

		//1.4 TODO 排序、分组

		//1.5 TODO 规约

		//2.2 指定自定义reduce类
		job.setReducerClass(MyReducer.class);
		//指定reduce的输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);

		//2.3 指定写出到哪里
		FileOutputFormat.setOutputPath(job, outPath);
		//指定输出文件的格式化类
		job.setOutputFormatClass(TextOutputFormat.class);

		//把job提交给JobTracker运行
		job.waitForCompletion(true);
		return 0;
	}
	//程序入口Main方法
	public static void main(String[] args) throws Exception {
		ToolRunner.run(new WordCount(), args);
	}

	/**
	 * KEYIN	即k1		表示行的偏移量
	 * VALUEIN	即v1		表示行文本内容
	 * KEYOUT	即k2		表示行中出现的单词
	 * VALUEOUT	即v2		表示行中出现的单词的次数,固定值1
	 */
	static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
		protected void map(LongWritable k1, Text v1, Context context) throws java.io.IOException ,InterruptedException {
			final String[] splited = v1.toString().split("\t");
			for (String word : splited) {
				context.write(new Text(word), new LongWritable(1));
			}
		};
	}

	/**
	 * KEYIN	即k2		表示行中出现的单词
	 * VALUEIN	即v2		表示行中出现的单词的次数
	 * KEYOUT	即k3		表示文本中出现的不同单词
	 * VALUEOUT	即v3		表示文本中出现的不同单词的总次数
	 *
	 */
	static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
		protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s, Context ctx) throws java.io.IOException ,InterruptedException {
			long times = 0L;
			for (LongWritable count : v2s) {
				times += count.get();
			}
			ctx.write(k2, new LongWritable(times));
		};
	}

}
时间: 2024-10-31 02:42:33

Hadoop之——命令行运行时指定参数的相关文章

Hadoop Shell命令大全

hadoop支持命令行操作HDFS文件系统,并且支持shell-like命令与HDFS文件系统交互,对于大多数程序猿/媛来说,shell-like命令行操作都是比较熟悉的,其实这也是Hadoop的极大便利之一,至少对于想熟悉乃至尽快熟练操作HDFS的人来说. 由于平时在工作中经常用到Hadoop Shell命令来操作HDFS上的文件,有时候因为Hadoop Shell命令不熟悉,需要重新查找:或者需要某个命令的参数:再或者需要知晓相似命令的差异:于是便有了本文,对于Hadoop Shell命令的

Hadoop Shell命令官网翻译

http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/FileSystemShell.html#Overview FS Shell 调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式. 所有的的FS shell命令使用URI路径作为参数.URI格式是scheme://authority/path.对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是

useradd命令中的-d参数不好用

 OS: Red Hat Enterprise Linux Server release 7.0 (Maipo) 目前对linux系统了解不是很多.一些操作保留浓重的windows习惯. 现在/home被我当作了仓库使用,我给它分配了很大的空间,并且塞了很多文件和目录在里面.这样我觉得如果多个用户的主目录散落在/home目录中的话,会是一件很蛋疼的事情. 所以我决定把所有的用户目录放置到/home/myusers下. useradd命令中的-d参数可以后接目录,于是输入如下命令: [[email

hadoop CLASSNAME命令使用注意点

Hadoop中可是使用hadoop CLASSNAME命令.这个CLASSNAME就是你写好的类名.hadoop CLASSNAME命令类似于java classname. 使用hadoop CLASSNAM之前,你需要设置HADOOP_CLASSPATH. Java代码   export  HADOOP_CLASSPATH=/home/hadoop/jardir/*.jar:/home/hadoop/workspace/hdfstest/bin/ 其中/home/hadoop/jardir/包

linux命令(while,shell参数的用法)

#!/bin/bash while IFS=: read name1 name2 name3 name4 #IFS是从文件读取内容时指定的分割符号,将a中的内容以:分开的部分分别赋值给相应变量. do echo $name1 '|' $name2 '|' $name3 '|' $name4 done <a #反引号与$()的功能是命令替换,将反引号或$()中的字符串当作命令来执行,但是反引号中不能继续有反引号,而$()可以有. LS=`ls` echo $LS #单引号完全不解析命令,忽略所有特

iptables命令、规则、参数详解

表    (table)包含4个表:4个表的优先级由高到低:raw-->mangle-->nat-->filterraw---RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理.一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.filter---这个规则表是预设规则表,拥有 INPUT.FORWARD 和 OUTPUT 三个规则链,

Linux与hadoop相关命令

一:Linux基本命令: 1.查看ip地址: $ ifconfig 2.清空屏幕: $ clear 3.切换root用户: $ su 4.查看主机静态ip地址: $ more /etc/sysconfig/network-scripts/ifcfg-eth0 5.主机名称: 查看主机名称:  $ hostname      修改主机名: $ hostname 主机名 6.目录: 查看当前目录:$ pwd           进入当前目录下的子目录:$ cd (如$ cd data)       

Linux挂载命令mount用法及参数详解

Linux挂载命令mount用法及参数详解 导读 mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了. 挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o options] device dir 1.-t vfstype 指定文件系统的类型,通常不必指定,m

hadoop fsck命令详解

hadoop fsck命令详解 hadoop  fsck Usage: DFSck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]        <path>             检查这个目录中的文件是否完整 -move               破损的文件移至/lost+found目录        -delete             删除破损的文件 -o