java實現(xiàn)對Hadoop的操作
更新時間:2021年07月01日 11:33:51 作者:Even710
這篇文章主要介紹了java實現(xiàn)對Hadoop的操作,通過非常完整詳細的代碼展示了如何去進行一系列操作,包括基本操作,文件讀寫,需要的朋友可以參考下
基本操作
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
@RunWith(JUnit4.class)
@DisplayName("Test using junit4")
public class HadoopClientTest {
private FileSystem fileSystem = null;
@BeforeEach
public void init() throws URISyntaxException, IOException, InterruptedException {
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "1");
configuration.set("dfs.blocksize", "64m");
fileSystem = FileSystem.get(new URI("hdfs://hd-even-01:9000"), configuration, "root");
}
/**
* 從本地復(fù)制文件到Hadoop
*
* @throws URISyntaxException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void copyFileFromLocal() throws URISyntaxException, IOException, InterruptedException {
// 上傳文件
fileSystem.copyFromLocalFile(new Path("C:\\Users\\Administrator\\Desktop\\win10激活.txt"), new Path("/even1"));
// 關(guān)閉流,報錯winUtils,因為使用了linux的tar包,如果windows要使用,則需要編譯好這個winUtils包才能使用
fileSystem.close();
}
/**
* 從Hadoop下載文件到本地,下載需要配置Hadoop環(huán)境,并添加winutils到bin目錄
*
* @throws URISyntaxException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void copyFileToLocal() throws URISyntaxException, IOException, InterruptedException {
// 下載文件
fileSystem.copyToLocalFile(new Path("/win10激活.txt"), new Path("E:/"));
// 關(guān)閉流,報錯winUtils,因為使用了linux的tar包,如果windows要使用,則需要編譯好這個winUtils包才能使用
fileSystem.close();
}
/**
* 創(chuàng)建文件夾
*
* @throws IOException
*/
@Test
public void hdfsMkdir() throws IOException {
// 調(diào)用創(chuàng)建文件夾方法
fileSystem.mkdirs(new Path("/even1"));
// 關(guān)閉方法
fileSystem.close();
}
/**
* 移動文件/修改文件名
*/
public void hdfsRename() throws IOException {
fileSystem.rename(new Path(""), new Path(""));
fileSystem.close();
}
/**
* 刪除文件/文件夾
*
* @throws IOException
*/
@Test
public void hdfsRm() throws IOException {
// fileSystem.delete(new Path(""));
// 第二個參數(shù)表示遞歸刪除
fileSystem.delete(new Path(""), true);
fileSystem.close();
}
/**
* 查看hdfs指定目錄的信息
*
* @throws IOException
*/
@Test
public void hdfsLs() throws IOException {
// 調(diào)用方法返回遠程迭代器,第二個參數(shù)是把目錄文件夾內(nèi)的文件也列出來
RemoteIterator<LocatedFileStatus> listFiles = fileSystem.listFiles(new Path("/"), true);
while (listFiles.hasNext()) {
LocatedFileStatus locatedFileStatus = listFiles.next();
System.out.println("文件路徑:" + locatedFileStatus.getPath());
System.out.println("塊大?。? + locatedFileStatus.getBlockSize());
System.out.println("文件長度:" + locatedFileStatus.getLen());
System.out.println("副本數(shù)量:" + locatedFileStatus.getReplication());
System.out.println("塊信息:" + Arrays.toString(locatedFileStatus.getBlockLocations()));
}
fileSystem.close();
}
/**
* 判斷是文件還是文件夾
*/
@Test
public void findHdfs() throws IOException {
// 1,展示狀態(tài)信息
FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
// 2,遍歷所有文件
for (FileStatus fileStatus : listStatus) {
if (fileStatus.isFile())
System.out.println("是文件:" + fileStatus.getPath().getName());
else if (fileStatus.isDirectory())
System.out.println("是文件夾:" + fileStatus.getPath().getName());
}
fileSystem.close();
}
}
文件讀寫
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.DisplayName;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@RunWith(JUnit4.class)
@DisplayName("this is read write test!")
public class HadoopReadWriteTest {
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void init() throws URISyntaxException, IOException, InterruptedException {
// 1,加載配置
configuration = new Configuration();
// 2,構(gòu)建客戶端
fileSystem = FileSystem.get(new URI("hdfs://hd-even-01:9000/"), configuration, "root");
}
@Test
public void testReadData() throws IOException {
// 1,獲取hdfs文件流
FSDataInputStream open = fileSystem.open(new Path("/win10激活.txt"));
// 2,設(shè)置一次獲取的大小
byte[] bytes = new byte[1024];
// 3,讀取數(shù)據(jù)
while (open.read(bytes) != -1)
System.out.println(Arrays.toString(bytes));
open.close();
fileSystem.close();
}
/**
* 使用緩存流
*
* @throws IOException
*/
@Test
public void testReadData1() throws IOException {
FSDataInputStream open = fileSystem.open(new Path("/win10激活.txt"));
// 使用緩沖流會快點
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open, StandardCharsets.UTF_8));
String line = "";
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
open.close();
fileSystem.close();
}
/**
* 指定偏移量來實現(xiàn)只讀部分內(nèi)容
*/
@Test
public void readSomeData() throws IOException {
FSDataInputStream open = fileSystem.open(new Path("/win10激活.txt"));
// 指定開始的index
open.seek(14);
// 指定讀的多少
byte[] bytes = new byte[5];
while (open.read(bytes) != -1)
System.out.println(new String(bytes));
open.close();
fileSystem.close();
}
/**
* 流方式寫數(shù)據(jù)
* @throws IOException
*/
@Test
public void writeData() throws IOException {
// 1,獲取輸出流
FSDataOutputStream out = fileSystem.create(new Path("/win11.txt"), false);
// 2,獲取需要寫的文件輸入流
FileInputStream in = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\xixi.txt"));
byte[] b = new byte[1024];
int read = 0;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
in.close();
out.close();
fileSystem.close();
}
/**
* 直接寫字符串
*/
@Test
public void writeData1() throws IOException {
// 1,創(chuàng)建輸出流
FSDataOutputStream out = fileSystem.create(new Path("/aibaobao.txt"), false);
// 2,寫數(shù)據(jù)
out.write("wochaoaibaobao".getBytes());
// 3,關(guān)閉流
IOUtils.closeStream(out);
fileSystem.close();
}
/**
* IOUtils方式上傳
*
* @throws IOException
*/
@Test
public void putToHdfs() throws IOException {
// 1,獲取輸入流
FileInputStream in = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\xixi.txt"));
// 2,獲取輸出流
FSDataOutputStream out = fileSystem.create(new Path("/haddopPut.txt"), false);
// 3,拷貝
IOUtils.copyBytes(in, out, configuration);
// 4,關(guān)閉流
IOUtils.closeStream(in);
IOUtils.closeStream(out);
fileSystem.close();
}
/**
* IOUtils方式下載
* @throws IOException
*/
@Test
public void getFromHdfs() throws IOException {
// 1,獲取輸入流
FSDataInputStream open = fileSystem.open(new Path("/haddopPut.txt"));
// 2,獲取輸出流
FileOutputStream out = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\haddopPut.txt"));
// 3,拷貝
IOUtils.copyBytes(open, out, configuration);
// 4,關(guān)閉流
IOUtils.closeStream(open);
IOUtils.closeStream(out);
fileSystem.close();
}
}
到此這篇關(guān)于java實現(xiàn)對Hadoop的操作的文章就介紹到這了,更多相關(guān)Java Hadoop內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis返回值(resultType&resultMap)的具體使用
返回值屬性有兩種設(shè)置,一種是resultType,一種是resultMap,本文主要介紹了Mybatis返回值(resultType&resultMap)的具體使用,具有一定的參考價值,感興趣的可以了解一下2023-08-08
SpringBoot通過token實現(xiàn)用戶互踢功能(具體實現(xiàn))
所謂token,既用戶能夠在一定時間內(nèi)證明自己身份的一長串字符串,這篇文章主要介紹了SpringBoot通過token實現(xiàn)用戶互踢功能,需要的朋友可以參考下2024-04-04
Spring HttpMessageConverter的作用及替換解析
這篇文章主要介紹了Spring HttpMessageConverter的作用及替換解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏
本文主要介紹了淺談Java中ThreadLocal引發(fā)的內(nèi)存泄漏,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

