Maven
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.0</version>
</dependency>
或者我们整理一并整理log部分
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.9.0</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.11.0</version>
<scope>runtime</scope>
</dependency>
在我的实验中,hadoop在maven中的自动引入相关jar包出现问题,报了下面的错误:
The container 'Maven Dependencies' references non existing library 'D:\develope\apache-maven-3.3.9\repo\jdk\tools\jdk.tools\1.8\jdk.tools-1.8.jar'
仅就这个错误而言,可以下面的引入而进行修正:
<dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>C:\Program Files\Java\jdk1.8.0_66\lib\tools.jar</systemPath>
</dependency>
但是解决这个问题,又涉及到其他jar包的引入,诸如下面的错误接踵而来,如果我们每个依次添加,那还要maven干什么。
The container 'Maven Dependencies' references non existing library 'D:\develope\apache-maven-3.3.9\repo\com\google\protobuf\protobuf-java\2.5.0\protobuf-java-2.5.0.jar'
The container 'Maven Dependencies' references non existing library 'D:\develope\apache-maven-3.3.9\repo\com\google\code\gson\gson\2.2.4\gson-2.2.4.jar'
The container 'Maven Dependencies' references non existing library 'D:\develope\apache-maven-3.3.9\repo\com\jcraft\jsch\0.1.54\jsch-0.1.54.jar'
解决方式如下:项目-》右键-》Runs As-》Maven install,如果仍如出问题,尝试下面的解决方式:
- 如果有默认的JUnit 3版本,可以考虑删去。
- 注销掉hadoop-client,保存后,清除加入的jar包,然后再重新加入,然后执行Maven install
- 执行Maven clear,然后执行Maven install
【注】在使用Hadoop 3.1.0版本也出现类似的问题,同样方式可以解决。
小例子代码
小例子将在hdfs的文件系统中创建一个文件夹。
我们将使用hadoop中common和ndfs的jar包。如果我们不采用maven,可以将下面的jar包直接引入到项目中即可
/share/hadoop/common/*.jar
/share/hadoop/common/lib/*.jar
/share/hadoop/ndfs/*.jar
/share/hadoop/ndfs/lib/*.jar
但是有maven,为何不用。小例子代码很简单
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class App
{
public static void main( String[] args ) throws IOException
{
//设置Namenode的地址
Configuration config = new Configuration();
config.set("fs.defaultFS", "hdfs://191.8.2.45:9000");
//获取HDFS的文件系统
FileSystem fs = FileSystem.get(config);
fs.mkdirs(new Path("floder1"));
}
}
执行时,报错:
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=WeiYQ, access=WRITE, inode="/user":wei:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:342)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:251)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189)
......
每个用户都有自己的权限范围,由于我是在Windows机器的eclipse上进行开发,Windows的机器名字为WeiYQ,因此在这个简单的例子中,默认以WeiYQ来进行登录,目录将建立在/user/WeiYQ/floder1。我们之前已经建立了/user目录,现在建立/user/WeiYQ,修改它的权限或者owner,简单地执行:
$ hdfs dfs -mkdir /user/WeiYQ
$ hdfs dfs -chown WeiYQ /user/WeiYQ
重新执行,成功。