动物园管理员

分布式 Apache HBase 安装依赖于正在运行的 ZooKeeper 集群。所有参与节点和客户端都需要能够访问正在运行的 ZooKeeper 集合。 Apache HBase 默认为您管理 ZooKeeper“集群”。它将启动和停止 ZooKeeper 集合作为 HBase 启动/停止过程的一部分。您还可以独立于 HBase 管理 ZooKeeper 集合,只需将 HBase 指向它应该使用的集群。要切换 ZooKeeper 的 HBase 管理,请使用 conf / hbase-env.sh 中的HBASE_MANAGES_ZK变量。此变量默认为true,告诉 HBase 是否启动/停止 ZooKeeper 整体服务器作为 HBase 启动/停止的一部分。

当 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 默认配置。查找hbase.zookeeper.property前缀。有关 ZooKeeper 配置的完整列表,请参阅 ZooKeeper 的 zoo.cfg 。 HBase 不附带 zoo.cfg ,因此您需要在适当的 ZooKeeper 下载中浏览 conf 目录。

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

我应该运行多少 ZooKeepers?

您可以运行仅包含 1 个节点的 ZooKeeper 集合,但在生产中,建议您运行 3 个,5 个或 7 个机器的 ZooKeeper 集合;一个合奏的成员越多,合奏对主机失败的容忍度就越高。此外,运行奇数台机器。在 ZooKeeper 中,支持偶数个对等体,但通常不使用它,因为偶数大小的集合需要比例更多的对等体形成法定数量而不是奇数大小的集合所需要的。例如,具有 4 个对等体的集合需要 3 来形成仲裁,而具有 5 的集合也需要 3 来形成仲裁。因此,5 的集合允许 2 个对等体失败,因此比 4 的集合更容错,其仅允许 1 个向下对等体。

为每个 ZooKeeper 服务器提供大约 1GB 的 RAM,如果可能的话,给它自己的专用磁盘(专用磁盘是确保高性能 ZooKeeper 集合的最佳方法)。对于负载很重的集群,在 RegionServers(DataNodes 和 TaskTrackers)的不同机器上运行 ZooKeeper 服务器。

例如,让 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

  1. <configuration>
  2. ...
  3. <property>
  4. <name>hbase.zookeeper.property.clientPort</name>
  5. <value>2222</value>
  6. <description>Property from ZooKeeper's config zoo.cfg.
  7. The port at which the clients will connect.
  8. </description>
  9. </property>
  10. <property>
  11. <name>hbase.zookeeper.quorum</name>
  12. <value>rs1.example.com,rs2.example.com,rs3.example.com,rs4.example.com,rs5.example.com</value>
  13. <description>Comma separated list of servers in the ZooKeeper Quorum.
  14. For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".
  15. By default this is set to localhost for local and pseudo-distributed modes
  16. of operation. For a fully-distributed setup, this should be set to a full
  17. list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh
  18. this is the list of servers which we will start/stop ZooKeeper on.
  19. </description>
  20. </property>
  21. <property>
  22. <name>hbase.zookeeper.property.dataDir</name>
  23. <value>/usr/local/zookeeper</value>
  24. <description>Property from ZooKeeper's config zoo.cfg.
  25. The directory where the snapshot is stored.
  26. </description>
  27. </property>
  28. ...
  29. </configuration>

我应该使用什么版本的 ZooKeeper

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

ZooKeeper 维护

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

196.使用现有的 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 失效。

有关运行不同 ZooKeeper 集群的更多信息,请参阅 ZooKeeper 入门指南。另外,有关 ZooKeeper 大小调整的更多信息,请参阅 ZooKeeper WikiZooKeeper 文档

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

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

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

197.1。操作系统先决条件

您需要有一个有效的 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 目录中创建一个 JAAS 配置文件,如下所示:

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

其中 $ 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_ZOOKEEPER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"
  4. export HBASE_MASTER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"
  5. export HBASE_REGIONSERVER_OPTS="-Djava.security.auth.login.config=$HBASE_SERVER_CONF"

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

在将运行 zookeeper,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. <value>true</value>
  17. </property>
  18. <property>
  19. <name>hbase.zookeeper.property.kerberos.removeRealmFromPrincipal</name>
  20. <value>true</value>
  21. </property>
  22. </configuration>

其中$ZK_NODES是 ZooKeeper Quorum 主机的逗号分隔的主机名列表。

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

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

197.3。外部 ZooKeeper 配置

添加一个类似于的 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. <value>true</value>
  17. </property>
  18. <property>
  19. <name>hbase.zookeeper.property.kerberos.removeRealmFromPrincipal</name>
  20. <value>true</value>
  21. </property>
  22. </configuration>

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

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

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

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

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

  1. SERVER_JVMFLAGS="-Djava.security.auth.login.config=$ZK_SERVER_CONF" bin/zkServer start

通过在相应节点上运行以下一组或多组命令来启动 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

197.5。 ZooKeeper 客户端身份验证日志输出

在 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。未来的改进

197.7.1。修复 target / cached_classpath.txt

您必须使用包含 HADOOP-7070 修复程序的版本覆盖target/cached_classpath.txt文件中的标准 hadoop-core jar 文件。您可以使用以下脚本执行此操作:

  1. echo `find ~/.m2 -name "*hadoop-core*7070*SNAPSHOT.jar"` ':' `cat target/cached_classpath.txt` | sed 's/ //g' > target/tmp.txt
  2. mv target/tmp.txt target/cached_classpath.txt

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

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

197.7.3。消除kerberos.removeHostFromPrincipalkerberos.removeRealmFromPrincipal