使用windows下的Eclipse或者IDEA远程连接Linux的Hadoop并运行wordcount
Windows使用Eclipse或IDEA连接Linux环境Hadoop运行wordcount
1 环境准备
linux 系统版本centos7 ,Hadoop版本2.7.6
(1)正确安装hadoop,具体安装步骤参考安装教程,安装成功启动HDFS和Yarn,进入hadoop安装路径/sbin 下,运行start-all.sh
使用jps命令(可能需要在root下使用)查看启动的java进程 其中ResourceManger和Nodemanager(Yarn进程),DataNode,NameNode NodeManager secondarynameNode是必须的进程
(2)在命令行中测试当前Hadoop是否安装成功,使用如下命令
>>hdfs dfs -mkdir test --创建一个文件夹test
>>hdfs dfs -ls / --查看test文件夹是否成功
(3)在centos7 下运行hadoop的wordcout例子测试hadoop是否能够运行成功
进入 hadoop安装目录 /share/hadoop/mapreduce/下运行
运行成功代表hadoop环境安装没有问题
此过程常出现的问题是卡主不动,这是由于Yarn的内存配置错误造成的引用网上的解决方法,进入hadoop安装目录/etc/hadoop下打开yarn-site.xml 加入如下内容:
- <property>
- <name>yarn.nodemanager.resource.memory-mb</name>
- <value>6048</value>
- </property>
- <property>
- <name>yarn.scheduler.minimum-allocation-mb</name>
- <value>2048</value>
- </property>
- <property>
- <name>yarn.nodemanager.vmem-pmem-ratio</name>
- <value>2.1</value>
- </property>
其中yarn.nodemanager.resource.memory-mb Yarn可以使用的最大内存可以设置的尽量大一些(不要超过总内存),此值太小会造成mapreduce程序一直卡主
(4)将和centos下相同版本的hadoop2.7.6 解压到windows的路径下 ,设置本机环境变量如下
path环境变量添加hadoop\bin目录
%HADOOP_HOME%\bin
(5)上面的步骤全部成功后继续进行,
下载windows下连接hadoop需要的文件地址如下:地址中的文件支持hadoop2.6.* 和2.7.* 其他版本未知
https://download.csdn.net/download/wxtcstt/10576906
解压目录中有两个版本,选择正确的版本将文件解压后放置到windows 的hadoop的bin目录下 只放这两个文件即可
2 WordCount mapreduce编程代码
package hadooptest;
import java.io.IOException;
import java.io.PrintStream;
import java.util.StringTokenizer;
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.Mapper.Context;
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 static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>
{
private static final IntWritable one = new IntWritable(1);
private Text word = new Text();
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 void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context)
throws IOException, InterruptedException
{
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
this.result.set(sum);
context.write(key, this.result);
}
}
public static void main(String[] args) throws Exception
{
System.setProperty("hadoop.home.dir", "F:\\cdh5.13.0INstall\\hadoop-2.7.6\\hadoop-2.7.6");
args=new String[]{"hdfs://10.16.5.188:9000/test/shakespear.txt","hdfs://10.16.5.188:9000/test/output10"};
Configuration conf = new Configuration(); //會自動讀取程序目录的配置文件
System.out.println(conf.get("fs.defaultFS"));
//nf.set("mapred.job.tracker","10.16.5.188:9001"); 不用单独设置
// conf.set("fs.default.name","hdfs://10.16.5.189:9000");
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length < 2)
{
System.err.println("Usage: wordcount <in> [<in>...] <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(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);
}
}
代码 中的此处重点做一个解释: Configuration conf = new Configuration(); 这一句会默认加载程序目录的下的
core-site.xml hdfs-site.xml 等文件 ,所以如果设置了core-site.xml hdfs-site.xml 等配置文件是不需要使用 下面的代码 (A)的,如果没有工程目录下没有添加设置这些.xml文件
可以使用下面的代码(A)做设置
(A): //conf.set("fs.default.name","hdfs://10.16.5.189:9000");
我在程序目录的resources下放置了core-xml 内容如下,我只设置了hadoop的地址
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://10.16.5.188:9000</value>
</property>
</configuration>
程序目录如下:
代码中为了保险仍然使用了下面一句 其实删除它也是可以的 因为我们设置了 环境变量
System.setProperty("hadoop.home.dir", "F:\\cdh5.13.0INstall\\hadoop-2.7.6\\hadoop-2.7.6");
在工程中记得载入连接hadoop需要的类 基本的
4 常遇到的问题
(1)org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V
遇到这个问题的方法是将上面下载的文件中的hadoop.dll 放到系统的windows/system32下 解决此问题
(2) org.apache.hadoop.security.AccessControlException:
Permissiondenied: user=asus, access=WRITE,inode="/user/root/output":root:supergroup:drwxr-xr-x
解决方法是在centos服务器的hadoop安装目录/etc/hadoop下的hdfs-site.xml添加
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
设置没有权限认证,自己的测试环境可以这样设置
对于正式的hadoop集群,使用权限认证方法(引用https://blog.csdn.net/qq_24520639/article/details/53726393)
1.修改当前windows操作系统的用户名为centos系统中的用户名
2. 通过 haddop fs -chmod 777 ... 修改hadoop下文件的权限为任何人可读可写
3.显示设定环境变量:
System.setProperty("HADOOP_USER_NAME", "root"); //设置环境变量
或者在本机的环境变量设置 HADOOP_USER_NAME
当然还可以通过run configuration 的方式进行指定jvm环境功能变量‘-DHADOOP_USER_NAME=root’
5 总结
1 windwos 下连接hadoop 需要使用文档中下载的文件
2 在eclipse中是不需要安装插件的。