入門學習Hadoop3:使用Java進行操作HDFS
開啟eclipse新建一個Java專案
進行導包
1.公共包
2.公共包的依賴包,lib下面所有
3.hdfs包
然後
然後回到虛擬機器的master隨便建立一個檔案並放入到hdfs裡
hadoop fs -put ./hello.txt /
然後再eclipse中讀出來
然後建立檔案
boolean
success = fileSystem.mkdirs(
new
Path(
"/javaTest"
));
System.out.println(success);
這裡可能會報錯
原因:
當執行建立檔案的的時候,
即:
String Path = "hdfs://host2:9000";
FileSystem fileSystem = FileSystem.get(new URI(Path),new Configuration());
String DIR_PATH = "hdfs://host2:9000/user/hadoop/ok";
fileSystem.mkdirs(new Path(DIR_PATH));//想hadoop上建立一個檔案報錯
報錯:
org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x
原因:
1. 當前使用者是Administrator ,不是hadoop使用者
2. hadoop的預設的hdfs的檔案目錄是有許可權的,要建立位置是目錄是用檔案許可權的
說明 :
上面的String IR_PATH_1 = "hdfs://host2:9000/user/hadoop/ok"; String IR_PATH_2 = "/ok";
這個這兩個是有區別的,前面的 IR_PATH_1 是要在預設的目錄(hdfs://host2:9000)下的/user/hadoop下進行建立資料夾,
而他的檔案為:drwxr-xr-x - hadoop supergroup 0 2016-07-18 09:04 /user/hadoo 是使用者使用者hadoop 使用者組supergroup 的資料夾
後面的一個IR_PATH_2 是在根目錄(hdfs://host2:9000)下進建立進行建立
解決辦法:
1. 為了使Eclipse能正常對Hadoop叢集的HDFS上的檔案能進行修改和刪除,所以修改你工作時所用的Win7系統管理員名字,預設一般為"Administrator",把它修改為"hadoop",此使用者名稱與Hadoop叢集普通使用者一致,大家應該記得我們Hadoop叢集中所有的機器都有一個普通使用者——hadoop,而且Hadoop執行也是用這個使用者進行的。為了不至於為許可權苦惱,我們可以修改Win7上系統管理員的姓名,這樣就避免出現該使用者在Hadoop叢集上沒有許可權等都疼問題,會導致在Eclipse中對Hadoop叢集的HDFS建立和刪除檔案受影響。
(1)選擇"本地使用者和組",展開"使用者",找到系統管理員"Administrator",修改其為"hadoop",
(2)把電腦進行"登出"或者"重啟電腦",這樣才能使管理員才能用這個名字。
2.修改hadoop的配置
在conf/hdfs-site.xml中加入
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
3.修改許可權:(windows使用者Administrator對hadoop目錄並沒有寫入許可權)
放開 hadoop 目錄的許可權 , 命令如下 :$ hadoop fs -chmod 777 /user/hadoop.
這樣是可以進行寫入了,但是,這樣建立的資料夾資訊為:使用者為 Administrator
drwxr-xr-x - Administrator supergroup 0 2016-07-18 09:12 /user/hadoop/ok
是Administrator使用者的,不是下面的一個資料夾型別一樣
drwxr-xr-x - hadoop supergroup 0 2016-07-18 09:20 /user/hadoop/.Trash
這裡我使用的方法是:
cd /usr/local/hadoop/etc/hadoop
vim hdfs-site.xml
然後重啟叢集,java程式再跑一遍,就成功了。
//判斷hello.txt檔案是否存在
boolean b = fileSystem.exists(new Path("/hello.txt"));
System.out.println(b);
//建立javaTest目錄
boolean success = fileSystem.mkdirs(new Path("/javaTest"));
System.out.println(success);
//刪除javaTest目錄
boolean success = fileSystem.delete(new Path("/javaTest"), true);
System.out.println(success);
//判斷javaTest目錄是否存在
boolean b = fileSystem.exists(new Path("/javaTest"));
System.out.println(b);//把win下的檔案上傳到HDFS上
//在hdfs上建立一個檔案
FSDataOutputStream out = fileSystem.create(new Path("/test.data"), true);
//選中本地檔案
FileInputStream fis = new FileInputStream("e:/test/ciyun.txt");
//把fis中的檔案拷貝到out中,緩衝區大小為4096,上傳後關閉管道
IOUtils.copyBytes(fis, out, 4096, true);
檢視資料內容
//得到整個目錄的資訊
FileStatus[] statuses = fileSystem.listStatus(new Path("/"));
//System.out.println(statuses.length);
for(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
}