天天看點

Hadoop學習第三天

Hadoop 學習

  • 第三天
    • 一、實戰HDFS
    • 二、HDFS的高可靠性機制

第三天

一、實戰HDFS

HDFS主要提供了HDFS Web UI、HDFS Shell指令和HDFS API三種類型接口。

1.使用HDFS Web UI:

在浏覽器輸入NameNodeIP:50070就可以檢視到HDFS檔案系統的相關資訊了。

2.使用HDFS Shell指令:

使用Shell指令可以對HDFS進行操作,完成檔案的上傳,下載下傳,複制,檢視等等操作。指令統一入口為hadoop

3.使用HDFS Java API:

HDFS提供了豐富的Java程式設計接口可以實作非常多的功能,要使用HDFS的JAVA API需要先導入相關的jar包,當然也可以使用maven導入相關依賴,筆者這裡使用的是maven導入相關依賴,這裡筆者用的是hadoop2.8.5,這裡版本根據自己的做相關修改就可以了。

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.9.0</version>
    </dependency>
</dependencies>
           

上面的準備工作做好之後就可以開始了,開始之前介紹URL類,使用java.net.JAVA可以很友善的打開HDFS檔案系統中的檔案,資料以流的形式從遠端伺服器傳到本地,使用URL類的靜态方法setURLStreamHandlerFactory設定Hadoop檔案系統的URLStreamHandlerFactory,實作類FsUrlStreamHandlerFactory,此方法隻在程式啟動時使用,是以放在靜态語句塊中。具體程式如下:

package hadoop;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class HDFSURLReader {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    public static void main(String[] args) {
        InputStream stream = null;
        String hdfsUrl = "hdfs://localhost:9000/InputDataTest/hadoop-env.sh";
        try {
            stream = new URL(hdfsUrl).openStream();
            IOUtils.copyBytes(stream, System.out, 1024, false);
        }catch (IOException e){
            IOUtils.closeStream(stream);
        }
    }
}
           

通過以上代碼就可以讀取到檔案中的資料。

HDFS JAVA API最常用的類是import org.apache.hadoop.fs.FileSystem。定義了存取和管理HDFS檔案和目錄的方法。具體的常見方法自行搜尋,就不寫出來了,下面提供如何擷取FileSystem,上傳和下載下傳檔案,建立和删除目錄:

package hadoop;

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 java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.io.IOException;
import java.net.URL;

public class HdfsApi {
    FileSystem fileSystem = null; //定義一個fileSystem變量

    //擷取檔案系統對象
    public void getfileSystem() throws IOException, InterruptedException, URISyntaxException {
        fileSystem = FileSystem.get(
                new URI("hdfs://localhost:9000"),
                new Configuration(),
                "xiangtongtong"
        );
    }

    //下載下傳hdfs檔案到本地
    public void testDownload() throws IllegalArgumentException, IOException {
        FSDataInputStream in = fileSystem.open(new Path("/InputDataTest/hadoop-env.sh"));
        FileOutputStream out = new FileOutputStream("/Users/xiangtongtong/Desktop/jpress/hadoop.sh");
        IOUtils.copyBytes(in, out, 4096, true);
    }

    //上傳檔案到hdfs
    public void testUpload() throws IllegalArgumentException, IOException {
        FileInputStream in = new FileInputStream("/Users/xiangtongtong/Desktop/jpress/hadoop.sh");
        FSDataOutputStream out = fileSystem.create(new Path("/InputDataTest/hadoop.sh"), true);
        IOUtils.copyBytes(in, out, 4096, true);
    }
    //建立hdfs目錄
    public void testMakeDir() throws IllegalArgumentException,IOException{
        boolean isSuccess = fileSystem.mkdirs(new Path("/testdir"));
        System.out.println(isSuccess);
    }
    //删除hdfs目錄
    public void testDel() throws IllegalArgumentException,IOException{
        System.out.println(fileSystem.delete(
                new Path("testdir"),
                true
        ));
    }
}
           

下面提供一段測試代碼:

package hadoop;

import java.io.IOException;
import java.net.URISyntaxException;

public class test {
    public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
        HdfsApi hdfsApi = new HdfsApi();
        hdfsApi.getfileSystem();
        hdfsApi.testDownload();
    }
}
           

二、HDFS的高可靠性機制

高可靠性的目标之一就是即使在系統出錯的情況下也要保證資料存儲的正常。常見的三種錯誤是:Namenode節點出錯,DataNode節點出錯和資料出錯。