Ambari 操作指南 (Ambari Operations) 之二

(继  Ambari 操作指南 (Ambari Operations) 之一  https://blog.csdn.net/devalone/article/details/80781652)

 

5. 管理服务高可用性 (Managing Service High Availability)



Ambari web 提供了向导驱动的用户体验,可以配置一些 Hortonworks Data Platform (HDP) stack 服务组件的高可用性。高可用性通过建立主(primary)
和从(secondary) 组件来提供保险。在主组件故障或变为不可用情况下,从组件成为可用。为一个服务配置了高可用性之后,Ambari 可以管理或禁用((roll
back) 该服务内组件的高可用性。



5.1 NameNode 的高可用性 (NameNode High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
为了确保集群上在主 NameNode 主机故障时,另一个 NameNode 总是可用,可用利用 Ambari Web 在集群上启用并配置 NameNode 高可用性。




5.1.1 配置 NameNode 的高可用性 (Configuring NameNode High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------

前提要求:
    
    ● 核实集群中至少有三部主机,并且至少运行三个 Apache ZooKeeper servers
    ● 确保 Hadoop Distributed File System (HDFS) 和 ZooKeeper 没有运行在维护模式
      在启用 NameNode HA 时,HDFS 和 ZooKeeper 必须停止然后启动。维护模式会阻止这类启动和停止操作。如果 HDFS 或 ZooKeeper 处于维护模式,
      NameNode HA 向导不会完全成功。

步骤:      
    (1) 在 Ambari Web, 选择 Services > HDFS > Summary.
    (2) 单击 Service Actions, 然后单击 Enable NameNode HA
    (3) Enable HA wizard 启动。这个向导描述了一系列必须执行的自动和手动的步骤来建立 NameNode 高可用性
    (4) 在 Get Started 页面,输入 Nameservice ID, 然后单击 Next
        在设置了 HA 之后,使用这个 Nameservice ID 而不是 NameNode FDQN
        
    (5) 在 Select Hosts 页面,选择一部主机最为附加 NameNode 以及 JournalNodes,然后单击 Next
    (6) 在 Review 页,确认主机的选择,然后单击 Next
    (7) 跟随 Manual Steps Required: Create Checkpoint on NameNode 页面上的指导,单击 Next
        必须登录到当前 NameNode 主机并运行命令,将 NameNode 置于安全模式并创建检查点
    
    (8) 当 Ambari 检测成功,并且窗口底部的消息变为 Checkpoint created, 单击 Next
    (9) 在 Configure Components 页面,监控配置进度条,然后单击 Next
    (10)在 Manual Steps Required: Initialize JournalNodes 页面跟随指导,然后单击 Next
        必须登录到当前 NameNode 主机运行命令来初始化 JournalNodes.
    (11)当 Ambari 检测成功,并窗口底部的消息变为 JournalNodes initialized 时,单击 Next
    (12)在 Start Components 页面,监控 ZooKeeper servers 和 NameNode 启动进度条,然后单击 Next
        在启用 Ranger 的集群上,并且 Hive 配置为使用 MySQL, 如果 MySQL 停止,Ranger 会启动失败。要解决这个问题,启动 Hive 的 MySQL 数据库
        然后重试启动组件
    (13)在 Manual Steps Required: Initialize NameNode HA Metadata 页面,根据页面上的指导,完成每一步骤,然后单击 Next
        在这一步,必须登录到当前 NameNode 和附加 NameNode 主机。确保每个命令登录到正确的主机,在完成每一个命令后,单击 OK 确认。
    
    (14)在 Finalize HA Setup 页,监控向导完成 HA 设置的进度条,单击 Done 结束向导。
        在 Ambari Web UI 重新载入之后,可能会看到一些警报通知。等几分钟直到所有服务重启
    (15)如果必要,使用 Ambari Web 重启任何组件
    (16)如果使用 Hive, 必须手动修改 Hive Metastore FS root 指向 Nameservice URI 而不是 NameNode URI. 在 Get Started 步骤创建的 Nameservice ID
    
        步骤:
            a. 在 Hive 主机上找到 FS root:
            hive --config /etc/hive/conf/conf.server --service metatool -listFSRoot
            输出类似于:
            Listing FS Roots... hdfs://<namenodehost>/apps/hive/warehouse.
            
            
            b. 修改 FS root:
            $ hive --config /etc/hive/conf/conf.server --service metatool -updateLocation <new-location><old-location>
            
            例如,如果 Nameservice ID 为 mycluster, 输入为:
            $ hive --config /etc/hive/conf/conf.server --service metatool -updateLocation hdfs://mycluster/apps/hive/warehouse    \
            hdfs://c6401.ambari.apache.org/apps/hive/warehouse
            
            输出类似于:
            Successfully updated the following locations...Updated X records in SDS table
    
    (17)调整 ZooKeeper Failover Controller retries 设置环境
        
        a. 浏览到 Services > HDFS > Configs > Advanced core-site
        b. 设置 ha.failover-controller.active-standbyelector.zk.op.retries=120.

    下面步骤:
        查看并确认所有建议的配置修改



5.1.2 回滚 NameNode 的高可用性 (CRolling Back NameNode HA)
-----------------------------------------------------------------------------------------------------------------------------------------
要禁用(roll back) NameNode 高可用性,执行如下步骤(取决于安装)

    (1)    停止 HBase
    (2)    检查点活动 NameNode
    (3)    停止所有服务
    (4)    为回滚准备 Ambari Server Host
    (5)    恢复 HBase 配置
    (6)    删除 ZooKeeper Failover 控制器
    (7)    修改 HDFS 配置
    (8)    重新创建 Secondary NameNode
    (9)    重新启用 Secondary NameNode
    (10)删除所有 JournalNodes
    (11)删除附属 NameNode
    (12)验证 HDFS 组件
    (13)启动 HDFS



5.1.2.1 停止 HBase (Stop HBase)
-----------------------------------------------------------------------------------------------------------------------------------------
    ① 在 Ambari Web 集群表盘,单击 HBase 服务
    ② 单击 Service Actions > Stop
    ③ 等待,直到 HBase 完全停止,然后继续



5.1.2.2 检查点活动 NameNode (Checkpoint the Active NameNode)
-----------------------------------------------------------------------------------------------------------------------------------------
如果在启用 NameNode HA 之后使用了 HDFS, 但想要回转到非 HA 状态,进行回滚之前必须要设置 HDFS 状态检查点。

如果在 Enable NameNode HA wizard 操作过程中失败并需要回转,可以忽略此步骤,继续进行停止所有服务。

设置 HDFS 状态检查点要求不同的语法,取决于集群上是否启用了 Kerberos 安全

    ● 如果集群上没有启用 Kerberos 安全,在活动 NameNode 主机上使用如下命令来保存名称空间
    sudo su -l <HDFS_USER> -c 'hdfs dfsadmin -safemode enter' sudo su -l <HDFS_USER> -c 'hdfs dfsadmin -saveNamespace'

    ● 如果集群上已经启用了 Kerberos 安全,使用如下命令来保存名称空间:
    sudo su -l <HDFS_USER> -c 'kinit -kt /etc/security/keytabs/nn.service.keytab nn/<HOSTNAME>@<REALM>;hdfs dfsadmin -safemode    \
    enter' sudo su -l <HDFS_USER> -c 'kinit -kt /etc/security/keytabs/nn.service.keytab nn/<HOSTNAME>@<REALM>;hdfs dfsadmin -saveNamespace'


    本例中 <HDFS_USER> 是 HDFS 服务的用户(如 hdfs), <HOSTNAME> 是 Active NameNode 主机名,<REALM> 是 Kerberos realm.



5.1.2.3 停止所有服务 (Stop All Services)
-----------------------------------------------------------------------------------------------------------------------------------------
在停止 HBase, 并且如有必要设置了 Activ NameNode 检查点之后,停止所有服务

    ① 在 Ambari Web, 单击 Services tab
    ② 单击 Stop All
    ③ 等待所有服务停止完成之后,继续



5.1.2.4 为回滚准备 Ambari Server 主机 (Prepare the Ambari Server Host for Rollback)
-----------------------------------------------------------------------------------------------------------------------------------------
为回滚过程准备:
    ① 登录到 Ambari server 主机
    ② 设置如下环境变量
    
        export AMBARI_USER=AMBARI_USERNAME    :替换为 Ambari Web 系统管理员,默认值为 admin
        export AMBARI_PW=AMBARI_PASSWORD    :替换为Ambari Web 系统管理员的口令, 默认值为 admin
        export AMBARI_PORT=AMBARI_PORT        :替换为 Ambari Web 端口,默认为 8080.
        export AMBARI_PROTO=AMBARI_PROTOCOL    :替换为连接到 Ambari Web 使用的协议,选项为 http 或 https, 默认为 http
        export CLUSTER_NAME=CLUSTER_NAME    :替换为集群名称,如 mycluster
        export NAMENODE_HOSTNAME=NN_HOSTNAME    :替换为 非 HA 的 NameNode 主机 FDQN, 例如 namenode.mycompany.com
        export ADDITIONAL_NAMENODE_HOSTNAME=ANN_HOSTNAME    :替换为设置 HA 时使用的附属 NameNode 主机的 FDQN
        export SECONDARY_NAMENODE_HOSTNAME=SNN_HOSTNAME        :替换为非 HA 设置的 secondary NameNode 主机的 FDQN
        export JOURNALNODE1_HOSTNAME=JOUR1_HOSTNAME    :替换为第一 Journal 节点主机的 FDQN
        export JOURNALNODE2_HOSTNAME=JOUR2_HOSTNAME    :替换为第二 Journal 节点主机的 FDQN
        export JOURNALNODE3_HOSTNAME=JOUR3_HOSTNAME :替换为第三 Journal 节点主机的 FDQN
    
    
    ③ 多检查几遍这些环境变量设置正确


5.1.2.5 恢复 HBase 配置 Host (Restore the HBase Configuration)
-----------------------------------------------------------------------------------------------------------------------------------------
如果安装了 HBase, 可能需要恢复到 HA 状态之前的配置。

    Note:
        对于 Ambari 2.6.0 及更高版本,不再支持 config.sh 并且会失败。使用 config.py

    ①     从 Ambari server 主机上,确定当前的 HBase 配置是否必须恢复:
        
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost     \
        <CLUSTER_NAME>    hbase-site
        
        使用为回滚准备 Ambari Server 主机设置的环境变量应用命令中的环境变量名。
        
        如果 hbase.rootdir 设置为 Enable NameNode HA 向导中设置的 NameService ID, 必须回转 hbase-site 到非 HA 的值。例如,在
        "hbase.rootdir":"hdfs://<name-service-id>:8020/apps/hbase/data" 中,hbase.rootdir 属性指向 NameService ID, 因此这个值必须回滚。
        
        如果 hbase.rootdir 指向一个特定的 NameNode 主机,它就没必要回滚。"hbase.rootdir":"hdfs://<nn01.mycompany.com>:8020/apps/hbase/data",
        hbase.rootdir 指向了一个特定的 NameNode 主机而不是 NameService ID, 这就不需要回滚,可以继续进行 ZooKeeper failover 控制器删除
    
    ②  如果必须要回滚 hbase.rootdir 值,在 Ambari server 主机上,使用 configs.py 脚本进行必要的修改:
        
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p<AMBARI_PW> -port <AMBARI_PORT> set
        localhost <CLUSTER_NAME> hbase-site hbase.rootdir hdfs://<NAMENODE_HOSTNAME>:8020/apps/hbase/data
        
        使用为回滚准备 Ambari Server 主机设置的环境变量应用命令中的环境变量名
        
        
    ③    在 Ambari server 主机上,验证 hbase.rootdir 属性已恢复正确:
    
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost \
        <CLUSTER_NAME> hbase-site

        hbase.rootdir 属性现在应该与 NameNode 主机名相同而不是 NameService ID.
    

5.1.2.6 删除 ZooKeeper Failover 控制器 (Delete ZooKeeper Failover Controllers)
-----------------------------------------------------------------------------------------------------------------------------------------
前提准备:
    如果在 Ambari 服务器主机上执行如下命令返回一个非空的 items 数组,那么必须删除 ZooKeeper (ZK) Failover Controllers:
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/        \
    <CLUSTER_NAME>/host_components?HostRoles/component_name=ZKFC

删除失效控制器:

    ①    在 Ambari server 主机上,发出如下 DELETE 命令:
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/        \
    clusters/<CLUSTER_NAME>/hosts/<NAMENODE_HOSTNAME>/host_components/ZKFC curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:     \
    ambari" -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/hosts/<ADDITIONAL_NAMENODE_HOSTNAME>/    \
    host_components/ZKFC


    ② 验证控制器已被移除
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari"-i <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/    \
    <CLUSTER_NAME>/host_components?HostRoles/component_name=ZKFC

    这条命令应该返回一个空的 items 数组



5.1.2.7 修改 HDFS 配置 (Modify HDFS Configurations)
-----------------------------------------------------------------------------------------------------------------------------------------
可能需要修改 hdfs-site 配置和/或 core-site 配置

前提准备:

    通过在  Ambari server 主机上执行下列命令,检查是否需要修改 hdfs-site 配置:

    /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost     \
    <CLUSTER_NAME> hdfs-site

如果看到如下属性,必须从配置中删除它们

    • dfs.nameservices
    • dfs.client.failover.proxy.provider.<NAMESERVICE_ID>
    • dfs.ha.namenodes.<NAMESERVICE_ID>
    • dfs.ha.fencing.methods
    • dfs.ha.automatic-failover.enabled
    • dfs.namenode.http-address.<NAMESERVICE_ID>.nn1
    • dfs.namenode.http-address.<NAMESERVICE_ID>.nn2
    • dfs.namenode.rpc-address.<NAMESERVICE_ID>.nn1
    • dfs.namenode.rpc-address.<NAMESERVICE_ID>.nn2
    • dfs.namenode.shared.edits.dir
    • dfs.journalnode.edits.dir
    • dfs.journalnode.http-address
    • dfs.journalnode.kerberos.internal.spnego.principal
    • dfs.journalnode.kerberos.principal
    • dfs.journalnode.keytab.file

这里的 <NAMESERVICE_ID> 是在运行 Enable NameNode HA 向导时创建的 NameService ID

修改 hdfs-site 配置:

    ①    在 Ambari Server 主机上,对每一个发现的属性执行如下命令:
    
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> delete
        localhost <CLUSTER_NAME> hdfs-site property_name
    
        使用每一个要删除的属性替换 property_name
        
    ②    验证所以属性都已删除:
    
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost
        <CLUSTER_NAME> hdfs-site

    ③    确定是否必须修改 core-site 配置
    
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost
        <CLUSTER_NAME> core-site
        
    ④    如果看到 ha.zookeeper.quorum 属性,删除它
    
        /var/lib/ambari-server/resources/scripts/configs.py -u <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> delete
        localhost <CLUSTER_NAME> core-site ha.zookeeper.quorum

    ⑤    如果 fs.defaultFS 设置为 NameService ID, 将它回转到 非-HA 值
    
        "fs.defaultFS":"hdfs://<name-service-id>" The property
        fs.defaultFS needs to be modified as it points to a NameService
        ID "fs.defaultFS":"hdfs://<nn01.mycompany.com>"
        

    ⑥    将 fs.defaultFS 属性回转到 NameNode 主机值
    
        /var/lib/ambari-server/resources/scripts/configs.py -u
        <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> set localhost
        <CLUSTER_NAME> core-site fs.defaultFS hdfs://<NAMENODE_HOSTNAME>

    ⑦    验证 core-site 属性现在正确设置了

        /var/lib/ambari-server/resources/scripts/configs.py -u
        <AMBARI_USER> -p <AMBARI_PW> -port <AMBARI_PORT> get localhost
        <CLUSTER_NAME> core-site

    fs.defaultFS 属性值应该是 NameNode 主机,并且 ha.zookeeper.quorum 属性不会出现


5.1.2.8 重新创建 Secondary NameNode (Re-create the Secondary NameNode)
-----------------------------------------------------------------------------------------------------------------------------------------
需要重新创建 Secondary NameNode

前提准备:

    在 Ambari Server 主机上检查是否需要重新创建 Secondary NameNode
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
    ambari" -i -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/
    api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/
    component_name=SECONDARY_NAMENODE

    如果返回一个空的 items 数组,必须重新创建 Secondary NameNode

重新创建 Secondary NameNode
    
    ①    在 Ambari Server 主机上,运行如下命令:
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
    ambari" -i -X POST -d '{"host_components" : [{"HostRoles":
    {"component_name":"SECONDARY_NAMENODE"}}] }' <AMBARI_PROTO>://
    localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/hosts?
    Hosts/host_name=<SECONDARY_NAMENODE_HOSTNAME>

    
    ②    验证 Secondary NameNode 是否存在。在 Ambari server 主机上,运行如下命令:
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
    ambari" -i -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/
    api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/
    component_name=SECONDARY_NAMENODE

    命令应返回一个非空数组包含 secondary NameNode


5.1.2.9 重新启用 Secondary NameNode (Re-enable the Secondary NameNode)
-----------------------------------------------------------------------------------------------------------------------------------------
    
    ①    在 Ambari Server 主机上运行如下命令:
        
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-
        By: ambari" -i -X PUT -d '{"RequestInfo":
        {"context":"Enable Secondary NameNode"},"Body":
        {"HostRoles":{"state":"INSTALLED"}}}'<AMBARI_PROTO>://
        localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/hosts/
        <SECONDARY_NAMENODE_HOSTNAME}/host_components/SECONDARY_NAMENODE

    ②    分析输出
        
        • 如果返回 200, 继续进行删除所有 JournalNodes

        • 如果返回 202, 等待几分钟之后,然后运行下面命令:

        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
        ambari" -i -X GET "<AMBARI_PROTO>://localhost:<AMBARI_PORT>/
        api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/
        component_name=SECONDARY_NAMENODE&fields=HostRoles/state"

        等待响应 "state" : "INSTALLED" 然后继续


5.1.2.10 删除所有 JournalNodes (Delete All JournalNodes)
-----------------------------------------------------------------------------------------------------------------------------------------
可能需要删除若干个 JournalNodes

前提要求:
    在 Ambari Server 主机上检查看看是否需要删除 JournalNodes
    
    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
    ambari" -i -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/
    api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/
    component_name=JOURNALNODE

    如果返回一个空的 items 数组,可以继续,否则必须删除 JournalNodes

删除 JournalNodes:

    ①    在 Ambari Server 主机上,运行如下命令:
    
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari"
        -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/
        v1/clusters/<CLUSTER_NAME>/hosts/<JOURNALNODE1_HOSTNAME>/
        host_components/JOURNALNODE curl -u <AMBARI_USER>:<AMBARI_PW>
        -H "X-Requested-By: ambari" -i -X DELETE <AMBARI_PROTO>://
        localhost:<AMBARI_PORT>/api/v1/clusters/<CLUSTER_NAME>/hosts/
        <JOURNALNODE2_HOSTNAME>/host_components/JOURNALNODE
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari"
        -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/
        v1/clusters/<CLUSTER_NAME>/hosts/<JOURNALNODE3_HOSTNAME>/
        host_components/JOURNALNODE

    ②    验证所有的 JournalNodes 已被删除。在 Ambari server 主机上执行:
    
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By:
        ambari" -i -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/
        api/v1/clusters/<CLUSTER_NAME>/host_components?HostRoles/
        component_name=JOURNALNODE

        这条命令应返回空的 items 数组


5.1.2.11 删除附属 NameNode (Delete the Additional NameNode)
-----------------------------------------------------------------------------------------------------------------------------------------
可能需要删除附属 NameNode

前提要求:
    在 Ambari server 主机上,检查是否需要删除附属 NameNode

    curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i
    -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/
    <CLUSTER_NAME>/host_components?HostRoles/component_name=NAMENODE

    如果返回的 items 数组含有两个 NameNode, 必须删除附属 NameNode

删除为 HA 设置的附属 NameNode:

    ①    在 Ambari Server 主机上,运行如下命令:
    
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari"
        -i -X DELETE <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/
        clusters/<CLUSTER_NAME>/hosts/<ADDITIONAL_NAMENODE_HOSTNAME>/
        host_components/NAMENODE
    
    ②    验证附属 NameNode 已删除
    
        curl -u <AMBARI_USER>:<AMBARI_PW> -H "X-Requested-By: ambari" -i
        -X GET <AMBARI_PROTO>://localhost:<AMBARI_PORT>/api/v1/clusters/
        <CLUSTER_NAME>/host_components?HostRoles/component_name=NAMENODE

        返回的 items 数组应含有一个 NameNode


5.1.2.12 验证 HDFS 组件 (Verify the HDFS Components)
-----------------------------------------------------------------------------------------------------------------------------------------
启动 HDFS 之前,应验证具有正确的组件

    ①    浏览到 Ambari Web UI > Services, 然后选择 HDFS
    
    ②    检查 Summary 面板病确保前三行类似如下:
        
        • NameNode
        • SNameNode
        • DataNodes    
    
        不应看到 JournalNodes 到行
    
5.1.2.13 启动 HDFS (Start HDFS)
-----------------------------------------------------------------------------------------------------------------------------------------
    
    ①    在 Ambari Web UI, 单击 Service Actions, 然后单击 Start.
    ②    如果进度条没有显示服务已完全启动并且忽略了服务检查,重做第一步
    ③    启动所有其他服务,在 Services 页面单击 Actions > Start All



5.1.3 管理 Journal 节点 (Managing Journal Nodes)
-----------------------------------------------------------------------------------------------------------------------------------------
在集群上启用 NameNode 高可用性之后,必须在集群上维护至少三个活动的 Journal 节点。可以使用 Manage JournalNode 向导来分配、添加、或移除
JournalNode. Manage JournalNode 向导分配 JournalNodes, 查看并确认必要的配置修改,然后会重启集群上的所有组件,以利用 JournalNode 和配置的
变化。

注意,这个向导会重启所有的集群服务。

前提要求:
    集群上必须启用了 NameNode 高可用性

管理集群的 JournalNodes

    (1) 在 Ambari Web, 选择 Services > HDFS > Summary.
    (2) 单击 Service Actions, 然后单击 Manage JournalNodes
    (3)    在 Assign JournalNodes 页面,通过 + 和 - 图标分配,并从下拉式菜单选择主机名称。完成主机分配之后,单击 Next
    (4) 在 Review 页面,验证 JournalNodes 主机分配及其相关配置修改。满意之后,单击 Next
    (5) 利用远程 shell, 完成 Save Namespace 页面的步骤。成功创建一个检查点后,单击 Next
    (6) 在 Add/Remove JournalNodes 页面,监控进度条,然后单击 Next
    (7) 跟随 Manual Steps Required: Format JournalNodes 页面指导,然后单击 Next
    (8) 在远程 shell 中,确认要初始化 JournalNodes, 在如下提示下输入 Y
    
        Re-format filesystem in QJM to [host.ip.address.1, host.ip.address.2, host.ip.address.3,] ? (Y or N) Y

    (9) 在 Start Active NameNodes 页面,服务重启时监控进度条,然后单击 Next
    (10)在 Manual Steps Required: Bootstrap Standby NameNode 页面,利用页面上的指导完成每一步骤,然后单击 Next
    (11)在远程 shell 中,确认要 bootstrap 备用 NameNode, 在下列提示中输入 Y
    
        RE-format filesystem in Storage Directory /grid/0/hadoop/hdfs/namenode ? (Y or N) Y

    (12)在 Start All Services 页面,向导启动所有服务时监控进度条,然后单击 Done 结束向导。
        Ambari Web UI 重新载入后,会看到一些警报通知,等几分钟直到所有服务重新启动并且警报清除
        
    (13)如有必要,利用 Ambari Web UI 重启任何组件


    
    
5.2 ResourceManager 高可用性 (ResourceManager High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
如果工作于 HDP 2.2 或更高版本环境,可以通过 Enable ResourceManager HA 为 ResourceManager 配置高可用性。

前提要求:
    ● 集群必须至少有三部主机
    ● 至少有三个 ZooKeeper server 运行



5.2.1 配置 ResourceManager 高可用性 (Configure ResourceManager High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
访问向导并配置 ResourceManager 高可用性

    ①    在 Ambari Web, 浏览到 Services > YARN > Summary
    ②    选择 Service Actions 然后选择 Enable ResourceManager HA.
        Enable ResourceManager HA 向导启动,描述一系列必须设置 ResourceManager 高可用性的自动和手动步骤
    ③    在 Get Started 页面,阅读启用 ResourceManager HA 概述,然后单击 Next 继续
    ④    在 Select Host 页面,接受默认选择,或选择一可用主机,然后单击 Next 继续
    ⑤    在 Review Selections 页面,如有必要展开 YARN, 概览所有对 YARN 推荐的配置变化。单击 Next 同意修改并自动配置 ResourceManager HA
    ⑥    在 Configure Components 页面,当所有进度条结束时,单击 Complete
    
    

5.2.2 禁用 ResourceManager 高可用性 (Disable ResourceManager High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
要禁用 ResourceManager 高可用性,必须删除一个 ResourceManager 并保留一个 ResourceManager. 在要求利用 Ambari API 来修改集群配置来删除
ResourceManage 并利用 ZooKeeper 客户端更新 znode 权限。

前提准备:

    由于这些步骤包括使用 Ambari REST API, 应该提前在一个测试环境中测试并验证它们,再到生产环境执行。

禁用 ResourceManager 高可用性

    (1)    在 Ambari Web, 停止 YARN 和 ZooKeeper 服务
    (2)    在 Ambari Server 主机上,利用 Ambari API 获取 YARN 配置信息到一个 JSON 文件
        
        /var/lib/ambari-server/resources/scripts/configs.py get <ambari.server> <cluster.name> yarn-site yarn-site.json
        
        本例中,ambari.server 是 Ambari Server 主机名,cluster.name 是集群的名称
    (3)    在 yarn-site.json 文件中,修改 change yarn.resourcemanager.ha.enabled 为 false, 并删除如下属性:
    
        • yarn.resourcemanager.ha.rm-ids
        • yarn.resourcemanager.hostname.rm1
        • yarn.resourcemanager.hostname.rm2
        • yarn.resourcemanager.webapp.address.rm1
        • yarn.resourcemanager.webapp.address.rm2
        • yarn.resourcemanager.webapp.https.address.rm1
        • yarn.resourcemanager.webapp.https.address.rm2
        • yarn.resourcemanager.cluster-id
        • yarn.resourcemanager.ha.automatic-failover.zk-base-path

    (4)    验证 yarn-site.json 文件中保留下列属性设置为 ResourceManager 主机名
    
        • yarn.resourcemanager.hostname
        • yarn.resourcemanager.admin.address
        • yarn.resourcemanager.webapp.address
        • yarn.resourcemanager.resource-tracker.address
        • yarn.resourcemanager.scheduler.address
        • yarn.resourcemanager.webapp.https.address
        • yarn.timeline-service.webapp.address
        • yarn.timeline-service.webapp.https.address
        • yarn.timeline-service.address
        • yarn.log.server.url

    (5)    搜索 yarn-site.json 文件,并删除任何对要删除的 ResourceManage 主机名的引用
    (6) 搜索 yarn-site.json 文件,并删除任何仍设置为 ResourceManager IDs 的属性,例如 rm1 and rm2
    (7) 保存 yarn-site.json 文件,并设置到 Ambari server
    
        /var/lib/ambari-server/resources/scripts/configs.py set ambari.server cluster.name yarn-site yarn-site.json

    (8)    利用 Ambari API, 删除要删除的 ResourceManager 主机组件
    
        curl --user admin:admin -i -H "X-Requested-By: ambari" -X DELETE http://ambari.server:8080/api/v1/clusters/cluster.name/hosts/    \
        hostname/host_components/RESOURCEMANAGER

    (9)    在 Ambari Web 中,启动 ZooKeeper 服务
    (10)在一个安装了 ZooKeeper client 的主机上,使用 ZooKeeper client 修改 znode 许可权限:
    
        /usr/hdp/current/zookeeper-client/bin/zkCli.sh
        getAcl /rmstore/ZKRMStateRoot
        setAcl /rmstore/ZKRMStateRoot world:anyone:rwcda

    (11)在 Ambari Web, 重启 ZooKeeper 服务并启动 YARN 服务。
    


5.3 HBase 高可用性 (HBase High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
为了在生产环境中帮助实现高可用性冗余。 Apache HBase 支持在集群中部署多个 Master. 如果工作于 Hortonworks Data Platform (HDP) 2.2 或更高版本
环境,Apache Ambari 通过简单的设置实现多个 HBase Masters

在 Apache HBase 服务安装期间和取决于组件分配,Ambari 安装并配置一个 HBase Master 组件以及多个 RegionServer 组件。为了配置 HBase 服务的高
可用性,可以运行两个或更多的 HBase Master 组件。HBase 利用 Zookeeper 来协调集群中运行的两个或多个 HBase Master 其中的活动 Master. 这意味着
当 primary HBase Master 失效时,客户端会自动被转移到 secondary Master.


    ● 通过 Ambari 设置多个 HBase Masters (Set Up Multiple HBase Masters Through Ambari)
    -------------------------------------------------------------------------------------------------------------------------------------
    Hortonworks 建议使用 Ambari 来配置多个 HBase Master. 完成如下任务:

        
    ● 向新创建集群添加第二 HBase Master (Add a Secondary HBase Master to a New Cluster)
    -------------------------------------------------------------------------------------------------------------------------------------
    在 安装 HBase 时,单击显示在已选中的 HBase Master 右侧的 + 符号图标添加并选择一个节点来部署第二个 HBase Master

    
    ● 向已存在集群添加新的 HBase Master (Add a New HBase Master to an Existing Cluster)
    -------------------------------------------------------------------------------------------------------------------------------------
    ①    以集群管理员账号登录到 Ambari 管理 UI
    ②    在 Ambari Web, 浏览到 Services > HBase.
    ③    在 Service Actions, 单击 + Add HBase Master
    ④    选要安装 HBase master 的主机,然后单击 Confirm Add.
    
    Ambari 安装这个新的 HBase Master 并识别 HBase 来管理多个 Master 实例
    
    
    ● 手动设置多个 HBase Masters (Set Up Multiple HBase Masters Manually)
    -------------------------------------------------------------------------------------------------------------------------------------
    在手动配置多个 HBase Masters 之前,必须根据安装过程中的指导配置集群上的第一个节点(node-1),然后完成下面的任务:    
    
    ①    配置无密码 SSH 访问
    ②    准备 node-1
    ③    准备 node-2 和 node-3
    ④    启动并配置 HBase 集群
    
    ● 配置无密码 SSH 访问 (Configure Passwordless SSH Access)
    -------------------------------------------------------------------------------------------------------------------------------------
    集群上的第一个节点(node-1)必须能登录到集群到其它主机,并且然后可以再登录回自己来启动守护进程。可以在所有主机上使用同一用户名并使用
    无密码 SSH 登录来达成此目的。
    
    ①    在 node-1 上,停止 HBase 服务
    ②    在 node-1 上,以 HBase 用户登录并生成 SSH key 对
        
        $ ssh-keygen -t rsa
        
        系统打印出 key 对的存储位置,默认的公钥为 id_rsa.pub
        
    ③    在其他节点上创建目录来保存公钥
    
        在 node-2 上,以 HBase 用户登录主机并在用户主目录创建 .ssh/ 目录
        在 node-3 上,重复这一过程
    
    ④    利用 scp 或其他标准安全工具从 node-1 上复制公钥到其它两个节点
        
        在每个节点上创建一个新文件 .ssh/authorized_keys 并把 id_rsa.pub 文件内容添加到这个文件中
        
        $ cat id_rsa.pub >> ~/.ssh/authorized_keys
        
        确保不是复写到 .ssh/authorized_keys 文件。
        
    ⑤    从 node-1 以同一个用户名使用 SSH 登录其它节点。应该不会提示输入密码
    
    ⑥    在 node-2 节点,重复第五步,因为它作为一个备份 Master 运行
    


    ● 准备 node-1 (Prepare node-1)
    -------------------------------------------------------------------------------------------------------------------------------------
    因为 node-1 要作为 primary Master 和 ZooKeeper 进程运行,必须停止 node-1 上启动的 RegionServer

    ①    编辑 conf/regionservers 文件移除包含 localhost 的行,并为 node-2 和 node-3 添加主机名或 IP 地址
        
        Note:
            如果想要在 node-1 上运行 RegionServer, 应通过主机名指向它,其他服务器可以用来与之通信。如对于 node-1, 用作 node-1.test.com
    
    ②    配置 HBase 使用 node-2 作为一个备份 Master, 通过在 conf/ 下创建一个新文件,称为 backup-Masters, 在文件内用 node-2 的主机名添加
        一行,如 node-2.test.com
    ③    在 node-1 上通过编辑 conf/hbase-site.xml 来配置 ZooKeeper, 添加如下属性:
    
        <property>
            <name>hbase.zookeeper.quorum</name>
            <value>node-1.test.com,node-2.test.com,node-3.test.com</value>
        </property>
        <property>
            <name>hbase.zookeeper.property.dataDir</name>
            <value>/usr/local/zookeeper</value>
        </property>
        
        这个配置指示 HBase 在集群的每个节点上启动并管理一个 ZooKeeper 实例
    
    ④    修改配置中每个以 localhost 引用到 node-1 的配置指向到主机名,例如,node-1.test.com


    ● 准备 node-2 和 node-3 (Prepare node-2 and node-3)
    -------------------------------------------------------------------------------------------------------------------------------------
    在 准备 node-2 和 node-3 之前,每个节点必须有相同的配置信息
    
    node-2 运行为一个被非法 Master 服务器和一个 ZooKeeper 实例
    
    ①    在 node-2 和 node-3 上下载并解包 HBase
    
    ②    复制 node-1 上的配置文件到 node-2 和 node-3
    
    ③    复制 conf/ 目录的内容到 node-2 和 node-3 的 conf/ 目录
    

    ● 启动并测试 HBase 集群 (Start and Test your HBase Cluster)
    -------------------------------------------------------------------------------------------------------------------------------------
    ①    使用 jps 命令确保 HBase 没有运行
    ②    杀掉 HMaster, HRegionServer, 以及 HQuorumPeer 进程,如果他们正在运行
    ③    在 node-1 上通过运行 start-hbase.sh 启动集群。必须有类似如下的输出:
    
        $ bin/start-hbase.sh
        node-3.test.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-
        hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-3.test.com.out
        node-1.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.
        3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-1.test.com.out
        node-2.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.
        3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-2.test.com.out
        starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/
        hbase-hbuser-master-node-1.test.com.out
        node-3.test.com: starting regionserver, logging to /home/hbuser/hbase-0.98.
        3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-3.test.com.out
        node-2.test.com: starting regionserver, logging to /home/hbuser/hbase-0.98.
        3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-2.test.com.out
        node-2.test.com: starting master, logging to /home/hbuser/hbase-0.98.3-
        hadoop2/bin/../logs/hbase-hbuser-master-node2.test.com.out

        ZooKeeper 首先启动,然后是 Master, 然后是 RegionServer, 最后是 backup Masters
        
    ④    在每一个节点上运行 jps 命令来验证每一个服务器上运行了正确的进程
        可能看到额外的 Java 进程也运行在服务器上,如果它们也用于其他目的
        
        Example1. node-1 jps Output
        $ jps
        20355 Jps
        20071 HQuorumPeer
        20137 HMaster
        
        Example 2. node-2 jps Output
        $ jps
        15930 HRegionServer
        16194 Jps
        15838 HQuorumPeer
        16010 HMaster
        
        Example 3. node-3 jps Output
        $ jps
        13901 Jps
        13639 HQuorumPeer
        13737 HRegionServer
        
        ZooKeeper 进程名
        
        Note:
            HQuorumPeer 进程是 ZooKeeper 实例,由 HBase 控制和启动。如果以这种方式使用 ZooKeeper,受限制为每个集群节点一个实例,并且
            只适用于测试。如果 ZooKeeper 运行在 HBase 之外,进程叫做 QuorumPeer.
            
    ⑤    浏览到 Web UI 并测试新的连接
    
        应该可以连接到 Master UI http://node-1.test.com:16010/
        或者 secondary master      http://node-2.test.com:16010/
    
        可以在 16030 端口看到每一个 RegionServer 的 web UI
        
        
        
        
5.4 Hive 高可用性 (Hive High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
Apache Hive 服务有多个相关联的组件。主要的 Hive 组件是 Hive Metastore 和 HiveServer2. 可以在 HDP 2.2 或以后版本中为 Hive 服务配置高
可用性,运行两个或更多的相关组件。



5.4.1 添加 Hive Metastore (Adding a Hive Metastore Component)
-----------------------------------------------------------------------------------------------------------------------------------------
前提准备:
    如果 Hive 中有 ACID 启用,确保 Run Compactor 设置时启用的(设置为 True) on only one Hive metastore 主机

步骤:
    ①    在 Ambari Web, 浏览到 Services > Hive
    ②    在 Service Actions, 单击 + Add Hive Metastore 选项
    ③    选取要安装另外的 Hive Metastore 的主机,然后单击 Confirm Add
    ④    Ambari 安装组件并重新配置 Hive 来处理多个 Hive Metastore 实例


5.4.2 添加 HiveServer2 组件 (Adding a HiveServer2 Component)
-----------------------------------------------------------------------------------------------------------------------------------------

步骤:
    ①    在 Ambari Web,浏览到要安装另一个 HiveServer2 组件的主机
    
    ②    在 Host 页,单击 +Add.
    
    ③    从列表中单击 HiveServer2


    Ambari 安装另外的 HiveServer2


5.4.3 添加 WebHCat Server (Adding a WebHCat Server)
-----------------------------------------------------------------------------------------------------------------------------------------

步骤:
    ①    在 Ambari Web,浏览到要安装另一个 WebHCat 服务器的主机

    ②    在 Host 页,单击 +Add.

    ③    从列表中单击 WebHCat

    Ambari 安装新服务器并重新配置组 Hive




5.5 Storm 高可用性 (Storm High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
HDP 2.3 及以后版本,可以通过在 Ambari 上添加 Nimbus 组件配置 Apache Storm Nimbus 服务器高可用性。

        
        
5.5.1 添加一个 Nimbus 组件 (Adding a Nimbus Component)
-----------------------------------------------------------------------------------------------------------------------------------------
步骤:

    ①    在 Ambari Web, 浏览到 Services > Storm

    ②    在 Service Actions, 单击 + Add Nimbus 选项

    ③    单击要安装另外的 Nimbus 的主机,然后单击 Confirm Add

    Ambari 安装组件并重新配置 Storm 来处理多个 Nimbus 实例


5.6 Oozie 高可用性 (Oozie High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
HDP 2.2 及以后版本,可以设置 Apache Oozie 服务的高可用性,可以运行两个或多个 Oozie Server 组件。

前提准备:
    ● 使用默认安装的 Derby 数据库实例不支持多 Oozie Server 实例,因此必须使用已有的关系数据库。当使用 Apache Derby 为 Oozie Server 提供
        数据库时,没有添加 Oozie Server 组件到集群中的选项
    ● 对 Oozie 高可用性要求使用外部虚拟 IP 地址(an external virtual IP address) 或负载均衡器(load balancer) 将流量转发给多个 Oozie 服务器。


5.6.1 添加一个 Oozie 服务器组件 (Adding an Oozie Server Component)
-----------------------------------------------------------------------------------------------------------------------------------------

步骤:

    (1)    在 Ambari Web, 浏览到要安装另一个 Oozie server 的主机
    (2)    在 Host 页, 单击 +Add 按钮
    (3)    从列表中单击 Oozie server
    (4)    配置外部负载均衡器,然后更新 Oozie 配置
    (5) 浏览到 Services > Oozie > Configs
    (6)    在 oozie-site, 添加如下熟悉值:
        
        oozie.zookeeper.connection.string
        列出 ZooKeeper  主机,带有端口,例如:
        
        c6401.ambari.apache.org:2181,
        c6402.ambari.apache.org:2181,
        c6403.ambari.apache.org:2181

        oozie.services.ext
        org.apache.oozie.service.ZKLocksService,
        org.apache.oozie.service.ZKXLogStreamingService,
        org.apache.oozie.service.ZKJobsConcurrencyService
        oozie.base.url
        http://<Cloadbalancer.hostname>:11000/oozie


    (7)    在 oozie-env 中,撤销 oozie_base_url 属性注释,并修改它的值指向负载均衡器:
    
        export oozie_base_url="http://<loadbalance.hostname>:11000/oozie"
        
    (8)    重启 Oozie
    (9)    为 Oozie proxy user 更新 HDFS 配置属性
    
        a. 浏览到 Services > HDFS > Configs
        b. 在 core-site 中,更新 hadoop.proxyuser.oozie.hosts  属性,包含新添加的 Oozie server 主机。使用逗号分隔的多个主机名
    
    (10)重启服务
    


5.7 Apache Atlas 高可用性 (Apache Atlas High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------

步骤:

    (1)    在 Ambari 表盘上,单击 Hosts, 然后选择要安装备用 Atlas Metadata Server 的主机
    (2)    在新 Atlas Metadata Server 主机的 Summary 页面,单击 Add > Atlas Metadata Server
        
        Ambari 添加新的 Atlas Metadata Server 为 Stopped 状态
        
    (3) 单击 Atlas > Configs > Advanced    
    (4)    单击 Advanced application-properties 并添加 atlas.rest.address 属性,使用逗号分隔,值为新的 Atlas Metadata Server:
    
        ,http(s):<host_name>:<port_number>
        
        默认协议是 "http", 如果 atlas.enableTLS 属性设置为 true, 使用 "https". 同时,默认的 HTTP 端口为 21000, 并且默认额 HTTPS 端口为 21443
        这些值可以分别使用 atlas.server.http.port 和 atlas.server.https.port 属性覆盖
    
    (5)    停止所有当前正在运行的 Atlas Metadata Servers
        
        重要提示:
            必须使用 Stop  命令来停止 Atlas Metadata Servers . 不要使用 Restart 命令:这会尝试首先停止新创建的 Atlas Server, 此时在
            /etc/atlas/conf 中还没有包含任何配置信息
            
    (6)    在 Ambari 表盘上, 单击 Atlas > Service Actions > Start
    
        Ambari 会自动配置 Atlas 在 /etc/atlas/conf/atlas-application.properties 文件中如下属性:
        
        • atlas.server.ids
        • atlas.server.address.$id
        • atlas.server.ha.enabled

    (7)    要刷新配置文件,重启如下含有 Atlas hooks 的服务:
    
        • Hive
        • Storm
        • Falcon
        • Sqoop
        • Oozie

    (8)    单击 Actions > Restart All Required 来重启所有要求重启的服务
    
        当在 Ambari 中更新了 Atlas 的配置设置, Ambari 标记了要求重启的服务
        
    (9)    单击 Oozie > Service Actions > Restart All 以重启 Oozie 以及其相关服务
    
        Apache Oozie 在 Atlas 配置更新之后要求重启,但有可能没有包含到 Ambari 标记要求重启的服务中
        
    

5.8 启用 Ranger Admin 高可用性 (Enabling Ranger Admin High Availability)
-----------------------------------------------------------------------------------------------------------------------------------------
在 Ambari 管理的集群上,可以配置 Ranger Admin 高可用性带有或不带有 SSL 。


步骤:
    
    ● HTTPD setup for HTTP - 在 Ambari 中启用 Ranger Admin HA, 从第 16 步开始:

    https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.4/bk_hadoop-high-availability/content/configure_ranger_admin_ha.html        \
    #configure_ranger_admin_ha_without_ssl
    
    
    ● HTTPD setup for HTTPS - 在 Ambari 中启用 Ranger Admin HA, 从第 14 步开始

    https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.4/bk_hadoop-high-availability/content/configure_ranger_admin_ha.html        \
    #configure_ranger_admin_ha_with_ssl
 

 

参考:

        Ambari 操作指南 (Ambari Operations) 之一

        Ambari 操作指南 (Ambari Operations) 之二

        Ambari 操作指南 (Ambari Operations) 之三

        Ambari 操作指南 (Ambari Operations) 之四

        Ambari 操作指南 (Ambari Operations) 之五

        Ambari 操作指南 (Ambari Operations) 之六

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值