« MacとWindowsとCentOSのファイル共有ー備忘録 | トップページ | In and Out »

2020年1月18日 (土)

HadoopとGPFS HDFS Transparency

GPFS HDFS Transparencyって何なのか知りたくてHadoopをインストールした。参考にさせていただいたのは以下のリンク。
CentOS7でApache Hadoopの疑似分散モードを使ってみる

完全分散モードは以下
https://blog.amedama.jp/entry/2017/06/06/040651

インストール先の環境は以下の通り。
GPFS Client Node (SMB Protocol Nodeで構成済み)
GPFS Server Node x 2(共有ディスクの上に構成)
VMWare Player上のESXi上に構成している。

今回は上記GPFS ClientにHadoopを疑似分散モードで構成して、HadoopのHDFSをGPFSに置き換える作業をしてみる。参考資料等は以下のリンク。
GPFS HDFS Transparency導入ガイド
GPFS HDFS Transparencyダウンロード

インストールしたhadoopは2.10.0。
# wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz

既にGPFS Client Nodeにはopenjdk 1.8.0がインストール済だった。
# java -version
openjdk version "1.8.0_222"
けれども後からjpsが入っていない事が判明し、以下の通りdevelをインストールし直した。develにはjpsが含まれている。
# yum -y insall hava-1.8.0-openjdk-devel

# jps
19936 Jps
28841 NameNode
28817 SecondaryNameNode
29071 DataNode

ガイド通りに構成したら疑似分散モードはちゃんと動いているみたい。サンプルプログラムも動作した(みたい)。
ここまででGPFS HDFS Transparencyをインストールするベースが出来た(と思う)。

インストールするHDFS Transparencyは3.1.0とした(とりあえず最新バージョン)。
gpfs.hdfs-protocol-3.1.0-3.x86_64.rpm
上記ダウンロード先からpart1とpart2をダウンロードして、catで連結してrpmを作成(ガイド通り)。
ちなみにインストール済みのGPFSは5.0.3。

ここまでの過程で重要なのがcore-site.xmlの編集。core-site.xmlはHadoopが使用するhdfsを設定する。ここでは素のhdfsを設定するけれど、後からそれをgpfs hdfs transparencyに設定しなおすことで、hadoopが気が付くことなくhdfsを入れ替える。
hadoop-2.10.0/etc/hadoop/core-site.xmlの最後に以下の行を追記する。
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>

これでDefaultのファイルシステムがlocalhostのhdfsになる。ここで指定するlocalhostはNameNodeの意味。ここで?。疑似分散モードだからlocalhost指定は納得だけれどもポート番号9000はどこで分かるのだろう。ということでググってみた結果、いかにポート番号が掲載されていた。
Apache Hadoop HDFSのポート番号
ここを読むとDefault Portとして8020と9000の二つが記載されている。Defaultはどっち?以下を読むとHadoopのリリースに依存するみたい。
8020/9000?
少なくともApache Hadoop 2.10.0では9000で動いているのは事実。

もう一つ重要なのはhadoop-2.10.0/etc/hadoop/hdfs-site.xml。ここではReplicaの数を設定する。Defaultは3だけれども疑似分散モードはDataNodeが1NodeだけだからReplicaの数は1。以下の行をhdfs-site.xmlに追記する。
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
ここの実験では疑似分散モードのlocalhostのストレージをGPFSに置き換えることを試みているので、DataNode数は1のまま。なのでGPFS HDFS Transparencyを入れた後もReplicationは1のまま。

以下、行った作業:

以下の行を /etc/security/limits.conf fileに追記した。
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536

/var/mmfs/hadoop/etc/hadoop/core-site.xmlのサーバー名のみをlocalhostに変更。
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:8020</value>
   </property>
</configuration>

もし、HDFS NameNodeとHDFS Transparency NameNodeが異なるのならhadoop側のcore-site.xmlを修正せよ、とのこと。HDFS Transparency側のNameNodeのポート番号が8020だったので、HDFS側の9000を8020に変更。
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://localhost:8020</value>
</property>

/var/mmfs/hadoop/etc/hadoop/gpfs-siteの以下を変更:
<property>
  <name>gpfs.mnt.dir</name>
  <value>/gpfs/gpfsfs01/hdfs01</value>
</property>
<property>
  <name>gpfs.data.dir</name>
  <value>data_dir</value>
</property>

/gpfs/gpfsfs01/hdfs01/data_dirは事前に作成しておく。

/var/mmfs/hadoop/etc/hadoop/workersにlocalhostが登録されていることを確認。

/var/mmfs/hadoop/etc/hadoop/hadoop-env.shに以下を設定(この設定がないとmmhadoopctlがJAVA_HOMEが未設定と言ってくる)。
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk

/usr/lpp/mmfs/bin/mmhadoopctl connector syncconfを実行してNode間の設定同期。

/usr/lpp/mmfs/bin/mmhadoopctl connector startを実行
Starting namenodes on [localhost]
Starting datanodes

/usr/lpp/mmfs/bin/mmhadoopctl connector getstateを実行
localhost: namenode pid is 26128
localhost: datanode pid is 22378

この状態で以下を実行
# bin/hdfs dfs -ls -R

うぅーーーー、上記作業をしても、HDFS Transparency構成前の素のファイルシステムのls結果が表示されてしまう。

そもそも、上記操作はどいう意味をもっているのだろう。mmfs配下のcore-site.xmlで以下をセットしている。
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
一方、素のhadoop配下のcore-site.xmlには以下をセットしている。
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
ポート番号を8020に統一しても結果は同じ。

そもそも、HDFS Transparencyって何なんだろう?この答えは以下にあると思う。
If your native HDFS NameNodes are different than HDFS Transparency NameNodes, you need to update
fs.defaultFS in your Hadoop configuration (for HortonWorks HDP it is located under /etc/Hadoop/conf.
If it is open source Apache Hadoop, it is located under $YOUR_HADOOP_PREFIX/etc/hadoop/.):
<property>
<name>fs.defaultFS</name>
<value>hdfs://hs22n44:8020</value>
</property>
もしも、素のNameNodeがHDFS TransparencyのNameNodeと異なるのであれば、素のNameNodeの記載を変更せよ、とある。つまり、素のNameNodeをHDFS TransparencyのNameNodeで置き換えることを意味している。同じNameNodeノードならば、HDFS Transparencyが素のNodeNameノードをオーバーライドしていることになる。このオーバーライドが上手くいっていないってこのなんだろうか。。。

実際手順として、素のHDFSが止まっている状態(sbin/stop-dfs.sh実行後)ではmmhadoopctl connector startは以下を出力する。
[localhost] namenode is dead, previous pid is xxxxx

HDFS Transparencyを再起動(mmhadoopctl connector stopしてからstart)してからhdfs dfs -lsを実行するとfailed on connection exceptionが発生する。

ガイド通りの操作は、素のHDFSが立ち上がっているところで、mmhadoopctl connector startを実行すること。つまり、動作中の素のHDFSのNameNodeをmmhadoopctlでオーバーライドすること、なのだろう。

原因判明

以下の/gpfs_mount_pointの解釈を間違っていた。ここにはGPFSがマウントされているディレクトリを記載しないといけなかった。
対象システムではGPFSは/gpfs/gpfsfs01にマウントしていたので、以下に修正。またdata_dirはその下に作成してあるfilesetのfs01を設定した。ちなみにgpfs.data.dirはブランクでも良いみたい。
<property>
<name>gpfs.mnt.dir</name>
<value>/gpfs/gpfsfs01t</value>
</property>
<property>
<name>gpfs.data.dir</name>
<value>fs01</value>
</property>

これで、Native HDFSからGPFSへの切り替えが成功した。しかし、、、
mkdirを実行するとNullPointerExceptionが発生。
# bin/hdfs dfs -mkdir -p /user
mkdir: java.lang.NullPointerException

/var/log/transparencyにあるnamenode logを見ると以下がログられている。
2020-01-18 19:02:56,600 WARN org.apache.hadoop.hdfs.server.namenode.GPFSNative: @get_file:408 /gpfs/gpfsfs01/fs01
2020-01-18 19:02:56,793 WARN org.apache.hadoop.hdfs.server.namenode.GPFSNative: @get_file:408 /gpfs/gpfsfs01/fs01
2020-01-18 19:02:56,813 WARN org.apache.hadoop.ipc.Server: IPC Server handler 518 on 9000, call Call#1 Retry#0 org.apache.hadoop.hdfs.protocol.ClientProtocol.mkdirs from 127.0.0.1:37474
java.lang.NullPointerException
at org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.createParentDirectories(FSDirMkdirOp.java:134)
at org.apache.hadoop.hdfs.server.namenode.FSDirMkdirOp.mkdirs(FSDirMkdirOp.java:75)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3074)
at org.apache.hadoop.hdfs.server.namenode.GPFSNamesystem.mkdirs(GPFSNamesystem.java:433)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1115)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:695)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1682)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)
#

何か設定が足りないみたい。


Logを見るとSecurity絡みでNullPointerExceptionが起きているみたいなので、セキュリティ関係を調整してみた。
/gpfs/gpfsfs01/fs01のACL変更ー>効果なし

# mmgetacl /gpfs/gpfsfs01/fs01 -o acl.01 -k native
# cat acl.01
#NFSv4 ACL
#owner:root
#group:root
special:owner@:rwxc:allow
(X)READ/LIST (X)WRITE/CREATE (X)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (X)DELETE_CHILD (X)CHOWN (X)EXEC/SEARCH (X)WRITE_ACL (X)WRITE_ATTR (X)WRITE_NAMED
special:group@:----:allow
(-)READ/LIST (-)WRITE/CREATE (-)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (-)DELETE_CHILD (-)CHOWN (-)EXEC/SEARCH (-)WRITE_ACL (-)WRITE_ATTR (-)WRITE_NAMED
special:everyone@:----:allow
(-)READ/LIST (-)WRITE/CREATE (-)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (-)DELETE_CHILD (-)CHOWN (-)EXEC/SEARCH (-)WRITE_ACL (-)WRITE_ATTR (-)WRITE_NAMED
# mmeditacl /gpfs/gpfsfs01/fs01, where I gave group and everyone READ/LIST, WRITE/CREAET and APPEND/MKDIR privilege.
# mmgetacl /gpfs/gpfsfs01/fs01 -o acl.02
# cat acl.02
以下、acl.02#の中身
#NFSv4 ACL
#owner:root
#group:root
special:owner@:rwxc:allow
(X)READ/LIST (X)WRITE/CREATE (X)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (X)DELETE_CHILD (X)CHOWN (X)EXEC/SEARCH (X)WRITE_ACL (X)WRITE_ATTR (X)WRITE_NAMED
special:group@:rw--:allow
(X)READ/LIST (X)WRITE/CREATE (X)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (-)DELETE_CHILD (-)CHOWN (-)EXEC/SEARCH (-)WRITE_ACL (-)WRITE_ATTR (-)WRITE_NAMED
special:everyone@:rw--:allow
(X)READ/LIST (X)WRITE/CREATE (X)APPEND/MKDIR (X)SYNCHRONIZE (X)READ_ACL (X)READ_ATTR (X)READ_NAMED
(-)DELETE (-)DELETE_CHILD (-)CHOWN (-)EXEC/SEARCH (-)WRITE_ACL (-)WRITE_ATTR (-)WRITE_NAMED
Unfortunately, nothing has been changed but still failed with NullPointerException.

Filesystem Attributeの変更ー>効果なし

# mmlsfs all -k

File system attributes for /dev/gpfsfs01:
=========================================
flag value description
------------------- ------------------------ -----------------------------------
-k nfs4 ACL semantics in effect
# mmchfs /dev/gpfsfs01 -k all
# mmlsfs all -k

File system attributes for /dev/gpfsfs01:
=========================================
flag value description
------------------- ------------------------ -----------------------------------
-k all ACL semantics in effect
#

Native HDFSでは問題ないのにHDFS TransparencyではExceptionが起きる。。。。

« MacとWindowsとCentOSのファイル共有ー備忘録 | トップページ | In and Out »

ソフトウエア導入」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« MacとWindowsとCentOSのファイル共有ー備忘録 | トップページ | In and Out »