使用 SSH 连接到 HDInsight (Hadoop)

了解如何使用安全外壳 (SSH) 安全地连接到 Azure HDInsight 上的 Hadoop。

HDInsight 可以使用 Linux (Ubuntu) 作为 Hadoop 群集中节点的操作系统。 下表包含使用 SSH 客户端连接到基于 Linux 的 HDInsight 时所需的地址和端口信息:

地址 端口 连接到...
<edgenodename>.<clustername>-ssh.azurehdinsight.cn 22 边缘节点(如果存在边缘节点,则可以是任何其他群集类型)
<clustername>-ssh.azurehdinsight.cn 22 主头节点
<clustername>-ssh.azurehdinsight.cn 23 辅助头节点

Note

<edgenodename> 替换为边缘节点的名称。

<clustername> 替换为群集的名称。

如果群集包含边缘节点,建议__始终连接到边缘节点__(使用 SSH)。 头节点托管服务对于 Hadoop 运行状况而言至关重要。 边缘节点只会运行其上放置的软件。

有关使用边缘节点的详细信息,请参阅 Use edge nodes in HDInsight(在 HDInsight 中使用边缘节点)。

SSH 客户端

Linux、Unix 和 macOS 系统提供 sshscp 命令。 ssh 客户端通常用于在基于 Linux 或 Unix 的系统中创建远程命令行会话。 scp 客户端用于在客户端和远程系统之间安全地复制文件。

默认情况下,Microsoft Windows 不提供任何 SSH 客户端。 sshscp 客户端通过以下包提供给 Windows 使用:

此外,还可以使用多个图形 SSH 客户端,例如 PuTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/)MobaXterm (http://mobaxterm.mobatek.net/)。 尽管可以使用这些客户端连接到 HDInsight,但连接的过程与使用 ssh 实用工具时不同。 有关详细信息,请参阅所用图形客户端的文档。

身份验证:SSH 密钥

SSH 密钥使用公钥加密对 SSH 会话进行身份验证。 SSH 密钥比密码更安全,使用它可以轻松确保对 Hadoop 群集进行访问时的安全性。

如果使用密钥保护 SSH 帐户,客户端必须在连接时提供匹配的私钥:

  • 可将大多数客户端配置为使用__默认密钥__。 例如,在 Linux 和 Unix 环境中,ssh 客户端会在 ~/.ssh/id_rsa 位置查找私钥。

  • 可以指定__私钥的路径__。 在 ssh 客户端中,可使用 -i 参数指定私钥的路径。 例如,ssh -i ~/.ssh/id_rsa sshuser@myedge.mycluster-ssh.azurehdinsight.cn

  • 如果对不同的服务器使用__多个私钥__,可以考虑使用 ssh-agent (https://en.wikipedia.org/wiki/Ssh-agent) 之类的实用工具。 在建立 SSH 会话时,可以通过 ssh-agent 实用工具自动选择要使用的密钥。

Important

如果使用密码保护私钥,使用该密钥时必须输入密码。 为提供方便,ssh-agent 等实用工具可以缓存密码。

创建 SSH 密钥对

使用 ssh-keygen 命令创建公钥和私钥文件。 以下命令生成可在 HDInsight 中使用的 2048 位 RSA 密钥对:

ssh-keygen -t rsa -b 2048

在创建密钥的过程中,系统会提示输入信息。 例如,密钥的存储位置,或者是否要使用密码。 完成该过程后,将创建两个文件:一个公钥文件和一个私钥文件。

  • __公钥__用于创建 HDInsight 群集。 公钥的扩展名为 .pub

  • __私钥__用于在 HDInsight 群集中对客户端进行身份验证。

Important

可以使用密码保护密钥。 密码实际上是私钥中的一个密码。 即使有人获取了私钥,但他们必须知道该密码才能使用该私钥。

使用公钥创建 HDInsight

创建方法 如何使用公钥
Azure 门户 取消选中“使用与群集登录相同的密码”,并选择“公钥”作为 SSH 身份验证类型。 最后,在“SSH 公钥”字段中选择公钥文件,或粘贴该文件的文本内容。
创建 HDInsight 群集时的 SSH 公钥对话框
Azure PowerShell 使用 New-AzureRmHdinsightCluster cmdlet 的 -SshPublicKey 参数,并以字符串的形式传递公钥内容。
Azure CLI 1.0 使用 azure hdinsight cluster create 命令的 --sshPublicKey 参数,并以字符串的形式传递公钥内容。
Resource Manager 模板 有关在模板中使用 SSH 密钥的示例,请参阅 Deploy HDInsight on Linux with SSH key(使用 SSH 密钥在 Linux 上部署 HDInsight)。 azuredeploy.json 文件中的 publicKeys 元素用于在创建群集时向 Azure 传递密钥。

身份验证:密码

可以使用密码保护 SSH 帐户。 使用 SSH 连接到 HDInsight 时,系统会提示输入密码。

Warning

不建议将密码身份验证用于 SSH。 密码可能被猜出,容易受到暴力破解攻击。 我们建议使用 SSH 密钥进行身份验证

使用密码创建 HDInsight

创建方法 如何指定密码
Azure 门户 默认情况下,SSH 用户帐户的密码与群集登录帐户的密码相同。 要使用不同的密码,请取消选中“使用与群集登录相同的密码”,并在“SSH 密码”字段中输入密码。
创建 HDInsight 群集时的 SSH 密码对话框
Azure PowerShell 使用 New-AzureRmHdinsightCluster cmdlet 的 --SshCredential 参数,并传递包含 SSH 用户帐户名和密码的 PSCredential 对象。
Azure CLI 1.0 使用 azure hdinsight cluster create 命令的 --sshPassword 参数,并提供密码值。
Resource Manager 模板 有关在模板中使用密码的示例,请参阅 Deploy HDInsight on Linux with SSH password(使用 SSH 密码在 Linux 上部署 HDInsight)。 azuredeploy.json 文件中的 linuxOperatingSystemProfile 元素用于在创建群集时向 Azure 传递 SSH 帐户名和密码。

更改 SSH 密码

有关更改 SSH 用户帐户密码的信息,请参阅 Manage HDInsight(管理 HDInsight)文档的 Change passwords(更改密码)部分。

连接到节点

可以通过 Internet 在端口 22 和 23 上访问头节点和边缘节点(如果有)。

  • 连接到头节点时,请使用端口 22 连接到主头节点,使用端口 23 连接到辅助头节点。 要使用的完全限定的域名为 clustername-ssh.azurehdinsight.cn,其中的 clustername 为群集的名称。

    # Connect to primary head node
    # port not specified since 22 is the default
    ssh sshuser@clustername-ssh.azurehdinsight.cn
    
    # Connect to secondary head node
    ssh -p 23 sshuser@clustername-ssh.azurehdinsight.cn
    
  • 连接到边缘节点时请使用端口 22。 完全限定的域名为 edgenodename.clustername-ssh.azurehdinsight.cn,其中的 edgenodename 是在创建边缘节点时提供的名称。 clustername 是群集的名称。

    # Connect to edge node
    ssh sshuser@edgnodename.clustername-ssh.azurehdinsight.cn
    

Important

前面的示例假定你使用的是密码身份验证,或者系统会自动进行证书身份验证。 如果使用 SSH 密钥对进行身份验证,且系统不会自动使用证书,则请使用 -i 参数指定私钥。 例如,ssh -i ~/.ssh/mykey sshuser@clustername-ssh.azurehdinsight.cn

连接以后,提示符会改为指示 SSH 用户名和连接到的节点。 例如,在以 sshuser 身份连接到主头节点时,提示符为 sshuser@hn0-clustername:~$

连接到工作节点和 Zookeeper 节点

工作节点和 Zookeeper 节点不能从 Internet 直接访问, 但可以从群集头节点或边缘节点访问。 以下是连接到其他节点的一般步骤:

  1. 使用 SSH 连接到头节点或边缘节点:

     ssh sshuser@myedge.mycluster-ssh.azurehdinsight.cn
    
  2. 通过 SSH 连接到头节点或边缘节点后,使用 ssh 命令连接到群集中的工作节点:

     ssh sshuser@wn0-myhdi
    

    若要检索群集中节点的域名列表,请参阅使用 Ambari REST API 管理 HDInsight 文档。

如果 SSH 帐户使用某个__密码__进行了保护,请在连接时输入该密码。

如果 SSH 帐户使用 __SSH 密钥__进行了保护,请确保在客户端启用 SSH 转发。

Note

直接访问群集中所有节点的另一种方法是在 Azure 虚拟网络中安装 HDInsight。 然后,可将远程计算机加入相同的虚拟网络,这样就可以直接访问群集中的所有节点。

有关详细信息,请参阅将 Use a virtual network with HDInsight(对 HDInsight 使用虚拟网络)。

配置 SSH 代理转发

Important

以下步骤假设在基于 Linux 或 UNIX 的系统上操作,并且能够使用基于 Windows 10 的 Bash。 如果这些步骤不适用于系统,可能需要查阅 SSH 客户端的文档。

  1. 使用文本编辑器打开 ~/.ssh/config。 如果此文件不存在,可以在命令行中输入 touch ~/.ssh/config 来创建。

  2. 将以下文本添加到 config 文件。

     Host <edgenodename>.<clustername>-ssh.azurehdinsight.cn
       ForwardAgent yes
    

    Host 信息替换为使用 SSH 连接到的节点的地址。 上面的示例使用边缘节点。 此条目为指定的节点配置 SSH 代理转发。

  3. 在终端中通过使用以下命令测试 SSH 代理转发:

     echo "$SSH_AUTH_SOCK"
    

    此命令返回类似于以下文本的信息:

     /tmp/ssh-rfSUL1ldCldQ/agent.1792
    

    如未返回任何信息,则 ssh-agent 未运行。 有关详细信息,请参阅 Using ssh-agent with ssh (http://mah.everybody.org/docs/ssh)(将 ssh-agent 与 ssh 配合使用)中的代理启动脚本信息,或者查阅 SSH 客户端文档。

  4. 验证了 ssh-agent 处于运行状态后,请使用以下方式将 SSH 私钥添加到代理:

     ssh-add ~/.ssh/id_rsa
    

    如果私钥存储在不同文件中,请将 ~/.ssh/id_rsa 替换为该文件的路径。

  5. 使用 SSH 连接到群集边缘节点或头节点。 然后使用 SSH 命令连接到工作节点或 zookeeper 节点。 使用转发的密钥建立连接。

复制文件

scp 实用工具可以用来将文件复制到群集中的单个节点,或者从单个节点进行复制。 例如,以下命令将 test.txt 目录从本地系统复制到头主节点:

scp test.txt sshuser@clustername-ssh.azurehdinsight.cn:

由于未在 : 后指定路径,因此会将文件置于 sshuser 主目录。

以下示例将 test.txt 文件从头主节点上的 sshuser 主目录复制到本地系统:

scp sshuser@clustername-ssh.azurehdinsight.cn:test.txt .

Important

scp 只能访问群集中单个节点的文件系统。 它不能用来访问适用于群集且兼容 HDFS 的存储中的数据。

需要通过 SSH 会话上传要使用的资源时,请使用 scp。 例如,上传一个 Python 脚本,然后通过 SSH 会话运行该脚本。

若要了解如何将数据直接加载到兼容 HDFS 的存储中,请参阅以下文档:

后续步骤