在HDFS安全认证模式上配置Alluxio

Slack Docker Pulls GitHub edit source

该指南介绍如何配置Alluxio从而使用安全认证模式下的HDFS作为底层文件系统。Alluxio支持安全认证模式下的HDFS作为底层文件系统,通过Kerberos认证。

注:在HDFS安全认证模式下的Kerberos认证不是Alluxio通过Kerberos进行内部的认证

初始步骤

要在许多机器上运行Alluxio集群,需要在这些机器上部署二进制包。 你可以或者下载对应hadoop版本的预编译二进制包(推荐), 或者从源码编译Alluxio(高级用户)。

注意,当从源码编译Alluxio时,默认预编译的Alluxio服务器二进制包适用于HDFS 2.2.0。若使用其他版本的Hadoop,需要指定正确的Hadoop配置文件,然后在你的Alluxio目录下运行一下命令:

  1. mvn install -P<YOUR_HADOOP_PROFILE> -DskipTests

Alluxio为不同的Hadoop版本提供了预先定义好的配置文件,包括hadoop-1, hadoop-2.2, hadoop-2.3hadoop-2.8。如果你想将Alluxio和一个具体的Hadoop发行版本一起编译,你可以在命令中指定版本<YOUR_HADOOP_VERSION> 比如:

  1. mvn install -Phadoop-2.7 -Dhadoop.version=2.7.1 -DskipTests

这会将为Apache Hadoop 2.7.1编译Alluxio。 请访问Building Alluxio Master Branch以获取更多关于支持其它版本的信息。

如果一切正常,在assembly/server/target目录中应当能看到alluxio-assembly-server-1.8.3-SNAPSHOT-jar-with-dependencies.jar文件并且使用该jar文件即可运行Alluxio Master和Worker。

配置Alluxio

基础配置

首先利用模板创建你的配置文件。

  1. cp conf/alluxio-site.properties.template conf/alluxio-site.properties

接着修改conf/alluxio-site.properties文件,将底层存储系统的地址设置为HDFS namenode的地址以及你想挂载到Alluxio的HDFS目录。例如,若你的HDFS namenode是在本地默认端口运行,并且将HDFS根目录映射到Alluxio,则该地址为hdfs://localhost:9000,或者,若仅仅映射HDFS的/alluxio/data目录到Alluxio,则地址为hdfs://localhost:9000/alluxio/data

  1. alluxio.underfs.address=hdfs://NAMENODE:PORT

HDFS配置文件

为了确保Alluxio客户端能够将HDFS配置加入到classpath,请将HDFS安全认证配置文件(core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml)拷贝到${ALLUXIO_HOME}/conf/目录下。

Kerberos配置

可选配置项,你可以为自定义的Kerberos配置设置jvm级别的系统属性:java.security.krb5.realmjava.security.krb5.kdc。这些Kerberos配置将Java库路由到指定的Kerberos域和KDC服务器地址。如果两者都设置为空,Kerberos库将遵从机器上的默认Kerberos配置。例如:

  • 如果你使用的是Hadoop,你可以将这两项配置添加到${HADOOP_CONF_DIR}/hadoop-env.sh文件的HADOOP_OPTS配置项。
  1. export HADOOP_OPTS="$HADOOP_OPTS -Djava.security.krb5.realm=<YOUR_KERBEROS_REALM> -Djava.security.krb5.kdc=<YOUR_KERBEROS_KDC_ADDRESS>"
  • 如果你使用的是Spark,你可以将这两项配置添加到${SPARK_CONF_DIR}/spark-env.sh文件的SPARK_JAVA_OPTS配置项。
  1. SPARK_JAVA_OPTS+=" -Djava.security.krb5.realm=<YOUR_KERBEROS_REALM> -Djava.security.krb5.kdc=<YOUR_KERBEROS_KDC_ADDRESS>"
  • 如果你使用的是Alluxio Shell,你可以将这两项配置添加到conf/alluxio-env.sh文件的ALLUXIO_JAVA_OPTS配置项。
  1. ALLUXIO_JAVA_OPTS+=" -Djava.security.krb5.realm=<YOUR_KERBEROS_REALM> -Djava.security.krb5.kdc=<YOUR_KERBEROS_KDC_ADDRESS>"

Alluxio服务器Kerberos认证

alluxio-site.properties文件配置下面的Alluxio属性:

  1. alluxio.master.keytab.file=<YOUR_HDFS_KEYTAB_FILE_PATH>
  2. alluxio.master.principal=hdfs/<_HOST>@<REALM>
  3. alluxio.worker.keytab.file=<YOUR_HDFS_KEYTAB_FILE_PATH>
  4. alluxio.worker.principal=hdfs/<_HOST>@<REALM>

使用安全认证模式下的HDFS在本地运行Alluxio

在这一步开始之前,请确保你的HDFS集群处于运行状态,并且挂载到Alluxio的HDFS目录已经存在。

在Alluxio节点运行kinit的时候,请使用相应的principal和keytab文件来提供Kerberos票据缓存。如前例,你应该用principal hdfs<YOUR_HDFS_KEYTAB_FILE_PATH>kinit。一个已知的限制是Kerberos TGT可能会在达到最大更新周期后失效。你可以通过定期更新TGT来解决这个问题。否则,在启动Alluxio服务的时候,你可能会看到下面的错误:

  1. javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

配置完成后,你可以在本地启动Alluxio,观察是否正确运行:

  1. bin/alluxio format
  2. bin/alluxio-start.sh local

该命令应当会启动一个Alluxio master和一个Alluxio worker,可以在浏览器中访问http://localhost:19999查看master Web UI。

接着,你可以运行一个简单的示例程序:

  1. bin/alluxio runTests

为了这个测试能成功运行,你需要保证Alluxio cli登入的用户对挂载到Alluxio的HDFS目录有读/写的访问权限。默认情况下,登入的用户是当前主机OS的用户。要改变默认配置,可以设置./conf/alluxio-site.properties文件中的alluxio.security.login.username的值为想要的用户名。HDFS目录在alluxio.underfs.address属性里声明。

运行成功后,访问HDFS Web UI http://localhost:50070,确认其中包含了由Alluxio创建的文件和目录。在该测试中,创建的文件名称应像这样:/default_tests_files/Basic_CACHE_THROUGH

运行以下命令停止Alluxio:

  1. bin/alluxio-stop.sh local