DUICUO

Hadoop を使い始めて Kubernetes 環境にデプロイするための 7 つの図。

I. 概要

Hadoopの中核は、基盤となるシステムの詳細を透過的に把握できる分散インフラストラクチャをユーザーに提供します。HDFSの高いフォールトトレランス、スケーラビリティ、そして効率性により、ユーザーはHadoopを安価なハードウェアに導入し、分散システムを構築できます。現在の最新バージョンは3.xです。公式ドキュメント:https://hadoop.apache.org/docs/current/index.html

HDFS

II. 展開開始

1) ソースを追加する

アドレス: https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop

 helm リポジトリに apache-hadoop-helm を追加します https://pfisterer.github.io/apache-hadoop-helm/
helm pull apache-hadoop-helm/hadoop --version 1.2.0
tar -xf hadoop-1.2.0.tgz

2) Dockerfileを使用してDockerイメージをビルドする

 myharbor.com/bigdata/centos:2009年7月9日より
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
実行エクスポートLANG = zh_CN.UTF-8
# `spec.template.spec.containers.securityContext.runAsUser: 9999` の設定に従って、ユーザーとユーザー グループを作成します。
実行 groupadd --system --gid = 9999 admin && useradd --system --home -dir /home/admin --uid = 9999 --gid = admin admin
# sudo をインストールする
実行 yum -y install sudo ; chmod 640 /etc/sudoers
# 管理者にsudo権限を追加する
実行echo "admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
実行 yum -y install install net-tools telnet wget
mkdir /opt/apache/ を実行します。
jdk-8u212-linux-x64.tar.gz /opt/apache/ を追加します。
環境変数JAVA_HOME = /opt/apache/jdk1.8.0_212
環境変数PATH = $JAVA_HOME /bin: $PATH
環境変数 HADOOP_VERSION 3.3.2
環境変数HADOOP_HOME = /opt/apache/hadoop
環境変数HADOOP_COMMON_HOME = ${HADOOP_HOME} \
HADOOP_HDFS_HOME = ${HADOOP_HOME} \
HADOOP_MAPRED_HOME = ${HADOOP_HOME} \
HADOOP_YARN_HOME = ${HADOOP_HOME} \
HADOOP_CONF_DIR = ${HADOOP_HOME} /etc/hadoop \
PATH = ${PATH} : ${HADOOP_HOME} /bin
#RUN curl --silent --output /tmp/hadoop.tgz https://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz && tar --directory /opt/apache -xzf /tmp/hadoop.tgz && rm /tmp/hadoop.tgz
hadoop- ${HADOOP_VERSION} .tar.gz /opt/apache を追加します
実行ln -s /opt/apache/hadoop- ${HADOOP_VERSION} ${HADOOP_HOME}
chown -R admin:admin /opt/apache を実行します。
ワークディレクトリ$HADOOP_HOME
# HDFS ポート
露出50010 50020 50070 50075 50090 8020 9000
# マッピングされたポート
エクスポーズ19888
#Yarn ポート
露出8030 8031 8032 8033 8040 8042 8088
#その他のポート
エクスポーズ49707 2122

イメージの構築を開始する

 docker build -t myharbor.com/bigdata/hadoop:3.3.2 . --no -cache
### パラメータの説明
# -t: イメージ名を指定します
# . : 現在のディレクトリ内のDockerfile
# -f: Dockerfileのパスを指定します
# --no-cache: キャッシュしない

ミラーリポジトリにプッシュ

 docker push myharbor.com/bigdata/hadoop:3.3.2

ディレクトリ構造を調整する

 hadoop/templates/hdfs を hadoop/templates/yarn にコピーします。
mv hadoop/templates/hdfs-* hadoop/templates/hdfs/
mv hadoop/templates/yarn-* hadoop/templates/yarn/

3) 構成を変更する

  • hadoop/values.yaml

画像:
リポジトリ: myharbor.com/bigdata/hadoop
タグ: 3.3.2
プルポリシー: IfNotPresent
...
持続性:
名前ノード:
有効: true
ストレージクラス: "hadoop-nn-local-storage"
アクセスモード: ReadWriteOnce
サイズ: 10Gi
地元:
-名前: hadoop-nn-0
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/hadoop/nn/data/data1"
データノード:
有効: true
ストレージクラス: "hadoop-dn-local-storage"
アクセスモード: ReadWriteOnce
サイズ: 20Gi
地元:
-名前: hadoop-dn-0
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/hadoop/dn/data/data1"
-名前: hadoop-dn-1
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/hadoop/dn/data/data2"
-名前: hadoop-dn-2
ホスト: "local-168-182-110"
パス: "/opt/bigdata/servers/hadoop/dn/data/data3"
-名前: hadoop-dn-3
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/hadoop/dn/data/data1"
-名前: hadoop-dn-4
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/hadoop/dn/data/data2"
-名前: hadoop-dn-5
ホスト: "local-168-182-111"
パス: "/opt/bigdata/servers/hadoop/dn/data/data3"
-名前: hadoop-dn-6
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/hadoop/dn/data/data1"
-名前: hadoop-dn-7
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/hadoop/dn/data/data2"
-名前: hadoop-dn-8
ホスト: "local-168-182-112"
パス: "/opt/bigdata/servers/hadoop/dn/data/data3"
...
サービス
名前ノード:
タイプ: NodePort
ポート:
dfs: 9000
ウェブHDFS: 9870
ノードポート:
dfs: 30900
ウェブHDFS: 30870
データノード:
タイプ: NodePort
ポート:
dfs: 9000
ウェブHDFS: 9864
ノードポート:
dfs: 30901
ウェブHDFS: 30864
リソースマネージャー:
タイプ: NodePort
ポート:
ウェブ: 8088
ノードポート:
ウェブ: 30088
...
セキュリティコンテキスト:
実行ユーザー: 9999
特権: true

  • hadoop/テンプレート/hdfs/hdfs-nn-pv.yaml

 {{- 範囲 .Values.persistence.nameNode.local }}
----
apiバージョン: v1
種類: 永続ボリューム
メタデータ:
名前: {{.name}}
ラベル:
名前: {{.name}}
仕様:
ストレージクラス名: {{ $.Values ​​.persistence.nameNode.storageClass }}
容量:
ストレージ: {{ $.Values ​​.persistence.nameNode.size }}
アクセスモード:
-一度だけ読み書き可能
地元:
パス: {{.path}}
ノードアフィニティ:
必須:
ノードセレクタ用語:
-一致表現:
-キー: kubernetes.io/hostname
演算子: In
値:
- {{ 。ホスト }}
----
{{- 終わり }}

  • hadoop/テンプレート/hdfs/hdfs-dn-pv.yaml

 {{- 範囲 .Values.persistence.dataNode.local }}
----
apiバージョン: v1
種類: 永続ボリューム
メタデータ:
名前: {{.name}}
ラベル:
名前: {{.name}}
仕様:
ストレージクラス名: {{ $.Values ​​.persistence.dataNode.storageClass }}
容量:
ストレージ: {{ $.Values ​​.persistence.dataNode.size }}
アクセスモード:
-一度だけ読み書き可能
地元:
パス: {{.path}}
ノードアフィニティ:
必須:
ノードセレクタ用語:
-一致表現:
-キー: kubernetes.io/hostname
演算子: In
値:
- {{ 。ホスト }}
----
{{- 終わり }}

  • HDFS サービスを変更する

 mv hadoop/templates/hdfs/hdfs-nn-svc.yaml hadoop/templates/hdfs/hdfs-nn-svc-headless.yaml
mv hadoop/templates/hdfs/hdfs-dn-svc.yaml hadoop/templates/hdfs/hdfs-dn-svc-headless.yaml
# 重複を避けるため、名前を変更する必要があることに注意してください。

hadoop/テンプレート/hdfs/hdfs-nn-svc.yaml

 # DNSレコードを作成するためのヘッドレスサービス
apiバージョン: v1
種類: サービス
メタデータ:
名前: {{ include "hadoop.fullname" . }}-hdfs-nn
ラベル:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
helm.sh/chart: {{ "hadoop.chart"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: hdfs-nn
仕様:
ポート:
-名前: dfs
ポート: {{ .Values.service.nameNode.ports.dfs }}
プロトコル: TCP
ノードポート: {{ .Values.service.nameNode.nodePorts.dfs }}
-名前: webhdfs
ポート: {{ .Values.service.nameNode.ports.webhdfs }}
ノードポート: {{ .Values.service.nameNode.nodePorts.webhdfs }}
タイプ: {{ .Values.service.nameNode.type }}
セレクタ:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: hdfs-nn

hadoop/テンプレート/hdfs/hdfs-dn-svc.yaml

 # DNSレコードを作成するためのヘッドレスサービス
apiバージョン: v1
種類: サービス
メタデータ:
名前: {{ include "hadoop.fullname" . }}-hdfs-dn
ラベル:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
helm.sh/chart: {{ "hadoop.chart"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: hdfs-nn
仕様:
ポート:
-名前: dfs
ポート: {{ .Values.service.dataNode.ports.dfs }}
プロトコル: TCP
ノードポート: {{ .Values.service.dataNode.nodePorts.dfs }}
-名前: webhdfs
ポート: {{ .Values.service.dataNode.ports.webhdfs }}
ノードポート: {{ .Values.service.dataNode.nodePorts.webhdfs }}
タイプ: {{ .Values.service.dataNode.type }}
セレクタ:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: hdfs-dn

  • 糸サービスの変更

 mv hadoop/templates/yarn/yarn-nm-svc.yaml hadoop/templates/yarn/yarn-nm-svc-headless.yaml
mv hadoop/templates/yarn/yarn-rm-svc.yaml hadoop/templates/yarn/yarn-rm-svc-headless.yaml
mv hadoop/templates/yarn/yarn-ui-svc.yaml hadoop/templates/yarn/yarn-rm-svc.yaml
# 重複を避けるため、名前を変更する必要があることに注意してください。

hadoop/テンプレート/yarn/yarn-rm-svc.yaml

 # yarn web ui にアクセスするためのサービス
apiバージョン: v1
種類: サービス
メタデータ:
名前: {{ include "hadoop.fullname" . }}-yarn-rm
ラベル:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
helm.sh/chart: {{ "hadoop.chart"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: yarn-rm
仕様:
ポート:
-ポート: {{ .Values.service.resourceManager.ports.web }}
名前: ウェブ
ノードポート: {{ .Values.service.resourceManager.nodePorts.web }}
タイプ: {{ .Values.service.resourceManager.type }}
セレクタ:
app.kubernetes.io/name: {{ "hadoop.name"を含めます。}}
app.kubernetes.io/インスタンス: {{ .Release.Name }}
app.kubernetes.io/コンポーネント: yarn-rm

  • コントローラーを変更する

すべてのコントロールに以下を追加します。

コンテナ:
...
セキュリティコンテキスト:
実行ユーザー: {{ .Values.securityContext.runAsUser }}
特権: {{ .Values.securityContext.privileged }}

  • hadoop/テンプレート/hadoop-configmap.yaml

 ### 1. /root を /opt/apache に置き換えます
### 2. TMP_URL="http://{{ include "hadoop.fullname" . }}-yarn-rm-headless:8088/ws/v1/cluster/info"

4) インストールを開始する

 # ストレージディレクトリを作成する
mkdir -p /opt/bigdata/servers/hadoop/{nn,dn}/data/data{1..3}
helm で hadoop をインストールします。/hadoop -n hadoop --create -namespace

注記

名前: Hadoop
最終デプロイ日: 2022年9月24日(土) 17:00:55
名前空間: hadoop
ステータス: 展開済み
改訂: 1
テストスイート: なし
注記:
1.次のコマンドを実行して、HDFS のステータスを確認できます。
kubectl exec -n hadoop -it hadoop-hadoop-hdfs-nn-0 -- /opt/hadoop/bin/hdfs dfsadmin -report
2.次のコマンドを実行すると、yarn ノードを一覧表示できます。
kubectl exec -n hadoop -it hadoop-hadoop-yarn-rm-0 -- /opt/hadoop/bin/yarn ノード-list
3. Yarn リソース マネージャー UI へのポート転送を作成します。
kubectl ポート転送-n hadoop hadoop-hadoop-yarn-rm-0 8088 :8088
次にブラウザUI を開きます。
http://localhost:8088 を開く
4.含まれている Hadoop テストは次のように実行できます。
kubectl exec -n hadoop -it hadoop-hadoop-yarn-nm-0 -- /opt/hadoop/bin/hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.2-tests.jar TestDFSIO -write -nrFiles 5 -fileSize 128MB -resFile /tmp/TestDFSIOwrite.txt
5.次のようにして mapreduce ジョブを一覧表示できます。
kubectl exec -n hadoop -it hadoop-hadoop-yarn-rm-0 -- /opt/hadoop/bin/mapred ジョブ -list
6.このチャートはツェッペリンチャートでも使用できます
helm インストール--namespace hadoop --set hadoop .useConfigMap = true 、hadoop .configMapName = hadoop-hadoop stable/zeppelin
7.次のようにして、yarn ノードの数を調整できます。
helm アップグレード hadoop --set yarn.nodeManager .replicas = 4 stable/hadoop
これを永続的にしたい場合は、必ず values.yaml を更新してください。

チェック

 kubectl get pods,svc -n hadoop -wide 

hdfs ウェブ:​​http://192.168.182.110:30870/​​

糸のウェブ:​​http://192.168.182.110:30088/​​

5) テストと検証

HDFSのテストと検証

 kubectl exec -it hadoop-hadoop-hdfs-nn-0 -n hadoop --bash
[root@local-168-182-110 hadoop] # kubectl exec -it hadoop-hadoop-hdfs-nn-0 -n hadoop -- bash
bash-4.2 $
bash-4.2 $
bash-4.2 $ hdfs dfs -mkdir /tmp
bash-4.2 $ hdfs dfs -ls /
1 件のアイテムが見つかりました
drwxr-xr-x - 管理者スーパーグループ0 2022-09-24 17:56 / tmp
bash-4.2 $ echo "テストhadoop" >test.txt
bash-4.2 $ hdfs dfs -put test.txt /tmp/
bash-4.2 $ hdfs dfs -ls /tmp/
1 件のアイテムが見つかりました
-rw -r --r -- 3管理者スーパーグループ12 2022 -09 -24 17 :57 /tmp/test.txt
bash-4.2 $ hdfs dfs -cat /tmp/
cat : `/tmp ': ディレクトリです
bash-4.2$ hdfs dfs -cat /tmp/test.txt
Hadoopをテストする
bash-4.2$

後ほど Kubernetes 上の Hive について説明するときに、Yarn をテストして検証します。

6) アンインストール

 helm アンインストール hadoop -n hadoop
kubectl ポッドを削除-n hadoop `kubectl ポッドを取得 -n hadoop|awk 'NR>1{print $1}' ` --force
kubectl patch ns hadoop -p '{"metadata":{"finalizers":null}}'
kubectl ns hadoop を削除--force

Git をダウンロードするためのリンクはこちらです。ご興味があれば、ぜひダウンロードしてデプロイしてください: https://gitee.com/hadoop-bigdata/hadoop-on-k8s

Kubernetes クラスターでは、YARN の重要性は徐々に低下し、YARN の代わりに Kubernetes リソース スケジューリングが直接使用されるようになります。このデプロイメントは単一障害点であり、テスト環境に限定されています。次の記事では、Kubernetes 上での Hadoop の高可用性の実装について説明しますので、しばらくお待ちください。