认识wordcount(二)

认识wordcount(二)

0. 执行前准备

0.1 配置好的完全分布式环境(如果遇到权限问题,给777)

高可用环境会有两个master节点,会报错,暂时没去找解决方案!

但是可以在src下的配置文件配置,或者在程序中指定一个master,破坏高可用的两个master情况,但是不会变更整个集群环境,说起来就是暂时配置的一个环境。(修改【fs.defaultFS】【yarn.resourcemanager.hostname】这两个配置。)

如果直接用完全分布式就简单了,直接做就行。

0.2 拷贝Hadoop二进制包中的可执行Jar包

将Hadoop二进制包中的可执行Jar包拷贝到工程下新建的lib文件夹,将他们都右键【build path】->【Add to build path】

0.3 配置文件

0.3.1 core-site.xml
<property>
		<name>fs.defaultFS</name>
		<value>hdfs://192.168.204.110:9000</value>
</property>
#修改namenode的默认存储位置
<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/hadoop/tmp/hadoop-${user.name}</value>
		<description>A base for other temporary directories.</description>
</property>
0.3.2 hdfs-site.xml
<property>
		<name>dfs.replication</name>
		<value>3</value>
</property>

<property>
		<name>dfs.namenode.name.dir</name>
		<value>file://${hadoop.tmp.dir}/dfs/name, /home/hadoop/backup/dfs/name</value>
</property>

<property>
		<name>dfs.datanode.data.dir</name>
		<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
0.3.3 yarn-site.xml
<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
</property>

<property>
		<description>The hostname of the RM.</description>
		<name>yarn.resourcemanager.hostname</name>
		<value>192.168.204.110</value>
</property>
0.3.4 mapred-site.xml
<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
</property>

<property>
		<name>mapreduce.app-submission.cross-platform</name>
		<value>true</value>
</property>

0.4 设置日志配置文件

将Hadoop二进制包中的hadoop-2.7.3\etc\hadoop\log4j.properties文件拷贝到src下,才可以看到执行过程的日志信息

1. 集群提交

1.1 测试数据

1.1.1 word1.txt

hadoop
hive spark
zookeeper pig flink
hadoop hbase
spark
hdfs
namenode
hadoop sqoop hive hbase

1.1.2 word2.txt

datanode namenode pig hive
spark hbase hadoop
sqoop
zookeeper
mahout
flume
yarn mapreduce
impala storm kafka

1.1.3 word3.txt

hadoop spark
hive
kafka
flume pig flink
zookeeper

1.2 WordCount程序

1.2.1 Mapper
package wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{
	private Text word = new Text();
	private IntWritable one = new IntWritable(1);
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		String line = value.toString();
		String[] words = line.split(" ");
		for(String str : words) {
			word.set(str);
			context.write(word, one);
		}
	}
}

默认的文件读取格式是TextInputFormat(由job.setInputFormat(输入类.class)设定),key为每行的首字符在文件中的字节数,value是一行的文本。

  1. 将一行文本从TextWritable转为String
  2. 因为文本中间是空格分隔,所以用空格分解文本
  3. 遍历获得的String数组,将文本和1组合成<文本,1>的二元组
  4. 形成中间数据传递给Reducer
1.2.2 Reducer
package wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountRecuce extends Reducer<Text, IntWritable, Text, IntWritable>{
	private IntWritable _sum = new IntWritable();
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		int sum = 0;
		for (IntWritable value : values) {
			sum += value.get();
			_sum.set(sum);
		}
		context.write(key, _sum);
	}
}

Mapper阶段结束后,传给Reducer的是一个key和value集合的二元组<key,Iterable>

  1. 遍历Mapper传过来的IntWritable集合,将相同key值的value统计成总数
  2. 输出key和总数的二元组<key,_sum>
1.2.3 Driver
package wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountDriver {
	public static void main(String[] args) throws ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration();
		try {
			Job job = Job.getInstance(conf);
			job.setMapperClass(WordCountMap.class);
			job.setReducerClass(WordCountRecuce.class);
			job.setJobName("wordcount");
			job.setJarByClass(WordCountDriver.class);
			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);
			FileInputFormat.setInputPaths(job, new Path(args[0]));
			FileOutputFormat.setOutputPath(job, new Path(args[1]));
			System.exit(job.waitForCompletion(true)?0:1);
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}
  1. 首先,获取一个Configuration对象
  2. 用Configuration对象获得Job实例
  3. 设置Job的MapperClass
  4. 设置Job的ReducerClass
  5. 设置Job的Name
  6. 设置打包的主类JarByClass
  7. 设置Mapper输出的key类型MapOutputKeyClass
  8. 设置Mapper输出的value类型MapOutputValueClass
  9. 设置Reducer输出的key类型OutputKeyClass
  10. 设置Reducer输出的value类型OutputValueClass
  11. 设置文件输入的路径setInputPaths
  12. 设置文件输出的路径setOutputPath
  13. 设置等待Job完成的方法waitForCompletion(必须设置,否则任务根本没有执行)

1.3 打Jar包

只打对应项目的package,其他任何东西都不要,可以在打包时选定加载时的主类,这样在执行时就可以简单一些

1.4 集群运行

1.4.1 拷贝Jar包

将Jar包拷贝到linux任意目录下,在该目录下执行:

【这是针对没有设置HADOOP_CLASSPATH的情况,设置CLASSPATH就可以将所有要执行的Jar包放进去,任意路径下都可以执行】

1.4.2 执行

$>hadoop jar wordcount.jar /wordcount /out

  1. /wordcount:是文件读取的路径

  2. /out:是文件输出的路径

  3. 如果在打包的时候没有设置主函数的主类,就会报类找不到异常,需要在执行语句后加权限定类名

    $>hadoop jar wordcount.jar wordcount.WordCountDriver /wordcount /out

1.5 结果

datanode 1
flink 2
flume 2
hadoop 5
hbase 3
hdfs 1
hive 4
impala 1
kafka 2
mahout 1
mapreduce 1
namenode 2
pig 3
spark 4
sqoop 2
storm 1
yarn 1
zookeeper 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值