HDFS JAVA API

系統環境

Linux Ubuntu 16.04

jdk-7u75-linux-x64

hadoop-2.6.0-cdh5.4.5

hadoop-2.6.0-eclipse-cdh5.4.5.jar

eclipse-java-juno-SR2-linux-gtk-x86_64

相關知識

HDFS上的文件創建,上傳,下載,刪除等操作的具體方法實現:

(1)public boolean mkdirs(Path f) throws IOException

一次性新建所有目錄(包括父目錄), f是完整的目錄路徑。

(2)public FSOutputStream create(Path f) throws IOException

創建指定path對象的一個文件,返回一個用於寫入數據的輸出流

create()有多個重載版本,允許我們指定是否強制覆蓋已有的文件、文件備份數量、寫入文件緩衝區大小、文件塊大小以及文件權限。
(3)public boolean copyFromLocal(Path src, Path dst) throws IOException

將本地文件拷貝到文件系統

(4)public boolean exists(Path f) throws IOException

檢查文件或目錄是否存在

(5)public boolean delete(Path f, Boolean recursive)
永久性刪除指定的文件或目錄,如果f是一個空目錄或者文件,那麼recursive的值就會被忽略。只有recursive=true時,一個非空目錄及其內容纔會被刪除。

(6)FileStatus類封裝了文件系統中文件和目錄的元數據,包括文件長度、塊大小、備份、修改時間、所有者以及權限信息。

任務內容

本實驗涉及到使用Java API對HDFS的一些基本操作。

1.創建類MakeDir.class,在HDFS的根目錄下,創建名爲hdfstest的目錄。

2.創建類TouchFile.class,在HDFS的目錄/hdfstest下,創建名爲touchfile的文件。

3.創建類CopyFromLocalFile.class,將linux本地文件/data/mydata/sample_data,上傳到HDFS文件系統的/hdfstest目錄下。

4.創建類CopyToLocalFile.class,將HDFS文件系統上的文件/hdfstest/sample_data,下載到本地/data/mydata/copytolocal 。

5.創建類ListFiles.class,列出HDFS文件系統/hdfstest目錄下,所有的文件,以及文件的權限、用戶組、所屬用戶。

6.創建類IteratorListFiles.class,列出HDFS文件系統/根目錄下,以及各級子目錄下,所有文件以及文件的權限、用戶組,所屬用戶。

7.瞭解FileSystem類下的方法,例如:判斷文件是否存在、刪除文件、重命名文件等。
8.創建類LocateFile.class,查看HDFS文件系統上,文件/hdfstest/sample_data的文件塊信息。

9.創建類WriteFile.class,在HDFS上,創建/hdfstest/writefile文件,並在文件中寫入內容“hello world hello data!”。

10.創建類PutMerge.class,將Linux本地文件夾/data/mydata/下的所有文件,上傳到HDFS上併合併成一個文件/hdfstest/mergefile。

任務步驟

1.切換目錄到/apps/hadoop/sbin下,啓動hadoop。

cd /apps/hadoop/sbin  
./start-all.sh  

在Linux本地創建/data/hadoop4目錄。

mkdir -p /data/hadoop4

2.切換到/data/hadoop4目錄,用wget命令,從http://192.168.1.100:60000/allfiles/hadoop4/網址上下載依賴包hadoop2lib.tar.gz,並解壓到當前目錄。

cd /data/hadoop4  
wget http://192.168.1.100:60000/allfiles/hadoop4/hadoop2lib.tar.gz  
tar zxvf hadoop2lib.tar.gz  

3.打開Eclipse,新建JAVA項目,名爲hadoop4。
4.在hadoop4項目下新建包,名爲my.hdfs。
5.在hadoop4項目下創建目錄,名爲hadoop4lib,用於存放項目所需依賴包
6.從/data/hadoop4/hadoop2lib目錄下拷貝所有jar包到項目下的hadoop4lib目錄。
在這裏插入圖片描述
這樣就將jar包加載到項目裏面了,然後是進行Java API對HDFS的各種基本操作。

7.在my.hdfs包下,新建類MakeDir,程序功能是在HDFS的根目錄下,創建名爲hdfstest的目錄。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class MakeDir {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();

		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);

		String newDir = "/hdfstest";

		boolean result = hdfs.mkdirs(new Path(newDir));
		if (result) {
			System.out.println("Success!");
		}else {
			System.out.println("Failed!");
		}
	}
}

在Eclipse裏執行,然後在HDFS上查看實驗結果。

hadoop fs -ls -R  /  

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述
8.在my.hdfs包下,新建類TouchFile,程序功能是在HDFS的目錄/hdfstest下,創建名爲touchfile的文件。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class TouchFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration configuration = new Configuration();

		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), configuration);

		String filePath = "/hdfstest/touchfile";

		FSDataOutputStream create = hdfs.create(new Path(filePath));

		System.out.println("Finish!");
	}
}

在Eclipse裏執行,然後在hdfs上查看實驗結果。

hadoop fs -ls -R /  

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述
9.在/data/hadoop4下使用vim打開sample_data文件,

cd /data/hadoop4  
vim sample_data  

向sample_data文件中寫入hello world。(使用vim編輯時,需輸入a,開啓輸入模式)

hello world  

在my.hdfs包下,創建類CopyFromLocalFile.class,程序功能是將本地linux操作系統上的文件/data/hadoop4/sample_data,上傳到HDFS文件系統的/hdfstest目錄下。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyFromLocalFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();
		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);
		String from_Linux = "/data/hadoop4/sample_data";
		String to_HDFS = "/hdfstest/";
		hdfs.copyFromLocalFile(new Path(from_Linux), new Path(to_HDFS));
		System.out.println("Finish!");
	}
}

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述

10.在/data/hadoop4/下創建目錄copytolocal。

mkdir /data/hadoop4/copytolocal  

在my.hdfs包下,創建類CopyToLocalFile.class,程序功能是將HDFS文件系統上的文件/hdfstest/sample_data,下載到本地/data/hadoop4/copytolocal 。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CopyToLocalFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();

		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);

		String from_HDFS = "/hdfstest/sample_data";
		String to_Linux = "/data/hadoop4/copytolocal";

		hdfs.copyToLocalFile(false, new Path(from_HDFS), new Path(to_Linux));

		System.out.println("Finish!");
	}
}

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述
11.在my.hdfs包下,新建類ListFiles,程序功能是列出HDFS文件系統/hdfstest目錄下,所有的文件,以及文件的權限、用戶組、所屬用戶。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class ListFiles {
	public static void main(String[] args) throws IOException {
		Configuration conf = new Configuration();
		String hdfspath = "hdfs://localhost:9000/";
		FileSystem hdfs = FileSystem.get(URI.create(hdfspath), conf);
		String watchHDFS = "/hdfstest";
		FileStatus[] files = hdfs.listStatus(new Path(watchHDFS));
		for (FileStatus file : files) {
			System.out.println(file.getPermission() + " " + file.getOwner()
					+ " " + file.getGroup() + " " + file.getPath());
		}
	}
}

運行結果:

在這裏插入圖片描述12.在my.hdfs包下,新建類IteratorListFiles,程序功能是列出HDFS文件系統/根目錄下,以及各級子目錄下,所有文件以及文件的權限、用戶組,所屬用戶。

package my.hdfs;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class IteratorListFiles {
	public static void main(String[] args) throws IOException {
		Configuration conf = new Configuration();
		String hdfspath = "hdfs://localhost:9000/";
		FileSystem hdfs = FileSystem.get(URI.create(hdfspath), conf);
		String watchHDFS = "/";

		iteratorListFile(hdfs, new Path(watchHDFS));
	}
	public static void iteratorListFile(FileSystem hdfs, Path path)
			throws FileNotFoundException, IOException {
		FileStatus[] files = hdfs.listStatus(path);
		for (FileStatus file : files) {
			if (file.isDirectory()) {
				System.out.println(file.getPermission() + " " + file.getOwner()
						+ " " + file.getGroup() + " " + file.getPath());
				iteratorListFile(hdfs, file.getPath());
			} else if (file.isFile()) {
				System.out.println(file.getPermission() + " " + file.getOwner()
						+ " " + file.getGroup() + " " + file.getPath());
			}
		}
	}
}

運行結果:

在這裏插入圖片描述
13.文件是否存在、刪除文件、重命名文件
瞭解FileSystem類下的方法,例如:判斷文件是否存在、刪除文件、重命名文件等。
FileSystem的方法exists、delete、rename。

exists:

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class FileExists {
/**
I
* @param args
* @throws URISyntaxException
* @throws IOException
*/
public static void main(String[] args) throws IOException, URISyntaxException {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
String hdfsPath = "hdfs://localhost:9000" ;
FileSystem hdfs = FileSystem. get(new URI (hdfsPath),conf);
String fileExists = "/hdfstest/sample_ data";
hdfs.exists(new Path(fileExists)) ;
System. out. println(hdfs . exists (new Path(fileExists)));
}

運行結果:

在這裏插入圖片描述
14.在my.hdfs包下,新建類LocateFile,程序功能是查看HDFS文件系統上,文件/hdfstest/sample_data的文件塊信息。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class LocateFile {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();
		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);

		Path file = new Path("/hdfstest/sample_data");
		FileStatus fileStatus = hdfs.getFileStatus(file);

		BlockLocation[] location = hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
		for (BlockLocation block : location) {
			String[] hosts = block.getHosts();
			for (String host : hosts) {
				System.out.println("block:" +block + " host:"+ host);
			}
		}
	}
}

運行結果:

在這裏插入圖片描述
15.在my.hdfs包下,新建類WriteFile,程序功能是在HDFS上,創建/hdfstest/writefile文件並在文件中寫入內容“hello world hello data!”。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class WriteFile {
	public static void main(String[] args) throws IOException {
		Configuration conf = new Configuration();

		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs = FileSystem.get(URI.create(hdfsPath), conf);

		String filePath = "/hdfstest/writefile";

		FSDataOutputStream create = hdfs.create(new Path(filePath));

		System.out.println("Step 1 Finish!");

		String sayHi = "hello world hello data!";
		byte[] buff = sayHi.getBytes();
		create.write(buff, 0, buff.length);
		create.close();
		System.out.println("Step 2 Finish!");
	}
}

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述
16.首先切換到/data/hadoop4目錄下,將該目錄下的所有文件刪除(此時要求/data/hadoop4中必須全是文件,不能有目錄)。

cd /data/hadoop4  
rm -r /data/hadoop4/*  

然後在該目錄下新建兩文件,分別命名爲file1 ,file2。

touch file1  
touch file2 

向file1和file2中,分別輸入內容如下

echo "hello file1" > file1  
echo "hello file2" > file2  

在my.hdfs包下,新建類PutMerge,程序功能是將Linux本地文件夾/data/hadoop4/下的所有文件,上傳到HDFS上併合併成一個文件/hdfstest/mergefile。

package my.hdfs;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
	public static void main(String[] args) throws IOException, URISyntaxException {
		Configuration conf = new Configuration();
		String hdfsPath = "hdfs://localhost:9000";
		FileSystem hdfs  = FileSystem.get(new URI(hdfsPath), conf);
		FileSystem local = FileSystem.getLocal(conf);
		String from_LinuxDir = "/data/hadoop4/";
		String to_HDFS = "/hdfstest/mergefile";
		FileStatus[] inputFiles = local.listStatus(new Path(from_LinuxDir));
		FSDataOutputStream out = hdfs.create(new Path(to_HDFS));

		for (FileStatus file : inputFiles) {
			FSDataInputStream in = local.open(file.getPath());
			byte[] buffer = new byte[256];
			int bytesRead = 0;
			while ( (bytesRead = in.read(buffer) ) > 0) {
				out.write(buffer, 0, bytesRead);
			}
			in.close();
		}
		System.out.println("Finish!");
	}
}

運行結果:

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章