windwos下运行hadoop相关代码(hdfs,mr)

最近在学习一些hadoop相关的知识,需要在本地运行hdfsmr相关的代码.
因为开发机使用的是windows,所以会有一些不太方便.

可以在windows下解压hadoop,然后在应用的env中指定HADOOP_HOME为解压路径.
在windows中需要winutils.exe工具,当前网上好心人预编译好的只到3.3.0.
见: https://kontext.tech/article/446/hadoop-330-winutils

如果学习使用的是这个和之前的版本,那问题不大,只需要下载再把文件放入bin目录即可.
这种方式比较常见的错误会是:

1
2
3
4
5
6
7
8
9
10
Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblems
at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:735)
at org.apache.hadoop.util.Shell.getSetPermissionCommand(Shell.java:270)
at org.apache.hadoop.util.Shell.getSetPermissionCommand(Shell.java:286)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:978)
at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:660)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:700)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:672)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:699)
...

这是HADOOP_HOME没有设置.

1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:793)
at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:1218)
at org.apache.hadoop.fs.FileUtil.list(FileUtil.java:1423)
at org.apache.hadoop.fs.RawLocalFileSystem.listStatus(RawLocalFileSystem.java:601)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1972)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:2014)
at org.apache.hadoop.fs.FileSystem$4.<init>(FileSystem.java:2180)

这是使用的winutils版本不对.

除此之外还可以利用ideaWSLSSH运行方式.
点击右上角的运行旁的下拉按钮, 打开Run/Debug Configuration,修改Run onSSHWSL.

因为本地已经搭了集群的虚拟机,并且配置了javahadoop相关环境,所以直接用SSH运行就通过了检查.
其中会有一个文件的拷贝过程,需要等待一点点时间.
要注意的是运行会在远端的服务器(这里是本地的虚拟机),所以要测试的路径/资源都要设置在远端.

之后的运行就和在本地没什么区别,也一样可以调试.