Hadoop の概要 (オン)

最近、私は大規模モデルの分散トレーニングとストレージを研究しています。私自身の分散関連の基盤は比較的弱いです。深層学習に基づくすべてのアーキテクチャは伝統から来ています。以前のビッグ データ用の分散ソリューション、つまり Hadoop についてまとめました。

なぜHadoopなのか

Hadoop の役割は非常に単純で、複数のコンピューターのクラスター環境で統合された安定したストレージおよびコンピューティング環境を作成し、他の分散アプリケーション サービスにプラットフォーム サポートを提供することです。

Hadoop はある程度まで複数のコンピュータを 1 台のコンピュータに編成し (同じことを実行します)、HDFSはこのコンピュータのハードディスクに相当し、MapReduceはこのコンピュータのCPUコントローラに相当します。

トラブル

Hadoop はクラスター用に設計されたソフトウェアであるため、その使用方法を学習する際には、必然的に複数のコンピューター上で Hadoop を構成する状況に遭遇することになり、これは学習者にとって多くの障害となります。

  1. 高価なコンピュータークラスター。複数のコンピュータで構成されるクラスタ環境には、高価なハードウェアが必要です。
  2. 導入と保守が難しい。同じソフトウェア環境を多くのコンピュータに展開するのは多大な労力がかかり、柔軟性が非常に低く、環境が変わった後に再展開するのは困難です。

これらの問題を解決するために、私たちはDocker という非常に成熟した方法を持っています。

Dockerは、複数の「仮想マシン」(コンテナ)を仮想マシンのように実行し、クラスタを形成できるコンテナ管理システムです。仮想マシンはコンピュータを完全に仮想化するため、多くのハードウェア リソースを消費し、非効率的です。Docker は独立した再現可能な動作環境のみを提供します。実際には、コンテナ内のすべてのプロセスは依然としてホスト上のカーネルで実行さますそのため、ホスト上のプロセスとほぼ同じ効率 (ほぼ 100%) になります。

Hadoopの全体設計

Hadoop フレームワークは、コンピュータ クラスターのビッグ データ処理のためのフレームワークであるため、複数のコンピュータに展開できるソフトウェアである必要があります。Hadoop ソフトウェアがデプロイされているホストは、ソケット(ネットワーク) を介して通信します。

Hadoop は主に HDFS と MapReduce の 2 つのコンポーネントで構成されており、HDFS はデータの配布と保存を担当し、MapReduce はデータのマッピングと処理、および処理結果の集計を担当します。

Hadoop フレームワークの最も基本的な原理は、大量のデータの処理を高速化するために、同時に動作する多数のコンピュータを使用することです。たとえば、検索エンジン会社が標準化されていない数兆個のデータからホットワードをフィルタリングして要約したい場合、情報を処理するために多数のコンピューターを編成してクラスターを形成する必要があります。従来のデータベースを使用してこの情報を処理すると、データの処理に長い時間と大きな処理スペースが必要になります。この規模は 1 台のコンピュータでは困難になります。主な困難は、多数のハードウェアと高度なハードウェアを整理することにあります。コンピュータへの統合が早まると、たとえうまく実装できたとしても、高額なメンテナンス費用が発生します。

Hadoop は、コンピュータ クラスタとして編成された数千台もの安価な量産コンピュータ上で実行できます。

Hadoop クラスターはデータを効率的に保存し、処理タスクを分散できるため、多くの利点があります。第一に、コンピュータの構築と保守のコストを削減できること、第二に、アプリケーション層開発用のクラスタ フレームワークは、コンピュータのハードウェア障害が発生することを前提としているため、コンピュータにハードウェア障害が発生しても、コンピュータシステム全体に致命的な影響を与えることはありません。失敗します

HDFS

Hadoop 分散ファイル システム、Hadoop 分散ファイル システム、略して HDFS。

HDFS は、クラスターにファイルを保存するために使用されます。HDFS が使用する中心的なアイデアは、大きなファイルを保存できる Google の GFS アイデアです。

サーバー クラスターでは、ファイル ストレージの効率性と安定性が求められることが多く、HDFS はこれら 2 つの利点を同時に実現します。

HDFS の効率的なストレージは、リクエストを個別に処理するコンピューターのクラスターによって実現されます。ユーザー (半分はバックエンド プログラム) がデータ ストレージ リクエストを送信するため、サーバーが他のリクエストを処理していると応答することが多く、これがサービス効率が低下する主な理由です。ただし、応答サーバーがデータ サーバーをユーザーに直接割り当て、ユーザーがデータ サーバーと直接対話する場合、効率ははるかに速くなります。

データ ストレージの安定性は、多くの場合「さらにいくつかのコピー」によって実現されます。これは HDFS でも使用されます。HDFSの記憶単位はブロック(Block)であり、ファイルは複数のブロックに分割されて物理ストレージに格納される場合があります。したがって、HDFS では、設定者の要件に従ってデータ ブロックのコピーを n 個コピーし、それらを異なるデータ ノード (データを保存するサーバー) に保存することが多く、データ ノードに障害が発生してもデータは失われません。

HDFS ノード

HDFS はさまざまなコンピューター上で実行され、データの保存専用のコンピューターもあれば、他のコンピューターにデータを保存するよう指示する専用のコンピューターもあります。ここで言う「コンピュータ」は、クラスタ内のノードと呼ぶことができます。

ネーミングノード (NameNode)

NameNode (NameNode) は、他のノードのストレージを指示するために使用されるノードです。「ファイルシステム」(File System、FS)には、ファイルパスに従ってファイルにマッピングする機能が必要であり、名前付きノードは、これらのマッピング情報を保存し、マッピングサービスを提供するために使用されるコンピュータであり、システムの「管理者」として機能します。 HDFS システム全体の役割であるため、HDFS クラスター内の名前付きノードは1 つだけです。

データノード (DataNode)

DataNodeデータ ブロックを格納するために使用されるノードファイルが名前付きノードによって認識され、ブロックに分割されると、そのファイルは割り当てられたデータ ノードに保存されます。データノードはデータの保存とデータの読み書きの機能を持ち、保存されるデータブロックはHDFSストレージの基本単位であるハードディスクの「セクタ」の概念に似ています

セカンダリ ネームノード

セカンダリ ネームノード (セカンダリ ネームノード) エイリアス「セカンダリ ネームノード」は、ネームノードの秘書」です。この説明は、名前付きノードが動作し続ける能力に関係なく、名前付きノードの動作を置き換えるものではないため、非常に適切です。これは主に、ネームノードのオフロード、ネームノードの状態のバックアップ、ネームノードから要求された場合の管理作業の実行を担当します。また、NameNode がダウンした場合に、NameNode を復元するためのバックアップ データを提供することもできます。複数のサブ名前付きノードが存在する場合があります。

画像の説明を追加してください

MapReduce

MapReduce の意味は、その名前と同じくらい明白です: Map and Reduce (マッピングとリダクション)。

ビッグデータ処理

大量のデータの処理は、「理由は単純だが、実装は複雑」の典型的な問題です。「実装が複雑になる」主な理由は、従来の方法で大量のデータを処理すると、ハードウェア リソース (主にメモリ) が不足することです。

ここでテキストの一部 (この文字列は実際の環境では 1 PB 以上の長さになる可能性があります) があるので、単純な「数値文字」統計を実行します。つまり、このテキストに出現したすべての文字の数を数えます。 :

AABAABCABCABCDE

統計後の結果は次のようになります。
A 5
B 4
C 3
D 2
E 1
統計のプロセスは実際には非常に単純です。つまり、文字が読み取られるたびに、同じ文字がテーブル内にすでに存在するかどうかを確認する必要があります。そうでない場合は、レコードを追加してレコード値を 1 に設定し、レコードがある場合はレコード値を直接 1 増やします。

しかし、ここで統計対象を「文字」から「単語」に変更すると、サンプルサイズが一瞬にして非常に大きくなり、数十億のユーザーが使用する「単語」をコンピュータがカウントするのが困難になる可能性があります。一年。

この場合、この作業を完了する方法はまだあります。まずサンプルを 1 台のコンピュータで処理できるセクションに分割し、次にセクションごとに統計を実行し、統計が実行されるたびに統計結果のマッピングを規定します。処理とは、統計結果をより大きなデータ結果に結合し、最終的に大規模なデータ削減を完了することです。

上記の場合、仕上げ作業の最初の段階はデータの分類と並べ替えである「マッピング」ですが、これまでのところ、ソース データよりもはるかに小さい結果が得られています。通常、第 2 段階の作業はクラスターによって行われます。データを整理した後、データを全体として要約する必要があります。結局、複数のノードのマッピング結果の分類が重複する可能性があります。このプロセスでのマッピングの結果は、さらに取得可能な統計結果に変換されます。

MapReduce の概念

例:

5 つのファイルがあり、各ファイルに都市の名前と、異なる測定日にその都市で記録された対応する気温を記録する 2 つの列があるとします。都市名がキー(Key)、気温が値(Value)となります。例: (アモイ、20)。ここで、すべてのデータから各都市の最高気温を見つけたいとします (各ファイルに同じ都市が表示される場合があることに注意してください)。

MapReduce フレームワークを使用すると、これを 5 つのマップ タスクに分割できます。各タスクは 5 つのファイルのうち 1 つの処理を担当します。各マップ タスクは、ファイル内の各データを検査し、ファイル内の各都市の最高気温を返します。

たとえば、次のデータの場合:

温度
アモイ 12
上海 34
アモイ 20
上海 15
北京 14
北京 16
アモイ 24

たとえば、MapReduce を国勢調査と考えることができ、国勢調査局は各都市に数人の調査員を派遣します。各都市の国勢調査員はその都市の人口の一部を数え、結果は集計されて首都に戻されます。首都では、各都市の統計が1 つのカウント (各都市の人口) に削減され、国の総人口が決定されます。この個人と都市のマッピングは並列化され、結果が結合されます (Reduce)。これは、1 人の担当者を派遣して国内全員を継続的に数えるよりもはるかに効率的です。

Hadoop の 3 つのモード: スタンドアロン モード、擬似クラスタ モード、クラスタ モード
  • スタンドアロン モード: Hadoop は、単一のコンピューター上で MapReduce タスクを実行できるライブラリとしてのみ存在し、開発者が学習および実験環境を構築するためにのみ使用されます。
  • 擬似クラスター モード: このモードでは、Hadoop はデーモン プロセスの形式で単一のマシン上で実行されます。これは通常、開発者が学習および実験環境を構築するために使用されます。
  • クラスター モード: このモードは Hadoop の実稼働環境モードです。つまり、これは Hadoop が実稼働レベルのサービスを提供するために実際に使用するモードです。

HDFS の構成と起動

HDFS はデータベースに似ており、デーモン プロセスとして起動されます。HDFS を使用するには、HDFS クライアントを使用してネットワーク (ソケット) 経由で HDFS サーバーに接続し、ファイル システムの使用を実現する必要があります。

Hadoop の基本環境を設定し、コンテナ名をhadoop_singleとして起動し、コンテナに入ります。

コンテナーに入ったら、Hadoop が存在することを確認します。

hadoop version

結果に Hadoop のバージョン番号が表示される場合は、Hadoop が存在します。

次に正式な手順に移ります。

新しいHadoopユーザーを作成する

hadoop という名前の新しいユーザーを作成します。

adduser hadoop

ユーザーのパスワードと権限管理を変更するための小さなツールをインストールします。

yum install -y passwd sudo

Hadoop ユーザーのパスワードを設定します。

passwd hadoop

次の 2 回はパスワードを入力します。必ず覚えておいてください。

hadoop インストール ディレクトリの所有者を hadoop ユーザーに変更します。

chown -R hadoop /usr/local/hadoop

次に、テキスト エディタを使用して /etc/sudoers ファイルを変更します。

root    ALL=(ALL)       ALL

の後に行を追加

hadoop  ALL=(ALL)       ALL

その後、コンテナから出ます。

コンテナ hadoop_single を閉じて、hadoop_proto をミラーリングするために送信します。

docker stop hadoop_single
docker commit hadoop_single hadoop_proto

新しいコンテナ hdfs_single を作成します。

docker run -d --name=hdfs_single --privileged hadoop_proto /usr/sbin/init

このようにして、新しいユーザーが作成されます。

HDFSを開始する

次に、新しく作成したコンテナを入力します。

docker exec -it hdfs_single su hadoop

これで Hadoop ユーザーになっているはずです。

whoami

「Hadoop」が表示されるはずです

SSH キーを生成します。

ssh-keygen -t rsa

ここで、生成が終了するまで Enter キーを押し続けることができます。

次に、生成されたキーを信頼リストに追加します。

ssh-copy-id hadoop@172.17.0.2

コンテナの IP アドレスを表示します。

ip addr | grep 172

したがって、コンテナの IP アドレスは 172.17.0.2 であることがわかりますが、実際の IP はこれとは異なる可能性があります。

HDFS を開始する前に、いくつかの簡単な構成を作成します。すべての Hadoop 構成ファイルは、インストール ディレクトリの下の etc/hadoop サブディレクトリに保存されているため、このディレクトリに入ることができます。

cd $HADOOP_HOME/etc/hadoop

ここでは、core-site.xml と hdfs-site.xml の 2 つのファイルを変更します。

core-site.xml で、タグの下に属性を追加します。

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://<你的IP>:9000</value>
</property>

hdfs-site.xml のタグの下にプロパティを追加します。

<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

フォーマットファイルの構造:

hdfs namenode -format

次に、HDFS を開始します。

start-dfs.sh

起動は 3 つのステップに分かれており、それぞれ NameNode、DataNode、セカンダリ NameNode を起動します。

jps を実行して Java プロセスを表示します

ここまでで、HDFS デーモン プロセスが確立されましたが、HDFS 自体に HTTP パネルがあるため、ブラウザーから http://コンテナ IP:9870/ にアクセスして、HDFS パネルと詳細情報を表示できます。

HDFS の用途

HDFS シェル

hdfs_single コンテナーに戻り、次のコマンドを使用して HDFS を操作します。

# 显示根目录 / 下的文件和子目录,绝对路径
hadoop fs -ls /
# 新建文件夹,绝对路径
hadoop fs -mkdir /hello
# 上传文件
hadoop fs -put hello.txt /hello/
# 下载文件
hadoop fs -get /hello/hello.txt
# 输出文件内容
hadoop fs -cat /hello/hello.txt

HDFS の最も基本的なコマンドは上で説明しましたが、従来のファイル システムでサポートされている操作は他にも多数あります。

HDFS API

HDFS は多くのバックエンド プラットフォームでサポートされており、現在、公式ディストリビューションには C/C++ および Java プログラミング インターフェイスが含まれています。さらに、node.js および Python 言語のパッケージ マネージャーも HDFS クライアントのインポートをサポートします。

パッケージ マネージャーの依存関係のリストは次のとおりです。

メイブン:

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

グラドル:

providedCompile group: 'org.apache.hadoop', name: 'hadoop-hdfs-client', version: '3.1.4'

故宮:

npm i webhdfs 

ピップ:

pip install hdfs

HDFS への Java 接続の例 (IP アドレスの変更):

实例
package com.zain;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
public class Application {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            // 配置连接地址
            Configuration conf = new Configuration();
            conf.set("fs.defaultFS", "hdfs://172.17.0.2:9000");
            FileSystem fs = FileSystem.get(conf);
            // 打开文件并读取输出
            Path hello = new Path("/hello/hello.txt");
            FSDataInputStream ins = fs.open(hello);
            int ch = ins.read();
            while (ch != -1) {
    
    
                System.out.print((char)ch);
                ch = ins.read();
            }
            System.out.println();
        } catch (IOException ioe) {
    
    
            ioe.printStackTrace();
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_44659309/article/details/132382328