[Hadoopの]研究ノート(b)の動作原理をHDFSと

取ら学ぶポーター、ノート  実験棟のコース

 

1、HDFS原則

HDFS(Hadoopの分散ファイルシステム)は、分散ファイルシステムです。それは、耐障害性と高スループット大容量データストレージソリューションの高度を提供し、高い耐障害性を有しており、大規模なデータセットで使用するためのデータ・アクセス、理想の高スループットを提供します。

  • 高吞吐量访问ユーザーがアクセスしたときに、各ブロックHDFSは異なるラック上に分布し、HDFSは、最新およびサーバーのユーザーの最小量へのアクセスを使用して計算されます。ブロックが別のラックにバックアップされているので、それはスピードと効率が非常に高速で、もはや単一のデータ・アクセスではありません。また、HDFSは増加したアクセス帯域幅は、読み取りと書き込みのファイル、サーバークラスタから並行して読むことができます。
  • 高容错性システムの障害は、フェイルオーバーおよび耐障害性が重要になった後のデータを実行する方法、避けられません。様々なHDFSを介して、異なるサーバおよびデータチェック機能の物理的な場所に分散された複数のコピーを、データの信頼性を確保するため、バックグラウンド連続セルフテスト機能は、データの整合性が高いフォールトトレランスであってもよい提供します。
  • 线性扩展数の拡張だけでデータノードを追加するときのHDFSブロック情報は名前ノードに格納されているため、ブロックはデータノードに分散したファイル、システムは、人間の介入なしに、サービスの拡大を停止することなく行うことができます。

1.1 HDFSアーキテクチャ

画像記述情報

上に示したHDFS構造のマスターとスレーブである、名前ノード、セカンダリ名前ノードとデータノードを3つの役割を分割します。

  • NameNodeそこだけ1つのマスターノードであり、名前空間の管理は、データブロックのマッピング情報Hadoop1.X、設定とポリシークライアント要求のコピーをHDFS。
  • Secondary NameNode補助名前ノード、共有名前ノードの作業を定期的合併fsimageとfseditsと名前ノードにプッシュ、緊急事態が回復名前ノードを支援することができます。
  • DataNodeスレーブノードは、データが実際に格納され、読み取り、情報を記憶する名前ノードレポートにデータブロックを書き込みます。

2.2 HDFS読みます

画像記述情報

  1. クライアントは、open()メソッドの呼び出しファイルシステムオブジェクトがファイルの読み出しを開くことが望ま、HDFSのために、このオブジェクトは、分散ファイルシステムのインスタンスです。
  2. 同じブロックの繰り返し回数に応じて、ファイルの開始ブロックの位置を決定するために、名前ノードを呼び出すためにRPCを使用してDistributedFileSystemは上面近くクライアント側から、ソートHadoopクラスタ・トポロジに従う複数の場所を返します。
  3. FSDataInputStreamオブジェクトが返される最初の2つのステップは、DFSInputStreamを容易に管理することができるオブジェクトDFSInputStreamにカプセル化され、データノード名前ノードストリームは、クライアントは、入力ストリームのread()メソッドを呼び出します。
  4. ;繰り返し、()メソッドを読み出すデータノードへのクライアントからデータを転送することができると呼ばれるデータストリームを介して、データノードに接続されたすぐに最も近いファイルの開始ブロックに格納DFSInputStreamデータノードアドレス
  5. ブロックの終わりに達した場合、DFSInputStreamは、次の最良のブロックのデータノードのためのデータノードおよび外観への接続を閉じ、これらの操作は、クライアントに対して透過的、ちょうど連続ストリームを読んでから、クライアントの観点。
  6. クライアントは、ファイルの読み込みをクローズする権利FSDataInputStreamコールclose()メソッドで、読み取りを完了します。

 

2.3 HDFSの書き込み動作

 

画像記述情報

  1. create()メソッドを呼び出すことによってDistributedFileSystemクライアントは、新しいファイルを作成します。
  2. RPCコールによってDistributedFileSystemは、ファイルが存在するなど、クライアントまたは許可なしに作成およびようにするために確認のさまざまなことを行います名前ノードの前に作成されたブロック関連付けられていない新しいファイル名前ノードを作成します。チェックした場合、名前ノードは、それ以外の場合はIOの例外がスローされます、新しいファイルを作成するためのレコードを記録します。
  3. 最初の2つのオブジェクトの戻りFSDataOutputStream後、そのファイルを読み取るときと同様にFSDataOutputStream DFSOutputStreamにパッケージされ、DFSOutputStream名前ノード座標とデータノードができます。スタートクライアントDFSOutputStreamにデータを書き込む、DFSOutputStreamデータは小さなパケットをカットし、内部キューに書き込まれますが、「データ・キュー」(データキュー)と呼ばれます。
  4. DataStreamerは、次の3つの最も適したデータノードを見つけ、許容可能なデータキュー、その最初の問い合わせの名前ノード、このような繰り返しの回数としてデータノード数年、新しいブロックに最適な店舗が3であるに対処するだろう、彼らはパイプライン内に配置入れます。パケットDataStreamer最初のデータノード導管内のキュー出力、パケットデータノードに第一出力データノード再び第二、など。
  5. DFSOutputStreamは、時間内のすべてのデータノードのパイプラインを既に受信し、AKC Queneは、対応するパケットのパケットアウトを削除すると述べていたときに、応答のためのデータノードの待ち時間は、受信したパケットでも、AckをQueneと呼ばれる構成キューがあります。
  6. クライアントは、ファイナライズストリームの後にデータを書き込むための完全なclose()メソッドを呼び出します。
  7. 残りのブラシでパッケージして、パイプライン情報のAckを待つDataStreamer、ACKが最後の1、通知名前ノード完了としてマークされたファイルの後に受け取りました。

2.4 HDFSよく使用するコマンド

1.のHadoop FS

hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst  # 与hadoop fs -put 功能类似
hadoop fs -moveFromLocal localsrc dst  # 将本地文件上传到 hdfs,同时删除本地文件

2. Hadoopのdfsadmin

HDFSはdfsadminのクライアントを実行しています

# 报告文件系统的基本信息和统计信息
hadoop dfsadmin -report

hadoop dfsadmin -safemode enter | leave | get | wait 
# 安全模式维护命令。安全模式是 Namenode 的一个状态,这种状态下,Namenode 
# 1. 不接受对名字空间的更改(只读)
# 2. 不复制或删除块
# Namenode 会在启动时自动进入安全模式,当配置的块最小百分比数满足最小的副本数条件时,会自动离开安全模式。安全模式可以手动进入,但是这样的话也必须手动关闭安全模式。

3. Hadoopのfsckの

ファイル名を指定して実行HDFSファイルシステムチェックツール。

使用法:

hadoop fsck [GENERIC_OPTIONS] <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

4. start-balancer.sh

ApacheのHDFSのAPIは、視聴のための公式ウェブサイトに関連することができます。

画像記述情報

 

3、テストケース

コンパイルではとHadoopクラスタの例3.2を実行して、読み込みの「Definitive Guideのは、」ファイルの内容をHDFS。

コードを実行している3.1

import java.io.InputStream;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat {
    public static void main(String[] args) throws Exception {
        String uri = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem. get(URI.create (uri), conf);
        InputStream in = null;
        try {
            in = fs.open( new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

3.2実装

コードディレクトリの作成3.2.1

ローカルホスト名のHadoopの設定、shiyanlouはときにsudoユーザーのパスワードを入力する必要があります。Hadoopのは、最後の行の末尾に追加されます。

sudo vim /etc/hosts
# 将hadoop添加到最后一行的末尾,修改后类似:(使用 tab 键添加空格)
# 172.17.2.98 f738b9456777 hadoop
ping hadoop

Hadoopのを起動するには、次のコマンドを使用します

cd /app/hadoop-1.1.2/bin
./start-all.sh
jps # 查看启动的进程,确保 NameNode 和 DataNode 都有启动

/app/hadoop-1.1.2カタログで次のコマンドを使用して、MyClassの入力ディレクトリを確立します。

cd /app/hadoop-1.1.2
rm -rf myclass input
mkdir -p myclass input

画像記述情報

HDFSにファイルをアップロード確立3.2.2例

/app/hadoop-1.1.2/inputディレクトリを入力し、そのディレクトリquangle.txtにファイルを作成

cd /app/hadoop-1.1.2/input
touch quangle.txt
vi quangle.txt

言います:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

画像記述情報

HDFS内のディレクトリ/ CLASS4を作成するには、次のコマンドを使用します

hadoop fs -mkdir /class4
hadoop fs -ls /

说明:なし、エラーのHadoopコマンドの場合には、再び行いますsource hadoop-env.sh同様にその後の実験。

(あなたが直接のHadoopコマンドを使用する必要がある場合は、必要性が/app/hadoop-1.1.2パスパスに追加します)

画像記述情報

例としては、HDFS / CLASS4フォルダにファイルをアップロード

cd /app/hadoop-1.1.2/input
hadoop fs -copyFromLocal quangle.txt /class4/quangle.txt
hadoop fs -ls /class4

画像記述情報

3.2.3ローカル環境の設定

下に示すように、/app/hadoop-1.1.2/confディレクトリ構成のHadoop-env.sh:

cd /app/hadoop-1.1.2/conf
sudo vi hadoop-env.sh

HADOOP_CLASPATH変数の値を追加し、後の設定値/app/hadoop-1.1.2/myclassは、コンフィギュレーション・ファイルをコンパイルし、構成を検証します

export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass

画像記述情報

3.2.4ライト・コード

次のようにディレクトリに/App/hadoop-1.1.2/myclass、そのディレクトリ内のFileSystemCat.javaコードファイルの設立は、コマンドは次のとおりです。

cd /app/hadoop-1.1.2/myclass/
vi FileSystemCat.java

コードの内容を入力します。

画像記述情報

3.2.5コンパイルされたコード

/app/hadoop-1.1.2/myclassディレクトリで、次のコードをコンパイルするコマンドを使用します。

javac -classpath ../hadoop-core-1.1.2.jar FileSystemCat.java

画像記述情報

コンパイルされたコードを使用して3.2.6は、HDFSファイルを読み込み

HDFSの/class4/quangle.txtの内容を読み取るために、次のコマンドを使用:

hadoop FileSystemCat /class4/quangle.txt

画像記述情報

 

4、試験例2

ローカルファイルシステムではファイルの内容を読み、新しいファイルとしてHDFSの101-120バイトに書き込むためのプログラムを書き、約100バイトのテキストファイルを生成します。

4.1実装コード

//注意:在编译前请先删除中文注释!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class LocalFile2Hdfs {
    public static void main(String[] args) throws Exception {

        // 获取读取源文件和目标文件位置参数
        String local = args[0];
        String uri = args[1];

        FileInputStream in = null;
        OutputStream out = null;
        Configuration conf = new Configuration();
        try {
            // 获取读入文件数据
            in = new FileInputStream(new File(local));

            // 获取目标文件信息
            FileSystem fs = FileSystem.get(URI.create(uri), conf);
            out = fs.create(new Path(uri), new Progressable() {
                @Override
                public void progress() {
                    System.out.println("*");
                }
            });

            // 跳过前100个字符
            in.skip(100);
            byte[] buffer = new byte[20];

            // 从101的位置读取20个字符到buffer中
            int bytesRead = in.read(buffer);
            if (bytesRead >= 0) {
                out.write(buffer, 0, bytesRead);
            }
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }
    }
}

4.2実装

4.2.1ライト・コード

次のようにディレクトリに/App/hadoop-1.1.2/myclass、そのディレクトリ内のLocalFile2Hdfs.javaコードファイルの設立は、コマンドは次のとおりです。

cd /app/hadoop-1.1.2/myclass/
vi LocalFile2Hdfs.java

コードの内容を入力します。

画像記述情報

4.2.2コンパイルされたコード

/app/hadoop-1.1.2/myclassディレクトリで、次のコードをコンパイルするコマンドを使用します。

javac -classpath ../hadoop-core-1.1.2.jar LocalFile2Hdfs.java

画像記述情報

4.2.3テストファイルを作成します

そのディレクトリ内のディレクトリ、ビルドlocal2hdfs.txtファイルに/App/hadoop-1.1.2/input

cd /app/hadoop-1.1.2/input/
vi local2hdfs.txt

言います:

Washington (CNN) -- Twitter is suing the U.S. government in an effort to loosen restrictions on what the social media giant can say publicly about the national security-related requests it receives for user data.
The company filed a lawsuit against the Justice Department on Monday in a federal court in northern California, arguing that its First Amendment rights are being violated by restrictions that forbid the disclosure of how many national security letters and Foreign Intelligence Surveillance Act court orders it receives -- even if that number is zero.
Twitter vice president Ben Lee wrote in a blog post that it's suing in an effort to publish the full version of a "transparency report" prepared this year that includes those details.
The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.

画像記述情報

HDFSにファイルの内容をアップロードするためにコンパイルされたコードを使用して4.2.4

新しいファイルにHDFS 101-120に書かれた最初のバイトの内容を読み取るためのコマンドを次のようLocal2hdfs:

cd /app/hadoop-1.1.2/input
hadoop LocalFile2Hdfs local2hdfs.txt /class4/local2hdfs_part.txt
hadoop fs -ls /class4

画像記述情報

4.2.5検証が成功したかどうか

local2hdfs_part.txtコンテンツを読むためには、次のコマンドを使用します。

hadoop fs -cat /class4/local2hdfs_part.txt

画像記述情報

 

図5に示すように、試験例3

試験例2は、HDFSは、約100バイトのテキストファイルを生成し、逆の操作でファイルを読み取るためのプログラムを作成し、新しいファイルになるために、ローカル・ファイル・システム101-120の最初のバイトの内容を書き込みます。

5.1実装コード

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class Hdfs2LocalFile {
    public static void main(String[] args) throws Exception {

        String uri = args[0];
        String local = args[1];

        FSDataInputStream in = null;
        OutputStream out = null;
        Configuration conf = new Configuration();
        try {
            FileSystem fs = FileSystem.get(URI.create(uri), conf);
            in = fs.open(new Path(uri));
            out = new FileOutputStream(local);

            byte[] buffer = new byte[20];
            in.skip(100);
            int bytesRead = in.read(buffer);
            if (bytesRead >= 0) {
                out.write(buffer, 0, bytesRead);
            }
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }   
    }
}

5.2実装

5.2.1ライト・コード

次のようにディレクトリに/App/hadoop-1.1.2/myclass、そのディレクトリ内のHdfs2LocalFile.javaコードファイルの設立は、コマンドは次のとおりです。

cd /app/hadoop-1.1.2/myclass/
vi Hdfs2LocalFile.java

コードの内容を入力します。

画像記述情報

5.2.2コンパイルされたコード

/app/hadoop-1.1.2/myclassディレクトリで、次のコードをコンパイルするコマンドを使用します。

javac -classpath ../hadoop-core-1.1.2.jar Hdfs2LocalFile.java

画像記述情報

5.2.3テストファイルを作成します

そのディレクトリ内のディレクトリ、ビルドhdfs2local.txtファイルに/App/hadoop-1.1.2/input

cd /app/hadoop-1.1.2/input/
vi hdfs2local.txt

言います:

The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.
"It's our belief that we are entitled under the First Amendment to respond to our users' concerns and to the statements of U.S. government officials by providing information about the scope of U.S. government surveillance -- including what types of legal process have not been received," Lee wrote. "We should be free to do this in a meaningful way, rather than in broad, inexact ranges."

画像記述情報

/app/hadoop-1.1.2/inputディレクトリでHDFS / CLASS4 /フォルダにファイルをアップロードするには:

hadoop fs -copyFromLocal hdfs2local.txt /class4/hdfs2local.txt
hadoop fs -ls /class4/

画像記述情報

5.2.4コンパイルされたコードは、ファイルシステムへのファイルの内容から出力HDFS

Hdfs2local.txt新しいファイルにローカルファイルシステムに101-120バイト書き込みの内容を読み取るために次のコマンドを実行します。

hadoop Hdfs2LocalFile /class4/hdfs2local.txt hdfs2local_part.txt

画像記述情報

5.2.5検証が成功したかどうか

hdfs2local_part.txtコンテンツを読むためには、次のコマンドを使用します。

cat hdfs2local_part.txt

画像記述情報

公開された44元の記事 ウォン称賛16 ビュー10000 +

おすすめ

転載: blog.csdn.net/YYIverson/article/details/101109081