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
重新執行,成功。