1. 開發(fā)環(huán)境配置
- 添加Hadoop環(huán)境變量
# hadoop安裝目錄
export HADOOP_HOME="/opt/hadoop2.8.4"
# 配置PATH
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
注:網(wǎng)上相關教程要求本地也安裝hadoop,添加環(huán)境變量苛白,然后才能使用Java客戶端娃豹。沒有看過官方文檔說明是否如此。歡迎勘誤
- 引入pom依賴
使用maven管理項目依賴购裙,導入依賴jar如下.
下載比較慢懂版,建議使用阿里云nexus鏡像
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2. JavaAPI
HDFS的client使用非常簡單。它的Java API使用FileSystem類作為功能接口躏率,首先需要獲取該鏈接躯畴,然后進行操作,最后關閉鏈接薇芝∨畛基礎代碼如下
// 使用namenode地址,namenode管理數(shù)據(jù)的元信息
private static final String NAME_NODE_URI = "hdfs://192.168.56.101:9000";
private static final String USER = "root";
public static void main(String[] args) {
FileSystem fileSystem = null;
try {
listForder(fileSystem);
// upload(fileSystem);
// download(fileSystem);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != fileSystem) {
fileSystem.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 獲取文件系統(tǒng)鏈接
*/
private static FileSystem getFileSystem() throws Exception{
// 支持自定義配置
Configuration configuration = new Configuration();
// NameNode的鏈接夯到,client通過namenode獲取元信息
URI uri = new URI(NAME_NODE_URI);
FileSystem fileSystem = FileSystem.get(uri, configuration, USER);
return fileSystem;
}
- 展示文件
/**
* 打印目錄信息
*/
public static void listForder(FileSystem fileSystem) throws Exception{
System.out.println("打印hdfs文件目錄:");
// 獲取HDFS文件系統(tǒng)
fileSystem = getFileSystem();
Path path = new Path("/");
// 遞歸獲取
RemoteIterator<LocatedFileStatus> it = fileSystem.listFiles(path, true);
while (it.hasNext()) {
LocatedFileStatus status = it.next();
System.out.println("文件名: " + status.getPath().getName());
System.out.println("文件大小: " + status.getLen());
System.out.println("塊大小: " + status.getBlockSize());
System.out.println("塊位置: ");
for (BlockLocation location : status.getBlockLocations()) {
for (String host : location.getHosts()) {
System.out.println(host);
}
}
System.out.println("全部信息:" + status);
System.out.println("-------------------");
}
System.out.println("文件目錄打印完畢");
}
測試結果:
- 上傳文件
/**
* 上傳文件
*/
public static void upload(FileSystem fileSystem) throws Exception{
System.out.println("測試上傳文件");
fileSystem = getFileSystem();
// 源路徑
Path src = new Path("/Users/yuanyc/Desktop/soa.xml");
// 目標路徑
Path dst = new Path("/");
fileSystem.copyFromLocalFile(src, dst);
System.out.println("上傳文件結束");
}
測試結果:
- 下載文件
/**
* 下載文件
*/
public static void download(FileSystem fileSystem) throws Exception {
System.out.println("下載文件開始");
fileSystem = getFileSystem();
// 下載1.jpg
Path src = new Path("/1.jpg");
Path dst = new Path("/Users/yuanyc/Desktop");
fileSystem.copyToLocalFile(src, dst);
System.out.println("下載文件結束");
}
測試結果:
成功下載
- 創(chuàng)建目錄
/**
* 創(chuàng)建目錄
*/
public static void mkDir(FileSystem fileSystem) throws Exception {
System.out.println("創(chuàng)建目錄");
fileSystem = getFileSystem();
Path dir = new Path("/hello/world");
fileSystem.mkdirs(dir);
System.out.println("創(chuàng)建目錄完成");
}
測試結果:web端看到該目錄
- 刪除目錄
/**
* 刪除目錄
*/
public static void rmDir(FileSystem fileSystem) throws Exception {
System.out.println("刪除目錄");
fileSystem = getFileSystem();
boolean isrecuirse = true;
Path dir = new Path("/hello");
fileSystem.delete(dir, isrecuirse);
System.out.println("刪除目錄完成");
}
測試結果:成功刪除
- 流操作
通過fileSystem的create和open方法可以創(chuàng)建和獲取輸入和輸出流
/**
* 流方式下載
*/
public static void streamDownLoad(FileSystem fileSystem) throws Exception {
fileSystem = getFileSystem();
Path path = new Path("/soa.xml");
FSDataInputStream inputStream = fileSystem.open(path);
// 使用IOUtils操作buffer倡鲸,減少nio使用的復雜度
IOUtils.copyBytes(inputStream, System.out, 1024*1024,false);
}
測試結果: