Hadoop Windows上的Spark-winutils到底是什么?我们为什么需要它?

Hadoop Windows上的Spark-winutils到底是什么?我们为什么需要它?,hadoop,apache-spark,Hadoop,Apache Spark,我很好奇!据我所知,HDFS需要运行datanode进程,这就是为什么它只在服务器上工作。Spark可以在本地运行,但需要winutils.exe,它是Hadoop的一个组件。但它到底有什么作用呢?为什么我不能在Windows上运行Hadoop,但我可以运行基于Hadoop的Spark?我知道至少有一种用法,那就是在Windows操作系统上运行shell命令。您可以在org.apache.hadoop.util.Shell中找到它,其他模块依赖于这个类并使用它的方法,例如getPermissio

我很好奇!据我所知,HDFS需要运行datanode进程,这就是为什么它只在服务器上工作。Spark可以在本地运行,但需要winutils.exe,它是Hadoop的一个组件。但它到底有什么作用呢?为什么我不能在Windows上运行Hadoop,但我可以运行基于Hadoop的Spark?

我知道至少有一种用法,那就是在Windows操作系统上运行shell命令。您可以在
org.apache.hadoop.util.Shell
中找到它,其他模块依赖于这个类并使用它的方法,例如
getPermissionCommand()
方法:

静态最终字符串WINUTILS\u EXE=“WINUTILS.EXE”;
...
静止的{
ioe异常ioe=null;
字符串路径=null;
File=null;
//不变量:要么存在有效的文件和路径,
//或者存在缓存IO异常。
如果(WINDOWS){
试一试{
file=getQualifiedBin(WINUTILS\u EXE);
path=file.getCanonicalPath();
ioe=null;
}捕获(IOE异常){
warn(“未找到{}:{}”,WINUTILS_EXE,e);
//堆栈跟踪位于调试级别
LOG.debug(“未能找到”+WINUTILS_EXE,e);
file=null;
path=null;
ioe=e;
}
}否则{
//在非windows系统上,保持不变
//通过添加显式异常。
ioe=新的FileNotFoundException(E\u不是WINDOWS\u系统);
}
WINUTILS_PATH=路径;
WINUTILS_FILE=文件;
WINUTILS=路径;
WINUTILS_FAILURE=ioe;
}
...
公共静态字符串getWinUtilsPath(){
if(WINUTILS\u FAILURE==null){
返回WINUTILS\u路径;
}否则{
抛出新的运行时异常(WINUTILS\u FAILURE.toString(),
WINUTILS_故障);
}
}
...
公共静态字符串[]GetPermissionCommand(){
返回(WINDOWS)?新字符串[]{getWinUtilsPath(),“ls”,“-F”}
:新字符串[]{“/bin/ls”,“-ld”};
}

我知道至少有一种用法,它用于在Windows操作系统上运行shell命令。您可以在
org.apache.hadoop.util.Shell
中找到它,其他模块依赖于这个类并使用它的方法,例如
getPermissionCommand()
方法:

静态最终字符串WINUTILS\u EXE=“WINUTILS.EXE”;
...
静止的{
ioe异常ioe=null;
字符串路径=null;
File=null;
//不变量:要么存在有效的文件和路径,
//或者存在缓存IO异常。
如果(WINDOWS){
试一试{
file=getQualifiedBin(WINUTILS\u EXE);
path=file.getCanonicalPath();
ioe=null;
}捕获(IOE异常){
warn(“未找到{}:{}”,WINUTILS_EXE,e);
//堆栈跟踪位于调试级别
LOG.debug(“未能找到”+WINUTILS_EXE,e);
file=null;
path=null;
ioe=e;
}
}否则{
//在非windows系统上,保持不变
//通过添加显式异常。
ioe=新的FileNotFoundException(E\u不是WINDOWS\u系统);
}
WINUTILS_PATH=路径;
WINUTILS_FILE=文件;
WINUTILS=路径;
WINUTILS_FAILURE=ioe;
}
...
公共静态字符串getWinUtilsPath(){
if(WINUTILS\u FAILURE==null){
返回WINUTILS\u路径;
}否则{
抛出新的运行时异常(WINUTILS\u FAILURE.toString(),
WINUTILS_故障);
}
}
...
公共静态字符串[]GetPermissionCommand(){
返回(WINDOWS)?新字符串[]{getWinUtilsPath(),“ls”,“-F”}
:新字符串[]{“/bin/ls”,“-ld”};
}

尽管Max的答案涵盖了它被引用的实际位置。让我简单介绍一下为什么它需要在Windows上使用它-

从Hadoop的合流页面本身-

Hadoop需要Windows上的本机库才能正常工作-这是 包括访问文件://filesystem,Hadoop在其中使用了一些 Windows API实现类似posix的文件访问权限

这是在HADOOP.DLL和WINUTILS.EXE中实现的

尤其是,%HADOOP\u HOME%\BIN\WINUTILS.EXE必须是可定位的


而且,我认为您应该能够在Windows上同时运行Spark和Hadoop。

尽管Max的回答涵盖了它被引用的实际位置。让我简单介绍一下为什么它需要在Windows上使用它-

从Hadoop的合流页面本身-

Hadoop需要Windows上的本机库才能正常工作-这是 包括访问文件://filesystem,Hadoop在其中使用了一些 Windows API实现类似posix的文件访问权限

这是在HADOOP.DLL和WINUTILS.EXE中实现的

尤其是,%HADOOP\u HOME%\BIN\WINUTILS.EXE必须是可定位的


而且,我认为您应该能够在Windows上同时运行Spark和Hadoop。

除此之外,Spark似乎使用Hadoop调用unix命令(如chmod)来创建文件和目录。如果您使用Hadoop发行版,则无法完全运行Spark。如果没有winutils,您无法读取和写入文件。是的,Spark是基于Hadoop构建的,因此使用它的一些组件是有意义的。此外,如果没有winutils.exe,您无法执行某些操作,问题主要是关于这个winutils.exe中有什么?它的用途是什么?除其他外,Spark似乎使用Hadoop调用unix命令(如chmod)来创建文件和目录。如果您使用Hadoop发行版,则无法完全运行Spark。如果没有winutils,您无法读取和写入文件。是的,Spark是基于Hadoop构建的,因此使用它的一些组件是有意义的。此外,如果没有winutils.exe,您无法执行某些操作,问题主要是关于这个winutils.exe中有什么?它有什么目的?