HDFS(a)の構造とファイルの読み取りとプロセスを書きます

Hadoopのは、3つの主要コンポーネントがありますリソーススケジューリングの責任糸は、次の記事は、私が一つずつこれらのコンポーネントを導入する一方HDFS、MapReduceの糸を、HDFSは大容量のファイルストレージの問題に責任がある、MapReduceは、大規模データ計算を担当しています。今日はのは、プロセスアーキテクチャとHDFSの文書を読み、書くことについて話しましょう。

全体的なアーキテクチャ

目的HDFSは、サーバーがそれを処理することはできませんので、我々はこの目標を達成するために、クラスタを必要とし、ファイルの大規模なデータセットを格納するように設計されています。ユーザがファイルを格納する必要がある場合、このファイルはHDFSは、(バージョン2.x、各データブロック128Mのデフォルトのサイズで)データの小ブロックに切断し、各データブロックのために保存されますすべてのデータブロックが正常に保存された後、そのデータはHDFSに保存されていることを示しています。HDFSは、システムが高いフォールトトレランスを有し、各データブロックのバックアップ操作を行います。

HDFSの設計目標の理解、我々はその全体的なアーキテクチャを見て、下の今述べたブロック(ブロック)を除いて、ダウン公式サイトのHADOOPから控除される画像は、2つの重要な役割があります。名前ノードそして、データノードそのデータノードデータノードは、定義により、それらは、実際のデータ記憶ノード(各ノードがサーバである)です。名前ノードそれ?これは主に、などのメタデータ情報を維持しています。

  • ファイルシステム全体のディレクトリとその階層関係
  • ファイルとディレクトリのアクセス権の所有者
  • で構成されたブロックと、各データブロックの各ファイルの名前

HDFSアーキテクチャ

しかし、ということが注目されるべきである名前ノードは、各データブロックのための情報を扱っていませんが、ディスクに永続化されたデータは、よりメモリから読み出されているので、この情報は、名前ノードの開始後に様々なデータノードからの内部メモリに取得して保存されます間違いなく大幅にファイルを読み取るために、クライアントのパフォーマンスが向上し、ディスクからはるかに高速にデータを読み込みます。

節以下参照:https://www.cnblogs.com/smartloli/p/4342340.html

しかし、この絵は、HDFSはもう出てマークされ、重要な役割---セカンダリ名前ノードはありませんが、この男はそれをしているのですか?HDFSに書き込まれているこのファイルには、2つの文書--- fsimageおよびプロセスに関与編集を言及する必要があります。名前ノードが起動したときfsimageは、ファイルシステム全体のスナップショットです編集は、システムの再起動時に、システム全体の順序を変更、開始名前ノードされた後、編集がfsimageファイルに組み込まれます。名前ノードは、長い時間のために実行されますので、データが書き込まれたときには、大きいファイルは非常に大きくなることができます編集し、それは以下の質問に表示されます。

  • このファイルを管理する方法、ファイルが非常に大きくなることができます編集?
  • fsimageファイルにマージするために多くの変更があるので、名前ノードの再起動は、長い時間がかかります
  • 名前ノードが撃墜し、古いfsimageファイルのタイムスタンプ(のこの時点でも変化の損失を考慮してこれだけのメモリに失われたものは、ファイルの編集に書き込まれていない、特に大規模ではありませんので、我々は、変更の多くを失った場合変更)。

上記課題を解決するためには、セカンダリ名前ノードが登場しました。これは、定期的に名前ノードは、自分の意志の名前ノードにコピーし、新しいfsimageファイルたら、fsimageに編集ファイル、および最新情報を取得するでしょう。このfsimageスタートアップの名前ノードの次の直接使用、統合の必要性を排除し、ファイルのfsimageプロセスを編集します。これは、HDFSにおける二次名前ノードの役割です。

プロセス分析を読み書き

我々はHDFS操作用のJava APIを使用して、コード分析を結合します次の読み取りと書き込みプロセスは、追加、Mavenの環境を使用してHDFSのAPIを使用することができるのpom.xmlにhdaoopクライアントを依存している非常に簡単です。

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>#{hadoop.version}</version>
</dependency>

データフローを読みます

次のようにコードHDFSファイルを読みます:

public static void main(String[] args) throws Exception{
    Configuration conf = new Configuration();
    /*
     * hadoop 可以跟多种文件系统交互,根据下图,我们也可以看到 FileSystem 有多种实现
     * 为了让 hadoop 知道是与什么文件系统进行交互的,我们需要在配置文件中指定。
     */
    conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

    String uri = "hdfs://hadoop-master:9000/e.txt";
    // 获取文件系统,这里 FileSystem 具体实现为上面指定的 DistributedFileSystem
    FileSystem fs = FileSystem.get(URI.create(uri), conf);

    OutputStream out ;
    FSDataInputStream in = null;
    try {
        out = new FileOutputStream("e.txt");
        in = fs.open(new Path(uri));
        
        // 读取文件到本地
        byte[] buf = new byte[4096];
        for(int bytesRead = in.read(buf); bytesRead >= 0; bytesRead = in.read(buf)) {
            out.write(buf, 0, bytesRead);
        }
    } finally {
        IOUtils.closeStream(in);
    }
}

HDFSファイルシステム

上記のコードによると、私たちは大体ファイルを読み込むのHDFS過程を推測することができます。

  1. 获取交互的文件系统(FileSystem),交互的文件系统需要我们在配置文件中指定。FileSystem 的 HDFS 实现类是 DistributedFileSystem(步骤一)。
  2. DistributedFileSystem 通过远程过程调用(RPC)来调用 namenode,nanenode 将包含文件数据块的 datanode 返回给客户端,并根据 datanode 与客户端的距离来排序(步骤二)。
  3. DistributedFileSystem 返回 FSDataInputStream 对象,用来读取数据。客户端通过调用 read 方法,从最近的一个 datanode 读取每个数据块的数据,当读取完一个数据块之后,接着查找包含该数据块且离得最近的 datanode 进行读取,直到读取完最后一个数据块,这些对用户来说都是透明的。(步骤三、步骤四)
  4. 当整个文件读取完毕之后,调用 close 方法,关闭与 nanode 和 datanode 的连接。

HDFSファイル読み込みの流れ

写数据流程

public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

    String uri = "hdfs://192.168.1.150:9000/friend/test.txt";
    FileSystem fs = FileSystem.get(URI.create(uri), conf);

    InputStream in = null;
    FSDataOutputStream out = null;
    try {
        in = new FileInputStream("e-friend.txt") ;
        out = fs.create(new Path(uri));
        byte[] buf = new byte[4096];

        for(int bytesRead = in.read(buf); bytesRead >= 0; bytesRead = in.read(buf)) {
            out.write(buf, 0, bytesRead);
        }
    }  finally {
        if (in != null)
            in.close();
        if (out != null)
            out.close();
    }
}

读写数据的代码相似,但是写数据的过程更加复杂,我们一步一步来看。

  1. 第一步还是一样的,初始化 FileSystem(步骤一),之后 FileSystem 调用 create 方法来创建文件,此时通过远程过程调用 namenode,namenode 会检查以确保这个文件不存在以及客户端有新建该文件的权限,如果检查通过 namenode 会在 edits 记录该操作(步骤二)。
  2. ファイルシステムは、通信データノードと名前ノードを処理DFSoutputStreamオブジェクトを返します。場合(ステップc)クライアントからの書き込みデータを、内部(データキュー)に格納されたキューへのデータパケットにDFSOutputStreamそれを、DFSOutputStreamは、選択された第1のデータブロックを記憶するように適合された各ブロックを処理する場合このグループは、HDFS 3のコピー数を仮定し、データノードの管を形成するデータノードグループ、第1の導管データノードと、データブロックの送信DFSOutputStream、ブロックは、データを記憶し、第二に送信するデータノードデータノードなど(ステップIV)。
  3. また、データキューの後、DFSOutputStream確認キューは、すべての受信確認をパイプラインをデータノードに格納、確認したキューから(ステップE)パケットを削除します。
  4. クライアントの書き込みの後、近く呼処理(ステップf)データ・ストリーム(DFSOutputStream)。
  5. 完成名前ノードのファイル書き込みを(セブンステップ)に通知します。

HDFSのファイル書き込み処理

おすすめ

転載: www.cnblogs.com/firepation/p/11405056.html