需求:安装好hadoop之后,为了方便开发mapreduce程序,需要在windows环境中配置MyEclipse环境
一、搭建环境
二、配置
1、把下载好的插件放到MyEclipse安装目录下的 dropins目录中
2、打开MyEclipse,选择windows——>preferences,若插件放置成功,会如下图所示:(存在 Hadoop Map/Reduce 选项)
然后选择你在本地解压的hadoop目录(当然如果本地没有hadoop,可以随便写一个目录,但是为了方便查看hadoop的一些方法我们还是解压在本地的好),点击OK
3、创建map/reduce locations
选择 windows———>show view——> other——》map/reduce locations 进入如下页面:
点击如上图所示的箭头指示的小象,进入如下界面:
这里要注意一下几点:
(1)、Location name:根据需要随便填,这里填写Hadoop
(2)、MapReduce Master Host:填写core-site.xml中的配置信息中的IP地址或主机名(填写主机名必须在本地的hosts文件中加IP地址映射)
port:同样根据配置信息
我的core-site.xml配置如下:
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
(3)、DFS Master Host和Port是hdfs对应的IP和端口号(没有配置端口默认是9001)
(4)、user name:是服务器上你的用户名
三、创建工程、编写程序
1、new一个 mapreduce工程,增加包和类,加入如下代码:
package com.smile;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class Test {
public static final String PATH = "hdfs://master:9000";
static final String DIR = "/d3";
static final String FILE = "/d1/hello";
/**
* @param args
*/
public static void main(String[] args) throws Exception {
FileSystem fileSystem = getFileSystem();
// 创建文件夹 hadoop fs -mkdir /f1
mkdir(fileSystem);
// 上传文件 -put src des
// putData(fileSystem);
// 下载文件 hadoop fs -get src des
// getData(fileSystem);
// 浏览文件夹
list(fileSystem);
// 删除文件夹
// remove(fileSystem);
}
private static void list(FileSystem fileSystem) throws IOException {
final FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
String isDir = fileStatus.isDir() ? "文件夹" : "文件";
final String permission = fileStatus.getPermission().toString();
final short replication = fileStatus.getReplication();
final long len = fileStatus.getLen();
final String path = fileStatus.getPath().toString();
System.out.println(isDir + "\t" + permission + "\t" + replication
+ "\t" + len + "\t" + path);
}
}
private static void getData(FileSystem fileSystem) throws IOException {
final FSDataInputStream in = fileSystem.open(new Path(FILE));
IOUtils.copyBytes(in, System.out, 1024, true);
}
private static void putData(FileSystem fileSystem) throws IOException,
FileNotFoundException {
final FSDataOutputStream out = fileSystem.create(new Path(FILE));
final FileInputStream in = new FileInputStream(
"H:/kuaipan/hadoop/classes/yy131009/day2/readme.txt");
IOUtils.copyBytes(in, out, 1024, true);
}
private static void remove(FileSystem fileSystem) throws IOException {
fileSystem.delete(new Path(DIR), true);
}
private static void mkdir(FileSystem fileSystem) throws IOException {
fileSystem.mkdirs(new Path(DIR));
}
private static FileSystem getFileSystem() throws IOException,
URISyntaxException {
return FileSystem.get(new URI(PATH), new Configuration());
}
}
此代码的功能是在hdfs系统中创建一个 d3的目录,单击右键run as ------>java application ,运行效果如下图所示:
说明在hdfs中创建 /d3目录成功的同时,也验证了本地的MyEclipse能够和远程的Hadoop成功连接,那么现在可以开发你的APP了!
也可以通过 在server中通过命令查询创建的目录:
hadoop fs -ls /
如下所示:
[paul@master ~]$ hadoop fs -ls /
Found 3 items
drwxr-xr-x - paul supergroup 0 2015-08-24 10:59 /d1
drwxr-xr-x - paul supergroup 0 2015-08-24 11:04 /d2
drwxr-xr-x - paul supergroup 0 2015-08-24 11:56 /d3
Found 3 items
drwxr-xr-x - paul supergroup 0 2015-08-24 10:59 /d1
drwxr-xr-x - paul supergroup 0 2015-08-24 11:04 /d2
drwxr-xr-x - paul supergroup 0 2015-08-24 11:56 /d3
四、可能遇到的问题:
1、安全模式:
hadoop刚启动时会进入安全模式(safemode),进入安全模式的原因是为了检查datanode检查其中的数据块,namenode会根据这个检查信息对数据进行备份或删除等一系列的操作(总之我们知道一开始会进入safemode就好)。进入safemode就只允许读操作,这会导致不能进行增删改操作。解决这一问题也很简单,首先我们检查一下hadoop是否进入了安全模式,命令如下:
hdfs dfsadmin -safemode get
若出现Safe mode is ON 说明系统已经是安全模式,只需强制退出即可,命令如下:
hdfs dfsadmin -safemode leave
重新输入:
hdfs dfsadmin -safemode get
会发现Safe mode is OFF
重新运行程序即可。
2、上述程序要想正常运行必须引入jar包,只需把 hadoop/bin 相应的jar引入即可。
3、Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
解决方案:
这个问题困扰了我很久,网上找的原因主要是本地没有hadoop.dll这个文件,从网上下了一个放到本地windows中的system32目录下还是会报错!后来搜了一个人的帖子,我加了如下代码:
try {
System.load("D:/software/hadoop-2.6.0/bin/hadoop.dll");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load.\n" + e);
System.exit(1);
}
结果出现:Can't load IA 32-bit .dll on a AMD 64-bit platform
这才让我恍然大悟,原来我下的hadoop.dll是hadoop2.2版本的,可能是32位的原因,和本地的64位环境不匹配,重新找资源,替换原来的hadoop.dll 成功!
hadoop.dll文件的连接地址
点击打开链接
这个问题困扰了我很久,网上找的原因主要是本地没有hadoop.dll这个文件,从网上下了一个放到本地windows中的system32目录下还是会报错!后来搜了一个人的帖子,我加了如下代码:
try {
System.load("D:/software/hadoop-2.6.0/bin/hadoop.dll");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load.\n" + e);
System.exit(1);
}
结果出现:Can't load IA 32-bit .dll on a AMD 64-bit platform
这才让我恍然大悟,原来我下的hadoop.dll是hadoop2.2版本的,可能是32位的原因,和本地的64位环境不匹配,重新找资源,替换原来的hadoop.dll 成功!