动物园管理员

    当 HBase 管理 ZooKeeper 集合时,您可以直接在 conf / hbase-site.xml 中指定 ZooKeeper 配置。通过在 ZooKeeper 选项名称前加上hbase.zookeeper.property,可以将 ZooKeeper 配置选项设置为 HBase hbase-site.xml XML 配置文件中的属性。例如,可以通过设置hbase.zookeeper.property.clientPort属性来更改 ZooKeeper 中的clientPort设置。对于 HBase 使用的所有默认值,包括 ZooKeeper 配置,请参见 。查找hbase.zookeeper.property前缀。有关 ZooKeeper 配置的完整列表,请参阅 ZooKeeper 的 zoo.cfg 。 HBase 不附带 zoo.cfg ,因此您需要在适当的 ZooKeeper 下载中浏览 conf 目录。

    您必须至少使用hbase.zookeeper.quorum属性列出 hbase-site.xml 中的整体服务器。此属性默认为localhost上的单个集合成员,它不适用于完全分布式 HBase。 (它仅绑定到本地计算机,远程客户端将无法连接)。

    例如,让 HBase 管理节点 rs {1,2,3,4,5} .example.com 上的 ZooKeeper 仲裁,绑定到端口 2222(默认为 2181),确保HBASE_MANAGE_ZK为在 conf / hbase-env.sh 中注释掉或设置为true,然后编辑 conf / hbase-site.xml 并设置hbase.zookeeper.property.clientPorthbase.zookeeper.quorum。您还应该将hbase.zookeeper.property.dataDir设置为默认值以外的值,因为默认情况下 ZooKeeper 会在 / tmp 下保留数据,这通常会在系统重启时清除。在下面的示例中,我们将 ZooKeeper 持久保存到 / user / local / zookeeper

    我应该使用什么版本的 ZooKeeper

    新版本越好。从 HBase 1.0.0 开始,ZooKeeper 3.4.x 是必需的

    ZooKeeper 维护

    务必设置 ZooKeeper 维护中描述的数据目录清理器,否则您可能会在几个月内遇到“有趣”问题;例如,如果动物园管理员必须通过一个成千上万的日志目录来运行,而这种情况在领导者重新选举时间周围不会发生 - 这个过程很少见,但无论是因为机器掉落还是碰巧打嗝都会运行。

    要将 HBase 指向现有的 ZooKeeper 集群(不受 HBase 管理的集群),请将 conf / hbase-env.sh 中的HBASE_MANAGES_ZK设置为 false

    1. ...
    2. # Tell HBase whether it should manage its own instance of ZooKeeper or not.
    3. export HBASE_MANAGES_ZK=false

    接下来在 hbase-site.xml 中设置集合位置和客户端端口(如果是非标准的)。

    当 HBase 管理 ZooKeeper 时,它将启动/停止 ZooKeeper 服务器作为常规启动/停止脚本的一部分。如果您想自己运行 ZooKeeper,独立于 HBase 启动/停止,您将执行以下操作

    1. ${HBASE_HOME}/bin/hbase-daemons.sh {start,stop} zookeeper

    请注意,您可以以这种方式使用 HBase 来启动与 HBase 无关的 ZooKeeper 集群。只要确保将HBASE_MANAGES_ZK设置为false,如果希望它在 HBase 重启时保持不变,那么当 HBase 关闭时,它不会使 ZooKeeper 失效。

    197.使用 ZooKeeper 进行 SASL 身份验证

    较新版本的 Apache HBase(> = 0.92)将支持连接到支持 SASL 身份验证的 ZooKeeper Quorum(可在 ZooKeeper 版本 3.4.0 或更高版本中使用)。

    介绍如何设置 HBase 与 ZooKeeper Quorum 进行相互认证。 ZooKeeper / HBase 相互认证( )是完整安全 HBase 配置( HBASE-3025 )的一部分。为简化说明,本节忽略了所需的其他配置(安全 HDFS 和协处理器配置)。建议首先使用 HBase 管理的 ZooKeeper 配置(而不是独立的 ZooKeeper 仲裁),以便于学习。

    您需要有一个有效的 Kerberos KDC 设置。对于将运行 ZooKeeper 服务器的每个$HOST,您应该具有zookeeper/$HOST原则。对于每个这样的主机,为zookeeper/$HOST添加一个服务密钥(使用kadminkadmin.local工具的ktadd命令)并将此文件复制到$HOST,并使其仅对将运行 zookeeper 的用户可读在$HOST上。请注意此文件的位置,我们将在下面使用它作为 $ PATH_TO_ZOOKEEPER _KEYTAB

    同样,对于将运行 HBase 服务器(主服务器或区域服务器)的每个$HOST,您应该有一个原则:hbase/$HOST。对于每个主机,添加一个名为 hbase.keytab 的密钥表文件,其中包含hbase/$HOST的服务密钥,将此文件复制到$HOST,并使其仅对将运行 HBase 服务的用户可读$HOST。注意这个文件的位置,我们将在下面使用它作为 $ PATH_TO_HBASE _KEYTAB

    每个将成为 HBase 客户端的用户也应获得 Kerberos 主体。此主体通常应该为其分配密码(与 HBase 服务器相反,密钥表文件),只有该用户知道。应设置客户端的主体maxrenewlife,以便可以对其进行足够的续订,以便用户可以完成其 HBase 客户端进程。例如,如果用户运行长达 3 天的长期运行 HBase 客户端进程,我们可以在kadmin中创建此用户的主体:addprinc -maxrenewlife 3days。 ZooKeeper 客户端和服务器库通过运行定期唤醒以执行刷新的线程来管理自己的票证更新。

    在将运行 HBase 客户端的每台主机上(例如hbase shell),将以下文件添加到 HBase 主目录的 conf 目录中:

    1. Client {
    2. com.sun.security.auth.module.Krb5LoginModule required
    3. useKeyTab=false
    4. useTicketCache=true;
    5. };

    我们将此 JAAS 配置文件称为 $ CLIENT _CONF

    197.2。 HBase 管理的 ZooKeeper 配置

    在将运行 zookeeper,master 或 regionserver 的每个节点上,在节点的 HBASE _HOME 目录的 conf 目录中创建一个 配置文件,如下所示:

    1. Server {
    2. com.sun.security.auth.module.Krb5LoginModule required
    3. useKeyTab=true
    4. keyTab="$PATH_TO_ZOOKEEPER_KEYTAB"
    5. storeKey=true
    6. principal="zookeeper/$HOST";
    7. };
    8. Client {
    9. com.sun.security.auth.module.Krb5LoginModule required
    10. useKeyTab=true
    11. useTicketCache=false
    12. keyTab="$PATH_TO_HBASE_KEYTAB"
    13. principal="hbase/$HOST";
    14. };

    其中 $ PATH_TO_HBASE _KEYTAB $ PATH_TO_ZOOKEEPER _KEYTAB 文件是您在上面创建的文件,$HOST是该节点的主机名。

    Server部分将由 ZooKeeper 仲裁服务器使用,而Client部分将由 HBase 主服务器和区域服务器使用。此文件的路径应替换下面 hbase-env.sh 列表中的文本 $ HBASE_SERVER _CONF

    此文件的路径应替换下面 hbase-env.sh 列表中的文本 $ CLIENT _CONF

    修改 hbase-env.sh 以包含以下内容:

    1. export HBASE_OPTS="-Djava.security.auth.login.config=$CLIENT_CONF"
    2. export HBASE_MANAGES_ZK=true
    3. export HBASE_MASTER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"
    4. export HBASE_REGIONSERVER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"

    其中 $ HBASE_SERVER _CONF $ CLIENT _CONF 是上面创建的 JAAS 配置文件的完整路径。

    在将运行 zookeeper,master 或 regionserver 的每个节点上修改 hbase-site.xml 以包含:

    通过在适当的主机上运行以下一组或多组命令来启动 hbase 群集:

    1. bin/hbase zookeeper start
    2. bin/hbase master start
    3. bin/hbase regionserver start

    添加一个类似于的 JAAS 配置文件:

    1. Client {
    2. com.sun.security.auth.module.Krb5LoginModule required
    3. useKeyTab=true
    4. useTicketCache=false
    5. keyTab="$PATH_TO_HBASE_KEYTAB"
    6. principal="hbase/$HOST";
    7. };

    其中 $ PATH_TO_HBASE _KEYTAB 是上面创建的 HBase 服务在此主机上运行的密钥表,$HOST是该节点的主机名。把它放在 HBase home 的配置目录中。我们将此文件的完整路径名称称为 $ HBASE_SERVER _CONF

    修改您的 hbase-env.sh 以包含以下内容:

    1. export HBASE_OPTS="-Djava.security.auth.login.config=$CLIENT_CONF"
    2. export HBASE_MANAGES_ZK=false
    3. export HBASE_MASTER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"
    4. export HBASE_REGIONSERVER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"

    在将运行 master 或 regionserver 的每个节点上修改 hbase-site.xml 以包含:

    1. <configuration>
    2. <property>
    3. <name>hbase.zookeeper.quorum</name>
    4. <value>$ZK_NODES</value>
    5. </property>
    6. <property>
    7. <name>hbase.cluster.distributed</name>
    8. <value>true</value>
    9. </property>
    10. <property>
    11. <name>hbase.zookeeper.property.authProvider.1</name>
    12. <value>org.apache.zookeeper.server.auth.SASLAuthenticationProvider</value>
    13. </property>
    14. <property>
    15. <name>hbase.zookeeper.property.kerberos.removeHostFromPrincipal</name>
    16. </property>
    17. <property>
    18. <name>hbase.zookeeper.property.kerberos.removeRealmFromPrincipal</name>
    19. <value>true</value>
    20. </property>
    21. </configuration>

    where $ZK_NODES is the comma-separated list of hostnames of the ZooKeeper Quorum hosts.

    同样在每个主机上,创建一个 JAAS 配置文件,其中包含:

    1. com.sun.security.auth.module.Krb5LoginModule required
    2. useKeyTab=true
    3. keyTab="$PATH_TO_ZOOKEEPER_KEYTAB"
    4. storeKey=true
    5. useTicketCache=false
    6. principal="zookeeper/$HOST";
    7. };

    其中$HOST是每个 Quorum 主机的主机名。我们将此文件的完整路径名称为 $ ZK_SERVER _CONF

    使用以下命令在每个 ZooKeeper Quorum 主机上启动 ZooKeepers:

    通过在相应节点上运行以下一组或多组命令来启动 HBase 集群:

    1. bin/hbase master start
    2. bin/hbase regionserver start

    197.4。 ZooKeeper 服务器身份验证日志输出

    如果上面的配置成功,您应该在 ZooKeeper 服务器日志中看到类似于以下内容的内容:

    1. 11/12/05 22:43:39 INFO zookeeper.Login: successfully logged in.
    2. 11/12/05 22:43:39 INFO server.NIOServerCnxnFactory: binding to port 0.0.0.0/0.0.0.0:2181
    3. 11/12/05 22:43:39 INFO zookeeper.Login: TGT refresh thread started.
    4. 11/12/05 22:43:39 INFO zookeeper.Login: TGT valid starting at: Mon Dec 05 22:43:39 UTC 2011
    5. 11/12/05 22:43:39 INFO zookeeper.Login: TGT expires: Tue Dec 06 22:43:39 UTC 2011
    6. 11/12/05 22:43:39 INFO zookeeper.Login: TGT refresh sleeping until: Tue Dec 06 18:36:42 UTC 2011
    7. ..
    8. 11/12/05 22:43:59 INFO auth.SaslServerCallbackHandler:
    9. Successfully authenticated client: authenticationID=hbase/ip-10-166-175-249.us-west-1.compute.internal@HADOOP.LOCALDOMAIN;
    10. authorizationID=hbase/ip-10-166-175-249.us-west-1.compute.internal@HADOOP.LOCALDOMAIN.
    11. 11/12/05 22:43:59 INFO auth.SaslServerCallbackHandler: Setting authorizedID: hbase
    12. 11/12/05 22:43:59 INFO server.ZooKeeperServer: adding SASL authorization for authorizationID: hbase

    在 ZooKeeper 客户端(HBase 主服务器或区域服务器)上,您应该看到类似于以下内容的内容:

    1. 11/12/05 22:43:59 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=ip-10-166-175-249.us-west-1.compute.internal:2181 sessionTimeout=180000 watcher=master:60000
    2. 11/12/05 22:43:59 INFO zookeeper.ClientCnxn: Opening socket connection to server /10.166.175.249:2181
    3. 11/12/05 22:43:59 INFO zookeeper.RecoverableZooKeeper: The identifier of this process is 14851@ip-10-166-175-249
    4. 11/12/05 22:43:59 INFO zookeeper.Login: successfully logged in.
    5. 11/12/05 22:43:59 INFO client.ZooKeeperSaslClient: Client will use GSSAPI as SASL mechanism.
    6. 11/12/05 22:43:59 INFO zookeeper.Login: TGT refresh thread started.
    7. 11/12/05 22:43:59 INFO zookeeper.ClientCnxn: Socket connection established to ip-10-166-175-249.us-west-1.compute.internal/10.166.175.249:2181, initiating session
    8. 11/12/05 22:43:59 INFO zookeeper.Login: TGT valid starting at: Mon Dec 05 22:43:59 UTC 2011
    9. 11/12/05 22:43:59 INFO zookeeper.Login: TGT expires: Tue Dec 06 22:43:59 UTC 2011
    10. 11/12/05 22:43:59 INFO zookeeper.Login: TGT refresh sleeping until: Tue Dec 06 18:30:37 UTC 2011
    11. 11/12/05 22:43:59 INFO zookeeper.ClientCnxn: Session establishment complete on server ip-10-166-175-249.us-west-1.compute.internal/10.166.175.249:2181, sessionid = 0x134106594320000, negotiated timeout = 180000

    197.6。从 Scratch 配置

    这已经在当前的标准 Amazon Linux AMI 上进行了测试。首先如上所述设置 KDC 和主体。下一个结帐代码并运行完整性检查。

    1. git clone https://gitbox.apache.org/repos/asf/hbase.git
    2. cd hbase
    3. mvn clean test -Dtest=TestZooKeeperACL

    然后如上所述配置 HBase。手动编辑 target / cached_classpath.txt(见下文):

    1. bin/hbase zookeeper &
    2. bin/hbase master &
    3. bin/hbase regionserver &

    197.7.1。修复 target / cached_classpath.txt

    197.7.2。以编程方式设置 JAAS 配置

    这将避免需要一个单独的 Hadoop jar 来修复 HADOOP-7070

    197.7.3。消除和kerberos.removeRealmFromPrincipal