1. 程式人生 > >HDFS基本操作的API

HDFS基本操作的API

clas hello iterator 調用方法 fsd for 副本 == and

一、從hdfs下載文件到windows本地:

package com.css.hdfs01;

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;

/**
 * 從hdfs下載文件到windows本地
 *    
 * 註意:
 * 1.需要配置hadoop環境變量
 * 2.需要編譯好的winutils包
 
*/ public class HdfsClientDemo02 { public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException { // 1.加載配置 Configuration conf = new Configuration(); // 2.設置副本數 conf.set("dfs.replication", "2"); // 3.設置塊大小 conf.set("dfs.blocksize", "64m");
// 4.構造客戶端 FileSystem fs = FileSystem.get(new URI("hdfs://192.168.146.132:9000"), conf, "root"); // 5.hdfs數據下載到windows本地 fs.copyToLocalFile(new Path("/hdfs-site.xml"), new Path("c:/")); // 6.關閉資源 fs.close(); } }

二、hdfs常用的API:

package com.css.hdfs02;

import java.io.IOException;
import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test; /** * hdfs常用的API */ public class HdfsClientTest { FileSystem fs =null; @Before public void init() throws IOException, InterruptedException, URISyntaxException { // 1.加載配置 Configuration conf = new Configuration(); // 2.設置副本數 conf.set("dfs.replication", "2"); // 3.設置塊大小 conf.set("dfs.blocksize", "64m"); // 4.構造客戶端 fs = FileSystem.get(new URI("hdfs://192.168.146.132:9000/"), conf, "root"); } /** * 在hdfs中創建文件夾 * hdfs dfs -mkdir /文件夾名 */ @Test public void hdfsMkdir() throws IllegalArgumentException, IOException{ // 1.調用創建文件夾方法 fs.mkdirs(new Path("/hello")); // 2.關閉資源 fs.close(); } /** * 在hdfs中 移動/修改文件 * hdfs dfs -mv /hdfs路徑 /hdfs路徑 * hdfs dfs -cp /hdfs路徑 /hdfs路徑 */ @Test public void hdfsRename() throws IllegalArgumentException, IOException{ // 1.調用移動修改文件方法 fs.rename(new Path("/aa.txt"), new Path("/hello/aa.txt")); // 2.關閉資源 fs.close(); } /** * 在hdfs中 刪除文件/文件夾 * hdfs dfs -rm /文件名 * hdfs dfs -rm -r /文件夾名 */ @Test public void hdfsRm() throws IllegalArgumentException, IOException{ // 1.調用刪除文件方法 // 下面的一個參數的方法已棄用 // fs.delete(new Path("/aaaa.txt")); // 參數1:要刪除的路徑 參數2:是否遞歸刪除 fs.delete(new Path("/aaa111.txt"), true); // 2.關閉資源 fs.close(); } /** * 查詢hdfs下指定的目錄信息 */ @Test public void hdfsLs() throws IllegalArgumentException, IOException{ // 1.調用方法,返回遠程叠代器 RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/"), true); // 2.取叠代器數據 while (iter.hasNext()) { // 拿數據 LocatedFileStatus status = iter.next(); System.out.println("文件的路徑為:" + status.getPath()); System.out.println("塊大小為:" + status.getBlockSize()); System.out.println("文件長度為:" + status.getLen()); System.out.println("副本數量為:" + status.getReplication()); System.out.println("塊信息為:" + Arrays.toString(status.getBlockLocations())); System.out.println("==============================="); } // 3.關閉資源 fs.close(); } /** * 判斷文件還是文件夾 */ @Test public void hdfsFile() throws IllegalArgumentException, IOException{ // 1.展示狀態信息 FileStatus[] listStatus = fs.listStatus(new Path("/")); // 2.遍歷所有文件 for(FileStatus ls:listStatus){ if (ls.isFile()) { // 文件 System.out.println("文件-----f-----" + ls.getPath().getName()); }else { // 文件夾 System.out.println("文件夾-----d-----" + ls.getPath().getName()); } } } }

三、hdfs讀寫文件:

package com.css.hdfs03;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
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.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;

/**
 * hdfs讀寫文件
 */
public class ReadData {
    
    FileSystem fs =null;
    @Before
    public  void init() throws IOException, InterruptedException, URISyntaxException {
        // 1.加載配置
        Configuration conf = new Configuration();
        // 2.構造客戶端
        fs = FileSystem.get(new URI("hdfs://192.168.146.132:9000/"), conf, "root");
    }
    
    /**
     * 讀數據方式一
     */
    @Test
    public void testReadData1() throws IllegalArgumentException, IOException{
        // 1.拿到流
        FSDataInputStream in = fs.open(new Path("/a.txt"));
        byte[] buf = new byte[1024];
        in.read(buf);
        System.out.println(new String(buf));
        // 2.關閉資源
        in.close();
        fs.close();
    }
    
    /**
     * 讀數據方式二
     */
    @Test
    public void testReadData2() throws IllegalArgumentException, IOException{
        // 1.拿到流
        FSDataInputStream in = fs.open(new Path("/hdfs-site.xml"));
        // 2.緩沖流
        BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
        // 3.按行讀取
        String line = null;
        // 4.讀數據
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        // 5.關閉資源
        br.close();
        in.close();
        fs.close();
    }
    
    /**
     * 讀取hdfs中指定偏移量
     */
    @Test
    public void testRandomRead() throws IllegalArgumentException, IOException{
        // 1.拿到流
        FSDataInputStream in = fs.open(new Path("/hdfs-site.xml"));
        // 2.移動文件讀取指針到指定位置
        in.seek(14);
        byte[] b = new byte[5];
        // 3.從指針位置開始讀取數組b的長度個字節
        in.read(b);
        System.out.println(new String(b));
        // 4.關閉資源
        in.close();
    }
    
    /**
     * 在hdfs中寫數據方式一
     */
    @Test
    public void testWriteData() throws IllegalArgumentException, IOException{
        // 1.輸出流
        FSDataOutputStream out = fs.create(new Path("/windows.txt"), false);
        // 2.輸入流
        FileInputStream in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1012.txt");
        byte[] buf = new byte[1024];
        int read = 0;
        while ((read = in.read(buf)) != -1) {
            out.write(buf, 0, read);
        }
        // 3.關閉資源
        in.close();
        out.close();
        fs.close();
    }
    
    /**
     * 在hdfs中寫數據方式二
     */
    @Test
    public void testWriteData1() throws IllegalArgumentException, IOException{
        // 1.創建輸出流
        FSDataOutputStream out = fs.create(new Path("/love"));
        // 2.寫數據
        out.write("Areyouokmylove".getBytes());
        // 3.關閉資源
        IOUtils.closeStream(out);
        fs.close();
    }
}

HDFS基本操作的API