将可视化软件连接到 Hadoop on Google Cloud

Last reviewed 2024-04-17 UTC

本教程是系列文章的第二篇,其中介绍了如何构建端到端解决方案,以使数据分析师在使用商业智能 (BI) 工具时能够安全地访问数据。

本教程面向设置环境以便为数据分析师使用的商业智能 (BI) 工具提供数据和处理功能的运营商和 IT 管理员。

在本教程中,Tableau 用作 BI 工具。如需按照本指南执行操作,您必须在工作站上安装 Tableau Desktop。

该系列包含以下几个部分:

  • 该系列的第一部分是用于将可视化软件连接到 Hadoop on Google Cloud 的架构,定义了解决方案的架构及其组件以及组件如何交互。
  • 本系列的第二部分介绍如何在 Google Cloud 上设置构成 Hive 拓扑的架构组件。本教程使用来自 Hadoop 生态系统的开源工具,并使用 Tableau 作为 BI 工具。

本教程中的代码段可在 GitHub 代码库中找到。GitHub 代码库还包含 Terraform 配置文件,帮助您设置有效原型。

在本教程中,您将名字 sara 用作数据分析师的虚构用户身份。此用户身份位于 Apache KnoxApache Ranger 使用的 LDAP 目录中。您也可以选择配置 LDAP 群组,但此过程不在本教程的介绍范围内。

目标

  • 创建端到端设置,使商业智能工具能够使用 Hadoop 环境中的数据。
  • 对用户请求进行身份验证和授权。
  • 在商业智能工具与集群之间设置和使用安全通信通道。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Dataproc, Cloud SQL, and Cloud Key Management Service (Cloud KMS) API。

    启用 API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Dataproc, Cloud SQL, and Cloud Key Management Service (Cloud KMS) API。

    启用 API

初始化环境

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  2. 在 Cloud Shell 中,使用项目 ID 和 Dataproc 集群的区域和可用区设置环境变量:

    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    export REGION=us-central1
    export ZONE=us-central1-b
    

    您可以选择任何区域和可用区,但请按照本教程的说明进行操作。

设置服务账号

  1. 在 Cloud Shell 中,创建服务账号

    gcloud iam service-accounts create cluster-service-account \
      --description="The service account for the cluster to be authenticated as." \
      --display-name="Cluster service account"
    

    集群使用此账号访问 Google Cloud 资源。

  2. 将以下角色添加到服务账号:

    • Dataproc Worker:创建和管理 Dataproc 集群。
    • Cloud SQL Editor:可让 Ranger 使用 Cloud SQL 代理连接到其数据库。
    • Cloud KMS CryptoKey Decrypter:解密使用 Cloud KMS 加密的密码。

      bash -c 'array=( dataproc.worker cloudsql.editor cloudkms.cryptoKeyDecrypter )
      for i in "${array[@]}"
      do
        gcloud projects add-iam-policy-binding ${PROJECT_ID} \
          --member "serviceAccount:cluster-service-account@${PROJECT_ID}.iam.gserviceaccount.com" \
          --role roles/$i
      done'
      

创建后端集群

在本部分中,您将创建 Ranger 所在的后端集群。您还将创建 Ranger 数据库来存储政策规则,并在 Hive 中创建一个示例表以应用 Ranger 政策。

创建 Ranger 数据库实例

  1. 创建 MySQL 实例以存储 Apache Ranger 政策:

    export CLOUD_SQL_NAME=cloudsql-mysql
    gcloud sql instances create ${CLOUD_SQL_NAME} \
        --tier=db-n1-standard-1 --region=${REGION}
    

    此命令会创建一个名为 cloudsql-mysql 的实例,其含有位于通过 ${REGION} 变量指定的区域中的机器类型 db-n1-standard-1。如需了解详情,请参阅 Cloud SQL 文档

  2. 为从任何主机连接的用户 root 设置实例密码。您可以使用示例密码进行演示,也可以创建自己的密码。如果您创建自己的密码,请至少使用 8 个字符(其中至少包含一个字母和一个数字)。

    gcloud sql users set-password root \
      --host=% --instance ${CLOUD_SQL_NAME} --password mysql-root-password-99
    

加密密码

在本部分中,您将创建一个加密密钥来加密 Ranger 和 MySQL 的密码。为了防止渗漏,请将加密密钥存储在 Cloud KMS 中。出于安全考虑,您无法查看、提取或导出密钥位。

您可以使用加密密钥来加密密码并将其写入文件中。您可以将这些文件上传到 Cloud Storage 存储分区,以便代表集群执行操作的服务账号将可以访问这些文件。服务账号可以解密这些文件,因为服务账号具有 cloudkms.cryptoKeyDecrypter 角色,并且可以访问文件和加密密钥。即使文件被泄露,也无法在没有角色和密钥的情况下解密文件。

作为一项额外的安全措施,可为每项服务创建单独的密码文件。这样一来,即使泄露了密码,也可以最大限度地减少可能受影响的区域。

如需详细了解密钥管理,请参阅 Cloud KMS 文档

  1. 在 Cloud Shell 中,创建 Cloud KMS 密钥环以保存密钥:

    gcloud kms keyrings create my-keyring --location global
    
  2. 如需对密码进行加密,请创建 Cloud KMS 加密密钥

    gcloud kms keys create my-key \
      --location global \
      --keyring my-keyring \
      --purpose encryption
    
  3. 使用密钥加密 Ranger 管理员用户密码。您可以使用示例密码,也可以创建自己的密码。密码必须至少包含 8 个字符(其中至少包含一个字母和一个数字)。

    echo "ranger-admin-password-99" | \
    gcloud kms encrypt \
      --location=global \
      --keyring=my-keyring \
      --key=my-key \
      --plaintext-file=- \
      --ciphertext-file=ranger-admin-password.encrypted
    
  4. 使用该密钥加密 Ranger 数据库管理员用户密码:

    echo "ranger-db-admin-password-99" | \
    gcloud kms encrypt \
      --location=global \
      --keyring=my-keyring \
      --key=my-key \
      --plaintext-file=- \
      --ciphertext-file=ranger-db-admin-password.encrypted
    
  5. 使用该密钥加密 MySQL 根密码:

    echo "mysql-root-password-99" | \
    gcloud kms encrypt \
      --location=global \
      --keyring=my-keyring \
      --key=my-key \
      --plaintext-file=- \
      --ciphertext-file=mysql-root-password.encrypted
    
  6. 创建 Cloud Storage 存储分区以存储加密的密码文件:

    gsutil mb -l ${REGION} gs://${PROJECT_ID}-ranger
    
  7. 将加密的密码文件上传到 Cloud Storage 存储分区:

    gsutil -m cp *.encrypted gs://${PROJECT_ID}-ranger
    

创建集群

在本部分中,您将创建一个支持 Ranger 的后端集群。如需详细了解 Dataproc 中的 Ranger 可选组件,请参阅 Dataproc Ranger 组件文档页面

  1. 在 Cloud Shell 中,创建 Cloud Storage 存储分区以存储 Apache Solr 审核日志:

    gsutil mb -l ${REGION} gs://${PROJECT_ID}-solr
    
  2. 导出创建集群所需的所有变量:

    export BACKEND_CLUSTER=backend-cluster
    
    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    export REGION=us-central1
    export ZONE=us-central1-b
    export CLOUD_SQL_NAME=cloudsql-mysql
    
    export RANGER_KMS_KEY_URI=\
    projects/${PROJECT_ID}/locations/global/keyRings/my-keyring/cryptoKeys/my-key
    
    export RANGER_ADMIN_PWD_URI=\
    gs://${PROJECT_ID}-ranger/ranger-admin-password.encrypted
    
    export RANGER_DB_ADMIN_PWD_URI=\
    gs://${PROJECT_ID}-ranger/ranger-db-admin-password.encrypted
    
    export MYSQL_ROOT_PWD_URI=\
    gs://${PROJECT_ID}-ranger/mysql-root-password.encrypted
    

    为方便起见,系统会在此命令中重复之前设置的一些变量,以便您可以根据需要进行修改。

    新变量包含:

    • 后端集群的名称。
    • 加密密钥的 URI,以便服务账号可以解密密码。
    • 包含加密密码的文件的 URI。

    如果您使用了其他密钥环或密钥,或者使用了不同的文件名,请在命令中使用相应值。

  3. 创建后端 Dataproc 集群:

    gcloud beta dataproc clusters create ${BACKEND_CLUSTER} \
      --optional-components=SOLR,RANGER \
      --region ${REGION} \
      --zone ${ZONE} \
      --enable-component-gateway \
      --scopes=default,sql-admin \
      --service-account=cluster-service-account@${PROJECT_ID}.iam.gserviceaccount.com \
      --properties="\
    dataproc:ranger.kms.key.uri=${RANGER_KMS_KEY_URI},\
    dataproc:ranger.admin.password.uri=${RANGER_ADMIN_PWD_URI},\
    dataproc:ranger.db.admin.password.uri=${RANGER_DB_ADMIN_PWD_URI},\
    dataproc:ranger.cloud-sql.instance.connection.name=${PROJECT_ID}:${REGION}:${CLOUD_SQL_NAME},\
    dataproc:ranger.cloud-sql.root.password.uri=${MYSQL_ROOT_PWD_URI},\
    dataproc:solr.gcs.path=gs://${PROJECT_ID}-solr,\
    hive:hive.server2.thrift.http.port=10000,\
    hive:hive.server2.thrift.http.path=cliservice,\
    hive:hive.server2.transport.mode=http"
    

    此命令具有以下属性:

    • 此命令中的最后三行是 Hive 属性,用于在 HTTP 模式下配置 HiveServer2,以便 Apache Knox 可通过 HTTP 调用 Apache Hive。
    • 此命令中的其他参数的作用如下所示:
      • --optional-components=SOLR,RANGER 参数可启用 Apache Ranger 及其 Solr 依赖项。
      • 借助 --enable-component-gateway 参数,Dataproc 组件网关可以直接从 Google Cloud 控制台的集群页面中提供 Ranger 和其他 Hadoop 界面。设置此参数时,无需通过 SSH 隧道连接到后端主节点。
      • --scopes=default,sql-admin 参数可授权 Apache Ranger 访问其 Cloud SQL 数据库。

如果您需要创建超出任何集群生命周期的外部 Hive Metastore 并且可以跨多个集群使用,请参阅在 Dataproc 上使用 Apache Hive。如需运行该过程,您必须直接在 Beeline 上运行表创建示例。虽然 gcloud dataproc jobs submit hive 命令使用 Hive 二进制传输,但在通过 HTTP 模式配置时,这些命令与 HiveServer2 不兼容。

创建示例 Hive 表

  1. 在 Cloud Shell 中,创建 Cloud Storage 存储分区以存储示例 Apache Parquet 文件:

    gsutil mb -l ${REGION} gs://${PROJECT_ID}-hive
    
  2. 将公开可用的示例 Parquet 文件复制到您的存储分区中:

    gsutil cp gs://hive-solution/part-00000.parquet \
      gs://${PROJECT_ID}-hive/dataset/transactions/part-00000.parquet
    
  3. 使用 SSH 连接到您在上一部分中创建的后端集群的主节点:

    gcloud compute ssh --zone ${ZONE} ${BACKEND_CLUSTER}-m
    

    集群主节点的名称是集群的名称后跟 -m.。高可用性集群主节点名称具有额外的后缀

    如果您是第一次从 Cloud Shell 连接到主节点,系统会提示您生成 SSH 密钥。

  4. 在通过 SSH 打开的终端中,使用预先安装在主节点上的 Apache Beeline 连接到本地 HiveServer2:

    beeline -u "jdbc:hive2://localhost:10000/;transportMode=http;httpPath=cliservice admin admin-password"\
      --hivevar PROJECT_ID=$(gcloud info --format='value(config.project)')
    

    此命令会启动 Beeline 命令行工具,并在环境变量中传递 Google Cloud 项目的名称。

    Hive 不执行任何用户身份验证,但执行大多数任务都需要用户身份。此处的 admin 用户是在 Hive 中配置的默认用户。在本教程的后面,您使用 Apache Knox 配置的身份提供商会为来自 BI 工具的任何请求处理用户身份验证。

  5. 在 Beeline 提示中,使用您之前复制到 Hive 存储分区的 Parquet 文件创建一个表:

    CREATE EXTERNAL TABLE transactions
      (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING)
      STORED AS PARQUET
      LOCATION 'gs://${PROJECT_ID}-hive/dataset/transactions';
    
  6. 验证该表是否已正确创建:

    SELECT *
      FROM transactions
      LIMIT 10;
    
    SELECT TransactionType, AVG(TransactionAmount) AS AverageAmount
      FROM transactions
      WHERE SubmissionDate = '2017-12-22'
      GROUP BY TransactionType;
    

    两个查询的结果会显示在 Beeline 提示中。

  7. 退出 Beeline 命令行工具:

    !quit
    
  8. 复制后端主实例的内部 DNS 名称:

    hostname -A | tr -d '[:space:]'; echo
    

    您将在下一部分中使用此名称作为 backend-master-internal-dns-name 来配置 Apache Knox 拓扑。您还可以使用此名称在 Ranger 中配置服务。

  9. 退出节点上的终端:

    exit
    

创建代理集群

在本部分中,您将创建具有 Apache Knox 初始化操作的代理集群。

创建拓扑

  1. 在 Cloud Shell 中,克隆 Dataproc 初始化操作 GitHub 代码库

    git clone https://github.com/GoogleCloudDataproc/initialization-actions.git
    
  2. 为后端集群创建拓扑:

    export KNOX_INIT_FOLDER=`pwd`/initialization-actions/knox
    cd ${KNOX_INIT_FOLDER}/topologies/
    mv example-hive-nonpii.xml hive-us-transactions.xml
    

    Apache Knox 使用该文件的名称作为拓扑的网址路径。在此步骤中,您将更改该名称来表示名为 hive-us-transactions 的拓扑。然后,您可以在创建示例 Hive 表中访问加载到 Hive 中的虚构事务数据

  3. 修改拓扑文件:

    vi hive-us-transactions.xml
    

    如需查看后端服务的配置方式,请参阅拓扑描述符文件。此文件定义指向一个或多个后端服务的拓扑。以相同的示例值配置两项服务:WebHDFS 和 HIVE。该文件还为该拓扑中的服务和授权 ACL 定义了身份验证提供方。

  4. 添加数据分析师示例 LDAP 用户身份 sara

    <param>
       <name>hive.acl</name>
       <value>admin,sara;*;*</value>
    </param>
    

    添加示例身份可让用户通过 Apache Knox 访问 Hive 后端服务。

  5. 将 HIVE 网址更改为指向后端集群 Hive 服务。您可以在文件底部的 WebHDFS 下找到 HIVE 服务定义。

    <service>
      <role>HIVE</role>
      <url>http://<backend-master-internal-dns-name>:10000/cliservice</url>
    </service>
    
  6. <backend-master-internal-dns-name> 占位符替换为您在创建示例 Hive 表中获取的后端集群的内部 DNS 名称。

  7. 保存该文件并关闭编辑器

如需创建其他拓扑,请重复本部分中的步骤。为每个拓扑创建一个独立的 XML 描述符。

创建代理集群中,将这些文件复制到 Cloud Storage 存储分区中。如需创建新的拓扑,或者在创建代理集群后更改拓扑,请修改该文件并再次上传到存储分区。Apache Knox 初始化操作会创建一个 Cron 作业,该作业会定期将存储分区中的更改复制到代理集群。

配置 SSL/TLS 证书

客户端在与 Apache Knox 通信时使用 SSL/TLS 证书。初始化操作可以生成自签名证书,或者您可以提供您的 CA 签名的证书。

  1. 在 Cloud Shell 中,修改 Apache Knox 常规配置文件:

    vi ${KNOX_INIT_FOLDER}/knox-config.yaml
    
  2. HOSTNAME 替换为代理主节点的外部 DNS 名称作为 certificate_hostname 特性的值。在本教程中,请使用 localhost

    certificate_hostname: localhost
    

    在本教程后面部分中,您将创建 SSH 隧道和代理集群作为 localhost 值。

    Apache Knox 常规配置文件还包含 master_key,可加密 BI 工具用来与代理集群通信的证书。默认情况下,此密钥是 secret 一词。

  3. 如果您要提供自己的证书,请更改以下两个属性:

    generate_cert: false
    custom_cert_name: <filename-of-your-custom-certificate>
    
  4. 保存该文件并关闭编辑器。

    如果您要提供自己的证书,可以在属性 custom_cert_name 中指定该证书。

创建代理集群

  1. 在 Cloud Shell 中,创建一个 Cloud Storage 存储分区。

    gsutil mb -l ${REGION} gs://${PROJECT_ID}-knox
    

    此存储分区提供了您在上一部分中创建的 Apache Knox 初始化操作的配置。

  2. 将 Apache Knox 初始化操作文件夹中的所有文件复制到该存储分区:

    gsutil -m cp -r ${KNOX_INIT_FOLDER}/* gs://${PROJECT_ID}-knox
    
  3. 导出创建集群所需的所有变量:

    export PROXY_CLUSTER=proxy-cluster
    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    export REGION=us-central1
    export ZONE=us-central1-b
    

    在此步骤中,系统会重复之前设置的一些变量,以便您可以根据需要进行修改。

  4. 创建代理集群:

    gcloud dataproc clusters create ${PROXY_CLUSTER} \
      --region ${REGION} \
      --zone ${ZONE} \
      --service-account=cluster-service-account@${PROJECT_ID}.iam.gserviceaccount.com \
      --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/knox/knox.sh \
      --metadata knox-gw-config=gs://${PROJECT_ID}-knox
    

通过代理验证连接

  1. 创建代理集群后,使用 SSH 从 Cloud Shell 连接到其主节点:

    gcloud compute ssh --zone ${ZONE} ${PROXY_CLUSTER}-m
    
  2. 从代理集群主节点的终端,运行以下查询:

    beeline -u "jdbc:hive2://localhost:8443/;\
    ssl=true;sslTrustStore=/usr/lib/knox/data/security/keystores/gateway-client.jks;trustStorePassword=secret;\
    transportMode=http;httpPath=gateway/hive-us-transactions/hive"\
      -e "SELECT SubmissionDate, TransactionType FROM transactions LIMIT 10;"\
      -n admin -p admin-password
    

此命令具有以下属性:

  • beeline 命令使用 localhost 而不是 DNS 内部名称,因为您在配置 Apache Knox 时生成的证书将 localhost 指定为主机名。如果您使用的是自己的 DNS 名称或证书,请使用相应的主机名。
  • 端口为 8443,它对应于 Apache Knox 默认 SSL 端口。
  • ssl=true 开头的行会启用 SSL,并提供 SSL 信任库的路径和密码,以供客户端应用(如 Beeline)使用。
  • transportMode 行表示请求应通过 HTTP 发送,并提供 HiveServer2 服务的路径。该路径由关键字 gateway、您在上一部分中定义的拓扑名称以及在同一拓扑中配置的服务名称(在本例中为 hive)组成。
  • -e 参数提供在 Hive 上运行的查询。如果省略此参数,则会在 Beeline 命令行工具中打开交互式会话。
  • -n 参数提供用户身份和密码。在此步骤中,您使用的是默认的 Hive admin 用户。在下一部分中,您将创建分析师用户身份并为该用户设置凭据和授权政策。

将用户添加到身份验证存储区

默认情况下,Apache Knox 包含基于 Apache Shiro 的身份验证提供方。此身份验证提供方针对 ApacheDS LDAP 存储区配置了 BASIC 身份验证。在本部分中,您将示例数据分析师用户身份 sara 添加到身份验证存储区。

  1. 从代理主节点的终端中,安装 LDAP 实用程序:

    sudo apt-get install ldap-utils
    
  2. 为新用户 sara 创建 LDAP 数据交换格式 (LDIF) 文件:

    export USER_ID=sara
    
    printf '%s\n'\
      "# entry for user ${USER_ID}"\
      "dn: uid=${USER_ID},ou=people,dc=hadoop,dc=apache,dc=org"\
      "objectclass:top"\
      "objectclass:person"\
      "objectclass:organizationalPerson"\
      "objectclass:inetOrgPerson"\
      "cn: ${USER_ID}"\
      "sn: ${USER_ID}"\
      "uid: ${USER_ID}"\
      "userPassword:${USER_ID}-password"\
    > new-user.ldif
    
  3. 将用户 ID 添加到 LDAP 目录:

    ldapadd -f new-user.ldif \
      -D 'uid=admin,ou=people,dc=hadoop,dc=apache,dc=org' \
      -w 'admin-password' \
      -H ldap://localhost:33389
    

    -D 参数指定 ldapadd 代表的用户访问该目录时要绑定的标识名 (DN)。DN 必须是该目录中已存在的用户身份,在本例中为用户 admin

  4. 验证新用户是否在身份验证存储区中:

    ldapsearch -b "uid=${USER_ID},ou=people,dc=hadoop,dc=apache,dc=org" \
      -D 'uid=admin,ou=people,dc=hadoop,dc=apache,dc=org' \
      -w 'admin-password' \
      -H ldap://localhost:33389
    

    用户详细信息显示在您的终端中。

  5. 复制并保存代理主节点的内部 DNS 名称:

    hostname -A | tr -d '[:space:]'; echo
    

    下一部分中使用此名称作为 <proxy-master-internal-dns-name> 配置 LDAP 同步。

  6. 退出节点上的终端:

    exit
    

设置授权

在本部分中,您将在 LDAP 服务和 Ranger 之间配置身份同步。

将用户身份同步到 Ranger

如需确保 Ranger 政策应用于 Apache Knox 所用的用户身份,您需要配置 Ranger UserSync 守护程序以同步同一目录中的身份。

在此示例中,您将连接到默认可通过 Apache Knox 访问的本地 LDAP 目录。但在生产环境中,我们建议您设置外部身份目录。如需了解详情,请参阅 Apache Knox 用户指南和 Google Cloud Cloud IdentityManaged Active Directory联合 AD 文档。

  1. 使用 SSH 连接到您创建的后端集群的主节点:

    export BACKEND_CLUSTER=backend-cluster
    gcloud compute ssh --zone ${ZONE} ${BACKEND_CLUSTER}-m
    
  2. 在终端中,修改 UserSync 配置文件:

    sudo vi /etc/ranger/usersync/conf/ranger-ugsync-site.xml
    
  3. 设置以下 LDAP 属性的值。请务必修改 user 属性,而不是名称类似的 group 属性。

    <property>
      <name>ranger.usersync.sync.source</name>
      <value>ldap</value>
    </property>
    
    <property>
      <name>ranger.usersync.ldap.url</name>
      <value>ldap://<proxy-master-internal-dns-name>:33389</value>
    </property>
    
    <property>
      <name>ranger.usersync.ldap.binddn</name>
      <value>uid=admin,ou=people,dc=hadoop,dc=apache,dc=org</value>
    </property>
    
    <property>
      <name>ranger.usersync.ldap.ldapbindpassword</name>
      <value>admin-password</value>
    </property>
    
    <property>
      <name>ranger.usersync.ldap.user.searchbase</name>
      <value>dc=hadoop,dc=apache,dc=org</value>
    </property>
    
    <property>
      <name>ranger.usersync.source.impl.class</name>
      <value>org.apache.ranger.ldapusersync.process.LdapUserGroupBuilder</value>
    </property>
    

    <proxy-master-internal-dns-name> 占位符替换为您在上一部分中检索到的代理服务器的内部 DNS 名称。

    这些属性是同步用户和群组的完整 LDAP 配置的子集。如需了解详情,请参阅如何将 Ranger 与 LDAP 集成

  4. 保存该文件并关闭编辑器。

  5. 重启 ranger-usersync 守护程序:

    sudo service ranger-usersync restart
    
  6. 运行以下命令:

    grep sara /var/log/ranger-usersync/*
    

    如果身份同步,您至少会看到用户 sara 的一个日志行。

创建 Ranger 政策

在本部分中,您将在 Ranger 中配置新的 Hive 服务。您还将设置并测试 Ranger 政策,以限制特定身份对 Hive 数据的访问权限。

配置 Ranger 服务

  1. 在主节点的终端中,修改 Ranger Hive 配置:

    sudo vi /etc/hive/conf/ranger-hive-security.xml
    
  2. 修改 ranger.plugin.hive.service.name 属性的 <value> 属性:

    <property>
       <name>ranger.plugin.hive.service.name</name>
       <value>ranger-hive-service-01</value>
       <description>
         Name of the Ranger service containing policies for this YARN instance
       </description>
    </property>
    
  3. 保存该文件并关闭编辑器。

  4. 重启 HiveServer2 Admin 服务:

    sudo service hive-server2 restart
    

    您现在可以创建 Ranger 政策了。

在 Ranger 管理控制台中设置服务

  1. 在 Google Cloud 控制台中,转到 Dataproc 页面

  2. 点击后端集群名称,然后点击 Web 界面

    由于您使用组件网关创建集群,因此您会看到集群中已安装的 Hadoop 组件列表。

  3. 点击 Ranger 链接以打开 Ranger 控制台。

  4. 使用用户 admin 和 Ranger 管理员密码登录 Ranger。Ranger 控制台显示“服务管理器”页面,其中包含服务列表。

  5. 点击 HIVE 组中的加号以创建新的 Hive 服务。

    Ranger 服务管理器。

  6. 在表单中设置以下值:

    • 服务名称:ranger-hive-service-01。您之前在 ranger-hive-security.xml 配置文件中定义了此名称。
    • 用户名:admin
    • 密码:admin-password
    • jdbc.driverClassName:将默认名称保留为 org.apache.hive.jdbc.HiveDriver
    • jdbc.urljdbc:hive2:<backend-master-internal-dns-name>:10000/;transportMode=http;httpPath=cliservice
    • <backend-master-internal-dns-name> 占位符替换为您在上一部分中检索到的名称。
  7. 点击添加

    每个 Ranger 插件安装都支持单个 Hive 服务。配置其他 Hive 服务的一种简单方法是启动其他后端集群。每个集群都有自己的 Ranger 插件。这些集群可以共用同一个 Ranger 数据库,因此,每当您访问任何集群中的 Ranger 管理控制台时,都可以统一查看所有服务。

设置权限受限的 Ranger 政策

该政策允许示例分析师 LDAP 用户 sara 访问 Hive 表的特定列。

  1. 在 Service Manager 窗口中,点击您创建的服务的名称。

    Ranger 管理控制台会显示政策窗口。

  2. 点击添加新政策

    使用此政策时,您授权 sara 仅查看表事务中的 submissionDatetransactionType 列。

  3. 在表单中设置以下值:

    • 政策名称:任意名称,例如 allow-tx-columns
    • 数据库:default
    • 表:transactions
    • Hive 列:submissionDate, transactionType
    • 允许条件:
      • 选择用户:sara
      • 权限:select
  4. 点击屏幕底部的添加

使用 Beeline 测试政策

  1. 在主节点终端中,以用户 sara 身份启动 Beeline 命令行工具。

    beeline -u "jdbc:hive2://localhost:10000/;transportMode=http;httpPath=cliservice sara user-password"
    

    虽然 Beeline 命令行工具不会强制使用密码,但您必须提供密码才能运行上述命令。

  2. 运行以下查询以验证 Ranger 是否阻止了它。

     SELECT *
       FROM transactions
       LIMIT 10;
    

    该查询包含列 transactionAmount,但 sara 无权选择它。

    系统会显示 Permission denied 错误。

  3. 验证 Ranger 是否允许以下查询:

    SELECT submissionDate, transactionType
      FROM transactions
      LIMIT 10;
    
  4. 退出 Beeline 命令行工具:

    !quit
    
  5. 退出终端:

    exit
    
  6. 在 Ranger 控制台中,点击审核标签页。已拒绝和已允许的事件都会显示出来。您可以按先前定义的服务名称(例如 ranger-hive-service-01)过滤事件。

    “Ranger 审核”标签页。

通过 BI 工具连接

本教程中的最后一步是通过 Tableau Desktop 查询 Hive 数据。

创建防火墙规则

  1. 复制并保存您的公共 IP 地址
  2. 在 Cloud Shell 中,创建用于从工作站为入站流量打开 TCP 端口 8443 的防火墙规则:

    gcloud compute firewall-rules create allow-knox\
      --project=${PROJECT_ID} --direction=INGRESS --priority=1000 \
      --network=default --action=ALLOW --rules=tcp:8443 \
      --target-tags=knox-gateway \
      --source-ranges=<your-public-ip>/32
    

    <your-public-ip> 占位符替换为您的公共 IP 地址。

  3. 将该防火墙规则中的网络标记应用于代理集群的主节点:

    gcloud compute instances add-tags ${PROXY_CLUSTER}-m --zone=${ZONE} \
      --tags=knox-gateway
    

创建 SSH 隧道

仅当您使用对 localhost 有效的自签名证书时,才需要执行此过程。如果您使用的是自己的证书,或者如果代理主节点有自己的外部 DNS 名称,则可以跳至连接到 Hive

  1. 在 Cloud Shell 中,生成用于创建隧道的命令:

    echo "gcloud compute ssh ${PROXY_CLUSTER}-m \
      --project ${PROJECT_ID} \
      --zone ${ZONE} \
      -- -L 8443:localhost:8443"
    
  2. 运行 gcloud init 对您的用户账号进行身份验证并授予访问权限。

  3. 在工作站中打开一个终端。

  4. 创建 SSH 隧道以转发端口 8443。复制在第一步中生成的命令,将其粘贴到工作站终端,然后运行该命令。

  5. 保持该终端打开,以使隧道保持活跃状态。

连接到 Hive

  1. 在您的工作站上,安装 Hive ODBC 驱动程序
  2. 打开 Tableau 桌面,或将其重启(如果已打开)。
  3. 在首页上的连接/到服务器下,选择更多
  4. 搜索并选择 Cloudera Hadoop
  5. 使用示例数据分析师 LDAP 用户 sara 作为用户身份,如下所示填写字段:

    • 服务器:如果您创建了隧道,请使用 localhost。如果您没有创建隧道,请使用代理主节点的外部 DNS 名称。
    • 端口:8443
    • 类型:HiveServer2
    • 身份验证:UsernamePassword
    • 用户名:sara
    • 密码:sara-password
    • HTTP 路径:gateway/hive-us-transactions/hive
    • 需要使用 SSL:yes
  6. 点击登录

    包含 Sara 输入信息的示例字段。

查询 Hive 数据

  1. 数据源屏幕上,点击选择架构,然后搜索 default
  2. 双击 default 架构名称。

    系统加载面板。

  3. 面板中,双击新的自定义 SQL (New Custom SQL)。

    随即会打开修改自定义 SQL (Edit Custom SQL) 窗口。

  4. 输入以下查询,以从事务表中选择日期和事务类型:

    SELECT `submissiondate`,
           `transactiontype`
    FROM `default`.`transactions`
    
  5. 点击确定

    查询的元数据是从 Hive 中检索的。

  6. 点击 Update Now

    Tableau 会从 Hive 中检索数据,因为 sara 有权从 transactions 表中读取这两列。

    显示了“事务”表中两列的 Tableau 查询示例。

  7. 如需尝试从 transactions 表中选择所有列,请在面板中,再次双击新的自定义 SQL (New Custom SQL)。随即会打开修改自定义 SQL (Edit Custom SQL) 窗口。

  8. 输入以下查询:

    SELECT *
    FROM `default`.`transactions`
    
  9. 点击确定。系统会显示以下错误消息:

    Permission denied: user [sara] does not have [SELECT] privilege on [default/transactions/*]

    由于 sara 无权从 Ranger 读取 transactionAmount 列,因此会显示此消息。此示例展示了如何限制 Tableau 用户可以访问哪些数据。

    如需查看所有列,请使用用户 admin 重复执行上述步骤。

  10. 关闭 Tableau 和终端窗口。

清除数据

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤