hadoop操作

搭建过程

对于搭建过程的话,其实没什么说的,大都是按照老师给的方法一步步做的,其中主要需要注意的是关于hadoop版本,JDK版本的互相匹配,还有一些玄学操作先给自己留个坑,等我云计算上完之后再来填坑。

WordCount

(写在前面,如果之后WordCount写成WorldCount,碍于自己菜鸡的英语水平,请各位见谅)

所谓程序员不可能不知道HelloWorld,大数据云计算不可能不知道WordCount一样,对于hadoop来说,最简单最入门级别的就是运行WordCount了,接下来就为大家简述关于这部分的内容吧。

一些需要注意的事情:

  1. 导包一定不能倒错,否则会有各种各样的玄学报错的。
  2. 类型转换一定要符合逻辑,不符合逻辑的类型转换会让代码出现很多很奇怪的bug。
  3. Java的一贯脾气,不要中文
  4. 注意 Hadoop 中实现的用于封装 Java 数据类型的类,例如IntWritable

先从main函数说起吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.io.IOException;

//注意之后的包不要倒错
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
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.KeyValueTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException //这几个异常必须抛出,如果不抛出会报错
{
//1.设置conf对象,并配置hdfs路径
//2.设置job对象,在job对象中设置 Jar map reduce reduce的输出类型(key value) 输出格式化方式
//文件的输入和输出路径 系统退出
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:9000");

//在job中使用conf来赋予job相对应的属性
Job job = Job.getInstance(conf , "WordCount");
job.setJarByClass(WordCount.class);

job.setMapperClass(WordCountMapper.class); //此处设置的Mapper名与mapper的类名一致
job.setReducerClass(WordCountReducer.class); //此处设置的Reducer名与reducer的类名一致

job.setMapOutputKeyClass(LongWritable.class); //指定map函数输出类型key 第三个参数
job.setMapOutputValueClass(Text.class); //指定map函数输出类型value 第四个参数

//如果map方法的 34参数 == reduce 34参数 下面两行代码可省略
job.setOutputKeyClass(Text.class);//指定reduce的输出类型key 第三个参数
job.setOutputValueClass(NullWritable.class);//指定reduce的输出类型value 第四个参数

//以下为两种设置格式化方式
//TextInputFormat.class 表示传入map的key是从文件首位到此行第一位的offset,value是整个这一行的内容
//KeyValueTextInputFormat.class 表示传入map的key是此行的第一个单词,用默认空格分开
//根据自己的需求来使用对应的方法

//job.setInputFormatClass(TextInputFormat.class);
//第一个参数:每一行的偏移量 第二个参数:每一行的内容 <hello , {1,1,1}>
job.setInputFormatClass(KeyValueTextInputFormat.class); //设置格式化方式
//第一个参数:每行第一个单词 第二个参数:除了第一个单词的之后的内容


//下面两种方法都是获得
//FileInputFormat.addInputPath(job, new Path("/users/nh/input/game.log"));
//
//Path outPath = new Path("/users/nh/output/3.1/");
//FileSystem.get(conf).delete(outPath, true); //如果目录存在,则删除
//FileOutputFormat.setOutputPath(job, outPath);

FileInputFormat.addInputPath(job, new Path("/input/xxxx.log"));

Path outPath = new Path("/output/WC");
FileSystem.get(conf).delete(outPath , true); //如果目录存在,则删除
FileOutputFormat.setOutputPath(job, outPath);


System.exit(job.waitForCompletion(true)?0:1);//如果job可以正常结束则正常退出
}