编号 | 项目 | 软件及版本 |
---|---|---|
1 | 操作系统 | Windows 7-64bit |
2 | Hadoop | hadoop-3.1.1.tar.gz |
3 | JDK | 10.0.1 |
4 | Eclipse | 2018-09(4.9.0),Build id:20180917-1800 |
5 | Hadoop4Win | hadoop3.00-bin.rar |
6 | Eclipse插件 | hadoop-eclipse-plugin-2.6.5.jar |
HDFS编程需要使用hadoop库,所以需要安装hadoop。在Windows上安装Hadoop 3只需要解压缩hadoop-3.1.1.tar.gz(与Linux服务器上的hadoop版本一致)就可以了。例如解压缩至C:\根目录下。
然后,从服务器上下载hadoop3.00-bin.rar,解压缩覆盖掉hadoop-3.1.1\bin文件夹。并且将bin目录中hadoop.dll(hadoop.dll尽量使用最新版本)复制到C:\Windows\System32中。
接着,设置环境变量:
在Hadoop Master服务器上,确保已经创建了用户及其主目录(具体见《Hadoop 3.1安装与初步使用》中的“八.Hadoop平台测试”)。然后,修改hdfs-site.xml,在文档中添加。
dfs.permissions
false
启动HDFS分布式系统(详见《Hadoop 3.1安装与初步使用》),也可以使用$ start-all.sh
命令。此时,看到Eclipse项目浏览器中有Hadoop用户的主目录,如下图所示。
从服务器上下载hadoop-eclipse-plugin-2.6.5.jar,放到Eclipse安装目录下的plugins目录(如:C:\eclipse\plugins中),重新启动Eclipse。
打开Eclipse后,在菜单“Window” >> “Preferences”中“Hadoop Map/Reduce”下设置Hadoop的路径,如下图。
然后,通过如下两种方法之一打开Hadoop监视窗口(Perspecitve),在其中选择“Map/Reduce Locations”。
创建Map/Reduce project工程。通过“File” >> “new” >> “Project” >> “Map/Reduce project”;输入项目名称“WordCount”;在“Java Settings”的 “Libraries”选项卡中选择“Classpath”;点击右边的“Add External JARs…”按钮,将下列JAR包添加到项目中:
创建名称为“WordCount”的类(class)。右击WordCount工程目录下的“src”,选择“New” >> “src”,在“Java Class”窗口中输入名称(Name):WordCount。
在WordCount类中编写程序。
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.hadoop.*;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public WordCount() {
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
if(otherArgs.length < 2) {
System.err.println("Usage: wordcount [...] " );
System.exit(2);
}
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCount.TokenizerMapper.class);
job.setCombinerClass(WordCount.IntSumReducer.class);
job.setReducerClass(WordCount.IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
for(int i = 0; i < otherArgs.length - 1; ++i) {
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
}
FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
System.exit(job.waitForCompletion(true)?0:1);
}
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private static final IntWritable one = new IntWritable(1);
private Text word = new Text();
public TokenizerMapper() {
}
public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while(itr.hasMoreTokens()) {
this.word.set(itr.nextToken());
context.write(this.word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public IntSumReducer() {
}
public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int sum = 0;
IntWritable val;
for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
val = (IntWritable)i$.next();
}
this.result.set(sum);
context.write(key, this.result);
}
}
}
编程一个程序用来测试HDFS中Hadoop用户主目录下是否存在一个名为“test”的文件。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSFileIfExist {
public static void main(String[] args) {
try {
String fileName="tmp";
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://210.35.104.55:9000");
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs=FileSystem.get(conf);
if(fs.exists(new Path(fileName))) {
System.out.println("File exists");
}else {
System.out.println("File doesnot exist");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
将Java应用程序生成JAR包,部署到Hadoop上运行。
参考文献
[1]. 大数据笔记
[2]. 熟悉HDFS操作
[3]. Hadoop3 在eclipse中访问hadoop并运行WordCount实例
[4]. Windows10下Eclipse搭建Hadoop3开发环境