Hadoop HDFS over HTTP - 服务器设置

此页面说明如何使用伪身份验证快速设置 HttpFS 以对抗使用伪身份验证的 Hadoop 集群。

安装 HttpFS

~ $ tar xzf  httpfs-3.3.6.tar.gz

配置 HttpFS

默认情况下,HttpFS 假设 Hadoop 配置文件 (core-site.xml & hdfs-site.xml) 位于 HttpFS 配置目录中。

如果不是这种情况,请将 httpfs.hadoop.config.dir 属性添加到 httpfs-site.xml 文件中,并将其设置为 Hadoop 配置目录的位置。

配置 Hadoop

编辑 Hadoop core-site.xml 并定义将作为 proxyuser 运行 HttpFS 服务器的 Unix 用户。例如

  <property>
    <name>hadoop.proxyuser.#HTTPFSUSER#.hosts</name>
    <value>httpfs-host.foo.com</value>
  </property>
  <property>
    <name>hadoop.proxyuser.#HTTPFSUSER#.groups</name>
    <value>*</value>
  </property>

重要提示:将 #HTTPFSUSER# 替换为将启动 HttpFS 服务器的 Unix 用户。

重启 Hadoop

您需要重启 Hadoop 才能使 proxyuser 配置生效。

启动/停止 HttpFS

要启动/停止 HttpFS,请使用 hdfs --daemon start|stop httpfs。例如

hadoop-3.3.6 $ hdfs --daemon start httpfs

注意:脚本 httpfs.sh 已弃用。它现在只是 hdfs httpfs 的包装器。

测试 HttpFS 是否正常工作

$ curl -sS 'http://<HTTPFSHOSTNAME>:14000/webhdfs/v1?op=gethomedirectory&user.name=hdfs'
{"Path":"\/user\/hdfs"}

HttpFS 配置

HttpFS 将 HTTP 端口预配置为 14000。

HttpFS 支持 HttpFS 的 etc/hadoop/httpfs-site.xml 配置文件中的以下 配置属性

HttpFS over HTTPS (SSL)

etc/hadoop/httpfs-site.xml 中启用 SSL

  <property>
    <name>httpfs.ssl.enabled</name>
    <value>true</value>
    <description>
      Whether SSL is enabled. Default is false, i.e. disabled.
    </description>
  </property>

使用适当的值配置 etc/hadoop/ssl-server.xml,例如

  <property>
    <name>ssl.server.keystore.location</name>
    <value>${user.home}/.keystore</value>
    <description>Keystore to be used. Must be specified.
    </description>
  </property>

  <property>
    <name>ssl.server.keystore.password</name>
    <value></value>
    <description>Must be specified.</description>
  </property>

  <property>
    <name>ssl.server.keystore.keypassword</name>
    <value></value>
    <description>Must be specified.</description>
  </property>

SSL 密码可以通过凭据提供程序来保护。请参阅 凭据提供程序 API

您需要为 HttpFS 服务器创建 SSL 证书。作为 httpfs Unix 用户,使用 Java keytool 命令创建 SSL 证书

$ keytool -genkey -alias jetty -keyalg RSA

您将在一个交互式提示符中回答一系列问题。它将创建密钥库文件,该文件将被命名为.keystore,并位于httpfs用户主目录中。

您为“密钥库密码”输入的密码必须与配置目录中的ssl-server.xml中设置的属性ssl.server.keystore.password的值匹配。

对“您的名字和姓氏是什么?”(即“CN”)的回答必须是 HttpFS 服务器将运行的机器的主机名。

启动 HttpFS。它应该通过 HTTPS 运行。

使用 Hadoop FileSystem API 或 Hadoop FS shell,使用swebhdfs://方案。如果使用自签名证书,请确保 JVM 正在获取包含 SSL 证书公钥的信任库。有关客户端设置的更多信息,请参阅SWebHDFS 的 SSL 配置

注意:某些旧 SSL 客户端可能使用 HttpFS 服务器不支持的弱密码。建议升级 SSL 客户端。

已弃用的环境变量

以下环境变量已弃用。请改而设置相应的配置属性。

环境变量 配置属性 配置文件
HTTPFS_HTTP_HOSTNAME httpfs.http.hostname httpfs-site.xml
HTTPFS_HTTP_PORT httpfs.http.port httpfs-site.xml
HTTPFS_MAX_HTTP_HEADER_SIZE hadoop.http.max.request.header.size 和 hadoop.http.max.response.header.size httpfs-site.xml
HTTPFS_MAX_THREADS hadoop.http.max.threads httpfs-site.xml
HTTPFS_SSL_ENABLED httpfs.ssl.enabled httpfs-site.xml
HTTPFS_SSL_KEYSTORE_FILE ssl.server.keystore.location ssl-server.xml
HTTPFS_SSL_KEYSTORE_PASS ssl.server.keystore.password ssl-server.xml

HTTP 默认服务

名称 说明
/conf 显示配置属性
/jmx Java JMX 管理界面
/logLevel 获取或设置每个类的日志级别
/logs 显示日志文件
/stacks 显示 JVM 堆栈
/static/index.html 静态主页

若要控制对 servlet /conf/jmx/logLevel/logs/stacks 的访问,请在 httpfs-site.xml 中配置以下属性

  <property>
    <name>hadoop.security.authorization</name>
    <value>true</value>
    <description>Is service-level authorization enabled?</description>
  </property>

  <property>
    <name>hadoop.security.instrumentation.requires.admin</name>
    <value>true</value>
    <description>
      Indicates if administrator ACLs are required to access
      instrumentation servlets (JMX, METRICS, CONF, STACKS).
    </description>
  </property>

  <property>
    <name>httpfs.http.administrators</name>
    <value></value>
    <description>ACL for the admins, this configuration is used to control
      who can access the default servlets for HttpFS server. The value
      should be a comma separated list of users and groups. The user list
      comes first and is separated by a space followed by the group list,
      e.g. "user1,user2 group1,group2". Both users and groups are optional,
      so "user1", " group1", "", "user1 group1", "user1,user2 group1,group2"
      are all valid (note the leading space in " group1"). '*' grants access
      to all users and groups, e.g. '*', '* ' and ' *' are all valid.
    </description>
  </property>