1. 程式人生 > >入門學習Hadoop3:使用Java進行操作HDFS

入門學習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());
        }