Skip to content
Published on

Secured (Kerberized) Hadoop クラスターの構築方法

Authors
  • Name
    Twitter

Overview

Hadoopをインストールすると、デフォルトではセキュリティが適用されていません。Hadoopにセキュリティを適用するには、Kerberosという認証システムを使用する必要があり、その構築はかなり難しい作業であるため、ドキュメントとしてまとめることにしました。

Secured Hadoop 構築方法 公式ドキュメントを参考に作成しました。

Hadoopクラスターの構築

Kerberosセキュリティを適用する前に、Hadoopクラスターが既に構築されていることを前提とします。また、H/A(高可用性)のために2台のNameNodeと3台のJournalNodeがあることを前提とします。これにはZooKeeperが必要です。

Linuxユーザーの作成

Linuxにhadoopグループとhdfsアカウントが存在する必要があります。Kerberosを適用するには、そのアカウントでNameNodeやDataNodeを起動する必要があるためです。

Linux上でのディレクトリ作成

NameNodeデータ保存先の/dfs/nn、JournalNode保存先の/dfs/jn、そしてDataNode保存先の/dfs/dnフォルダを事前に作成し、適切な権限を付与しておく必要があります。

Kerberos Principalの作成

Kerberos Serverにhdfs/{fqdn}@{realm}HTTP/{fqdn}@{realm}のprincipalを作成し、そのprincipalでログインできるkeytabをダウンロードしておきます。このkeytabでログインするには、/etc/krb5.confファイルが正しく定義されている必要があります。

jsvcのインストール

secured環境では、DataNodeの実行が最も難しい部分です。jsvcを使用して実行する必要があるためです。

yum install jsvcwhich jsvc
which jsvc

Configurationの修正

以下のconfigurationは、すべてのサーバーで同一である必要があります。

hdfs-site.xml
<configuration>
	<property>
		<name>dfs.nameservices</name>
		<value>mycluster</value>
	</property>
	<property>
		<name>dfs.ha.namenodes.mycluster</name>
		<value>nn1,nn2</value>
	</property>
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
		<value>hadoop1.mysite.com:8020</value>
	</property>
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
		<value>hadoop2.mysite.com:8020</value>
	</property>
	<property>
		<name>dfs.namenode.http-address.mycluster.nn1</name>
		<value>hadoop1.mysite.com:9870</value>
	</property>
	<property>
		<name>dfs.namenode.http-address.mycluster.nn2</name>
		<value>hadoop2.mysite.com:9870</value>
	</property>
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop1.mysite.com:8485;hadoop2.mysite.com:8485;hadoop3.mysite.com:8485/mycluster</value>
	</property>
	<property>
		<name>dfs.client.failover.proxy.provider.mycluster</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>hadoop1.mysite.com:2181,hadoop2.mysite.com:2181,hadoop3.mysite.com:2181</value>
	</property>
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>shell(/bin/true)</value>
	</property>
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>/dfs/nn</value>
	</property>
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>/dfs/dn</value>
	</property>
	<property>
		<name>dfs.blocksize</name>
		<value>134217728</value>
	</property>
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/dfs/jn</value>
	</property>
	<!-- JournalNode -->
	<property>
		<name>dfs.journalnode.keytab.file</name>
		<value>/etc/hdfs.keytab</value>
	</property>
	<property>
		<name>dfs.journalnode.kerberos.principal</name>
		<value>hdfs/_HOST@{CHAOS.ORDER.COM}</value>
	</property>
	<property>
		<name>dfs.journalnode.kerberos.internal.spnego.principal</name>
		<value>HTTP/_HOST@CHAOS.ORDER.COM</value>
	</property>
	<!-- NameNode -->
	<property>
		<name>dfs.namenode.keytab.file</name>
		<value>/etc/hdfs.keytab</value>
	</property>
	<property>
		<name>dfs.namenode.kerberos.principal</name>
		<value>hdfs/_HOST@CHAOS.ORDER.COM</value>
	</property>
	<property>
		<name>dfs.namenode.kerberos.internal.spnego.principal</name>
		<value>${dfs.web.authentication.kerberos.principal}</value>
	</property>
	<!-- DataNode -->
	<property>
		<name>dfs.datanode.keytab.file</name>
		<value>/etc/hdfs.keytab</value>
	</property>
	<property>
		<name>dfs.datanode.kerberos.principal</name>
		<value>hdfs/_HOST@CHAOS.ORDER.COM</value>
	</property>
	<property>
		<name>dfs.datanode.address</name>
		<value>0.0.0.0:1004</value>
	</property>
	<property>
		<name>dfs.datanode.http.address</name>
		<value>0.0.0.0:1006</value>
	</property>
	<!-- Web -->
	<property>
		<name>dfs.web.authentication.kerberos.keytab</name>
		<value>/etc/hdfs.keytab</value>
	</property>
	<property>
		<name>dfs.web.authentication.kerberos.principal</name>
		<value>HTTP/_HOST@CHAOS.ORDER.COM</value>
	</property>
	<property>
		<name>dfs.block.access.token.enable</name>
		<value>true</value>
	</property>
	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>0.0.0.0:50090</value>
	</property>
	<property>
		<name>dfs.namenode.secondary.https-address</name>
		<value>0.0.0.0:50091</value>
	</property>
</configuration>

core-site.xml
<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://mycluster</value>
	</property>
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>hadoop1.mysite.com:2181,hadoop2.mysite.com:2181,hadoop3.mysite.com:2181</value>
	</property>
	<property>
		<name>hadoop.rpc.protection</name>
		<value>authentication</value>
	</property>
	<property>
		<name>hadoop.security.authentication</name>
		<value>kerberos</value>
	</property>
	<property>
		<name>hadoop.security.authorization</name>
		<value>true</value>
	</property>
</configuration>

以下のファイルにあるコメントアウトされたJSVC_HOMEHADOOP_SECURE_DN_USERの部分をコメント解除します。

which jsvcで得られる値をJSVC_HOMEに、HADOOP_SECURE_DN_USERにはhdfsを設定します。

hadoop-env.sh
# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol.  Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
export JSVC_HOME=/usr/bin
# On secure datanodes, user to run the datanode as after dropping privileges.
# This **MUST** be uncommented to enable secure HDFS if using privileged ports
# to provide authentication of data transfer protocol.  This **MUST NOT** be
# defined if SASL is configured for authentication of data transfer protocol
# using non-privileged ports.

export HADOOP_SECURE_DN_USER=hdfs

JournalNode、NameNode、DataNodeの起動

クラスターの初期構築の場合、以下の手順が必要です。

  1. ZooKeeperの起動:zookeeper/bin/zkServer.sh start(3台すべて)
  2. ZKFCのフォーマット:hdfs zkfc -formatZK(1回のみ実行)
  3. JournalNodeの起動:hdfs journalnode(3台すべて)
  4. Active NameNodeのフォーマット:hdfs namenode -format(Active NameNodeで1回のみ実行)
  5. Active NameNodeの起動:hdfs namenode(Active NameNodeで実行)
  6. Standby NameNodeのフォーマット:hdfs namenode -bootstrapStandby(Standby NameNodeで1回のみ実行)
  7. Standby NameNodeの起動:hdfs namenode(Standby NameNodeで実行)
  8. ZKFCの起動:hdfs zkfc(Active、Standby NameNodeがあるノードで実行)
  9. DataNodeの起動:hdfs datanode(データノードで実行)

注意点として、JournalNode、NameNode、ZKFCはhdfsアカウントで実行し、DataNodeとZooKeeperはrootアカウントで実行する必要があります。

インストールが正常に完了すると、

http://namenode_ip_address:9870 でNameNode Web UIにアクセスできます。 そして、以下のようにsecurityの部分がonと表示されている必要があります。

hadoop web ui