目錄
一、Shell的使用
- 平時的linux指令是針對本地電腦進行的,而HDFS是分佈式的,它針對的是通過網絡連接的計算機集羣,因此在指令上有所區別。
- 在大部分普通linux指令前加上“hdfs dfs -”即可。
- 例如我們想要創建一個文件夾,平時都是用“mkdir /test1”指令在本地虛擬機上創建"test1"目錄,但是如果想要在HDFS中創建一個“test1”目錄,就需要在普通linux指令前加上“hdfs dfs -”,如下。
hdfs dfs -mkdir /test1
- 在web網頁上可以看到我們的確已經創建好了目錄test1。
二、JAVA api的使用
- 由上面的例子可以看到,我們可以通過shell操縱我們的HDFS,通過shell創建了一個目錄,那如何用java api進行同樣的操作呢?
(一)配置xml文件
1、創建項目
- 在本機電腦上用ecplise創建JAVA項目,不贅述。
2、導包
- 找到hadoop的路徑,進入“..hadoop-2.7.0\share\hadoop\common”路徑,看到有三個Jar包,將它導入到JAVA項目中。
- 同樣的,再將“..hadoop-2.7.0\share\hadoop\common\lib”下的所有jar包導入。
- 再將“..hadoop-2.7.0\share\hadoop\hdfs”下的3個jar包導入。
- 再將“..hadoop-2.7.0\share\hadoop\hdfs\lib”下的所有jar包導入。
3、導入虛擬機的配置文件
- 利用xftp進入到虛擬機的“.../hadoop-2.7.0/etc/hadoop”目錄下,找到兩個文件“hdfs-site.xml”和"core-site.xml",導出並放到項目的/src根目錄下。
- 要修改“core-site.xml”裏面的“localhost”爲虛擬機的IP地址,不然本機無法找到虛擬機,它不知道這個“localhost”是誰。(其實也可以在本機上配置host的,使得別名和IP對應,繼續使用別名)
- 修改
- 同樣的也要修改"hdfs-site.xml"中的虛擬機名爲IP地址。
- 運行如下代碼,創建目錄:
package com.bigdata.yunpan;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class YunPanDemo {
public static void main(String[] args) {
Configuration conf=new Configuration(); //負責獲取相應虛擬機的配置文件信息
try {
FileSystem fs=FileSystem.get(conf); //文件系統的管理類
Path path=new Path("/yunpan");
fs.mkdirs(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在這過程中可能出現的兩個問題。
一、報錯ConnnectionRefuse。
我的解決方法:從僞分佈式改成完全分佈式模式。 所以最好參考官方文檔提示,一一排除錯誤。或者也可以參考別的博客:9000端口拒絕訪問
二、報錯AccessControlException。
是因爲權限不夠大,執行修改權限命令chmod,改權限即可。
hdfs dfs -chmod -R 777 /
R是遞歸遍歷子目錄的意思,這句話的意思就是修改根目錄/下的所有文件權限爲777。
- 在web上可以發現,和shell命令的使用效果一樣,的確多了一個目錄叫做"yunpan"。
- 接下來我們參考API文檔寫程序,就可以在雲盤上創建/上傳/下載新文件了,就像一個自用的百度網盤一樣。
(二)簡單代碼demo(創建、查看、上傳、下載)
package com.bigdata.yunpan;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* 一個簡易的示例demo2
*/
public class HdfsDemo {
public static void main(String[] args) {
createList("/yunpan");
//createFolder("/yunpan");
//uploadFile("/yunpan/upload.doc ","e://upload.doc");
//downloadFile("/yunpan/download.doc","e:// download.doc");
//listFile(new Path("/"));
}
/**
* 列出所有文件的名字
* @param path 待查詢路徑
*/
public static void listFile(Path path) {
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(conf);
//傳入路徑,表示對某個路徑下的文件夾列表進行顯示
//將給定路徑下所有的文件元數據放到一個FileStatus的數組中。
//FileStatus對象封裝了文件的和目錄的元數據,包括文件長度、塊大小、權限等信息
FileStatus[] fileStatusArray = fs.listStatus(path);
for (int i = 0; i < fileStatusArray.length; i++) {
FileStatus fileStatus = fileStatusArray[i];
//首先檢測當前檢測是否是文件夾,如果“是”則進行遞歸
if (fileStatus.isDirectory()) {
System.out.println("當前路徑是:" + fileStatus.getPath());
listFile(fileStatus.getPath());
} else {
System.out.println("當前路徑是:" + fileStatus.getPath());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 在路徑下創建一個文件夾
* @param p 路徑
*/
public static void createFolder(String p) {
// 定義一個配置對象
Configuration conf = new Configuration();
try {
// 通過配置信息得到文件系統的對象
FileSystem fs = FileSystem.get(conf);
//在指定的路徑下創建文件夾
Path path = new Path(p);
fs.mkdirs(path);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上傳文件
* @param webPath 要放置在web上的路徑
* @param localPath 待上傳文件的路徑
*/
public static void uploadFile(String webPath,String localPath) {
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(conf);
//定義文件的路徑和上傳的路徑
Path src = new Path(localPath);
Path dest = new Path(webPath);
//從本地上傳文件到服務器
fs.copyFromLocalFile(src, dest);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 下載文件
* @param webPath 在web上,待下載文件的路徑
* @param localPath 待下載的本地路徑
*/
public static void downloadFile(String webPath,String localPath) {
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(conf);
//定義下載文件的路徑和本地下載路徑
Path src = new Path(webPath);
Path dest = new Path(localPath);
//從服務器下載文件到本地
fs.copyToLocalFile(src, dest);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 創建目錄
* @param p 創建目錄的路徑
*/
public static void createList(String p) {
Configuration conf=new Configuration(); //負責獲取相應虛擬機的配置文件信息
try {
FileSystem fs=FileSystem.get(conf); //文件系統的管理類
Path path=new Path(p);
fs.mkdirs(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、Python的使用
自行查看官方文檔。 python-api