Hadoop 操作与集群管理秘籍(三)
五、增强 Hadoop 集群
在本章中,我们将介绍:
- 配置服务级别身份验证
- 使用 ACL 配置作业授权
- 使用 Kerberos 保护 Hadoop 集群
- 配置 Web 用户界面身份验证
- 从 NameNode 故障中恢复
- 配置 NameNode 高可用性
- 配置 HDFS 联合
简介
Hadoop 集群的安全性对其可用性至关重要。 加强 Hadoop 集群包括配置对资源(如作业、队列和各种管理服务)的访问控制。 我们将引入 NameNodeHigh Availability(HA)来解决单节点故障问题。 最后,我们将介绍 Hadoop 联合,它联合多台机器来扩展集群的容量。
配置服务级别身份验证
服务级身份验证(SLA)的目的是确保 Hadoop 用户拥有访问某些服务的适当权限。 此配置的一个用例是控制可以使用集群的允许用户列表。 这是通过 Hadoop 中的访问控制列表(ACL)强制执行的。 在本食谱中,我们将列出配置 SLA 的步骤。
做好准备
在开始之前,我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从管理员机器登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置 Hadoop SLA:
-
Enable SLA by opening the
$HADOOP_HOME/conf/core-site.xmlfile and add or change thehadoop.property.authorizationvalue to betrue, as shown in the following snippet:<property> <name>hadoop.property.authorization</name> <value>true</name> </property>备注
默认情况下,Hadoop 集群的 SLA 处于禁用状态。
-
Allow only specific users to submit jobs to the Hadoop cluster by adding or changing the following property in the
$HADOOP_HOME/conf/hadoop-policy.xmlfile:<property> <name>security.job.submission.protocol.acl</name> <value>hduser hadoop</name> </property>备注
此配置仅允许用户
hduser和组hadoop向 Hadoop 集群提交作业。 -
Allow only specific users and groups to talk to HDFS by opening the
$HADOOP_HOME/conf/hadoop-policy.xmlfile and add the following property:<property> <name>security.client.protocol.acl</name> <value>hduser,hdadmin hadoop</name> </property>备注
此配置仅允许用户
hduser和hdadmin以及组hadoop访问 HDFS -
Allow only specific DataNodes to communicate with the NameNode by changing the
security.datanode.protocol.aclproperty in the$HADOOP_HOME/conf/hadoop-policy.xmlfile similar to the following code:<property> <name>security.datanode.protocol.acl</name> <value>datanode</name> </property>备注
此配置仅允许作为属于组
datanode的用户运行的 DataNode 实例与集群中的 NameNode 通信。 -
Force the NameNode to reload the ACL configurations with the following command:
hadoop dfsadmin -refreshServiceAcl备注
此命令将强制从
policy文件重新加载与 HDFS 相关的 ACL。 -
使用以下命令强制 JobTracker 重新加载服务 ACL 配置:
hadoop mradmin -refreshServiceAcl
它是如何工作的.
属性(如security.namenode.protocol.acl)的值是逗号分隔的用户列表和组的逗号分隔列表。 用户列表和组列表由空格分隔。 例如,值的通用格式应类似于以下内容:
<value>user1,user2,user3 group1,group2</value>
还有更多...
除了我们在本食谱中提到的三个属性外,Hadoop 中还提供了许多其他 ACL 属性。 下表显示了这些属性的含义:
|性质 / 财产 / 所有权
|
服务描述
|
| --- | --- |
| security.client.protocol.acl | 客户端对 HDFS 的访问 |
| security.client.datanode.protocol.acl | 用于数据块恢复的客户端到数据节点 |
| security.inter.datanode.protocol.acl | 数据节点到数据节点更新时间戳 |
| security.inter.tracker.protocol.acl | TaskTracker 到 JobTracker |
| security.job.submission.protocol.acl | 用于作业提交、查询等的 JobTracker 客户端 |
| security.task.umbilical.protocol.acl | 有关映射和减少任务的信息,请联系 TaskTracker |
| security.refresh.policy.protocol.acl | Dfsadmin 和 mradmin 刷新 ACL 策略 |
这些属性的默认值是*,这意味着所有实体都可以访问该服务,换句话说,SLA 被禁用。
另请参阅
- 第 5 章,加强 Hadoop 集群中的使用 ACL配方配置作业授权
- http://hadoop.apache.org/docs/r1.1.2/service_level_auth.html#Enable+Service+Level+Authorization
使用 ACL 配置作业授权
Hadoop 提供两个级别的作业授权:作业级别和队列级别。 启用作业授权后,JobTracker 将对向集群提交作业的用户进行身份验证。 用户对作业和队列的操作也将由 JobTracker 进行身份验证。 在本食谱中,我们将展示使用 ACL 配置作业授权的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,没有任何问题。
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置具有 ACL 的作业授权:
-
Enable job ACL authorization by adding the following property to the
$HADOOP_HOME/conf/mapred-site.xmlfile:<property> <name>mapred.acls.enabled</name> <value>true</name> </property>备注
此属性将启用队列 ACL 和作业 ACL。
-
Configure job authorization to only allow specific users and groups to submit jobs by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapred.queue.hdqueue.acl-submit-job</name> <value>hduser hadoop</name> </property>备注
此配置将仅允许用户
hduser和组hadoop向队列hdqueue提交作业。 -
Configure job authorization to allow specific users and groups to manage jobs in a named queue by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapred.queue.hdqueue.acl-administer-job</name> <value>hduser hadoop</name> </property>备注
此配置将仅允许用户
hduser和组hadoop管理队列hdqueue的作业。 -
Check the status of queue ACLs with the following command:
hadoop queue -showacls输出将类似于以下内容:
Queue acls for user : hduser Queue Operations ===================== default submit-job,administer-jobs hdqueue submit-job,administer-jobs -
Configure job authorization to allow only specific users and groups to view the status of a job by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapreduce.job.acl-view-job</name> <value>hduser hadoop</name> </property>提示
与队列级别 ACL 不同,作业级别 ACL 为所有提交的作业指定访问控制,而不考虑作业已提交到的队列。
-
通过将以下属性添加到
$HADOOP_HOME/conf/mapred-queue-acls.xml文件,将作业授权配置为仅允许特定用户和组修改作业:<property> <name>mapreduce.job.acl-modify-job</name> <value>hduser hadoop</name> </property> -
使用以下命令强制 NameNode 和 JobTracker 重新加载 ACL 配置:
hadoop dfsadmin -refreshServiceAcl hadoop mradmin -refreshServiceAcl
它是如何工作的.
与前面配方中的 SLA 属性类似,mapred.queue.hdqueue.acl-submit-job等属性的值是一个逗号分隔的用户列表和一个逗号分隔的组列表。 用户列表和组列表由空格分隔。 例如,值的通用格式应类似于以下内容:
<value>user1,user2,user3 group1,group2</value>
提示
作业所有者、超级用户和向其提交作业的集群管理员将始终有权查看和修改作业。
作业视图 ACL 控制作业状态信息的访问,包括计数器、诊断信息、日志、作业配置等。
作业修改 ACL 可以与队列级 ACL 重叠。 发生这种情况时,如果用户已列在这两个 ACL 中的任何一个中,则将授予该用户的操作。
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置服务级别身份验证配方
- http://hadoop.apache.org/docs/r1.1.2/mapred_tutorial.html#Job+Authorization
- http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html
使用 Kerberos 保护 Hadoop 集群
最新的 Hadoop 版本通过将Kerberos集成到 Hadoop 中添加了安全功能。 Kerberos 是一种网络身份验证协议,它为客户端/服务器应用提供强身份验证。 Hadoop 使用 Kerberos 保护数据免受意外和未经授权的访问。 它通过对底层的远程过程调用(RPC)进行身份验证来实现这一点。 在本食谱中,我们将概述为 Hadoop 集群配置 Kerberos 身份验证的步骤。
做好准备
Kerberos 是由麻省理工学院创建的。 它旨在通过使用密钥加密为客户端/服务器应用提供强身份验证。 Kerberos 协议要求客户端向服务器提供其身份,反之亦然。 当他们的身份被 Kerberos 证实后,他们的所有后续通信都将被加密。
在开始之前,我们假设我们的 Hadoop 已经正确配置,没有任何问题,并且所有 Hadoop 守护进程都在运行,没有任何问题。 在我们的 CentOS 计算机上,使用以下命令安装 Kerberos 软件包:
sudo yum install krb5-libs, krb5-server, krb5-workstation
在此之后,应该可以从命令行访问kadmin和kinit命令。
如果您还在使用 CentOS 或其他与 Red Hat 兼容的操作系统,我们需要从以下链接下载 Java Cryptoography Extension(JCE)无限强度管辖策略文件:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
在网页底部,您应该会看到类似以下内容的选项:
根据您的 Java 版本,单击屏幕右侧的下载链接,我们可以使用java -version命令获取该链接。
怎么做……
使用以下步骤为 Hadoop 集群配置 Kerberos:
-
Start the Kerberos admin shell:
kadmin提示
如果您的帐户没有 root 访问权限,则需要使用
kadmin.local命令! -
在
kadminshell 中使用以下命令创建hduser主体:addprinc -randkey hduser/master.hdcluster.com@HDREALM -
在
kadmin外壳中使用以下命令创建 SPNEGO 的 HTTP 主体:addprinc -randkey HTTP/master.hdcluster.com@HDREALM -
使用以下命令创建包含
hduser实例和 HTTP 主体的keytab文件:xst -norandkey -k hduser.keytab hduser/master.hdcluster.com HTTP/master.hdcluster.com -
Show available
keytabfile entries with the following command:klist -e -k -t hduser.keytab输出将类似于以下内容:
Keytab name: WRFILE:hduser.keytab slot KVNO Principal ---- ---- --------------------------------------------------------------- 1 7 HTTP/master.hdcluster.com@HDREALM (DES cbc mode with CRC-32) 2 7 HTTP/master.hdcluster.com@HDREALM (Triple DES cbc mode with HMAC/sha1) 3 7 hduser/master.hdcluster.com@HDREALM (DES cbc mode with CRC-32) 4 7 hduser/master.hdcluster.com@HDREALM (Triple DES cbc mode with HMAC/sha1) -
使用以下命令将
keytab文件移动到 Hadoop 配置目录:cp *.keytab $HADOOP_HOME/conf -
使用以下内容更改
hduser``keytab文件的所有者:sudo chown hduser:hadoop $HADOOP_HOME/conf/hduser.keytab -
Change the permission of the
keytabfiles with:sudo chmod 400 $HADOOP_HOME/conf/*.keytab备注
只有所有者才能读取
keytab文件。 -
使用
for node in `cat $HADOOP_HOME/conf/slaves`; do echo 'Copying keytab files to ' $host scp $HADOOP_HOME/conf/*.keytab $host:$HADOOP_HOME/conf/ done将所有
kaytab文件复制到从节点 -
使用以下命令停止集群:
```sh
stop-all.sh
```
11. 使用您喜欢的文本编辑器打开$HADOOP_HOME/conf/core-site.xml文件,并向该文件添加以下行:
```sh
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.use-weak-http-crypto</name>
<value>false</value>
</property>
```
12. 使用您最喜欢的文本编辑器打开$HADOOP_HOME/conf/hdfs-site.xml文件,并在文件中添加以下行:
```sh
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>master.hdcluster.com:50090</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
```
13. 通过向$HADOOP_HOME/conf/hdfs-site.xml文件添加以下属性来启用 webHDFS:
```sh
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
```
14. 通过将以下两个属性添加到$HADOOP_HOME/conf/hdfs-site.xml文件来配置 Kerberos Web 身份验证:
```sh
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>$HADOOP_HOME/conf/HTTP.keytab</value>
</property>
```
15. Start the cluster with the following command:
```sh
start-all.sh
```
我们将收到类似以下内容的日志消息:
```sh
13/02/25 10:19:02 INFO security.UserGroupInformation:
Login successful for user hduser/master.hdcluster.com@HDREALM using keytab file /usr/local/hadoop/hduser.keytab
13/02/25 10:19:07 INFO http.HttpServer: Added global filtersafety (class=org.apache.hadoop.http.HttpServer$QuotingInputFilter)
13/02/25 10:19:12 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to getDelegationToken
13/02/25 10:19:15 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to renewDelegationToken
13/02/25 10:19:22 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to cancelDelegationToken
13/02/25 10:19:32 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to fsck
13/02/25 10:19:36 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to getimage
```
16. 使用以下命令将一个简单的文本文件复制到 HDFS 中,以测试 Kerberos 配置:
```sh
hadoop fs -put $HADOOP_HOME/conf/slaves .
```
17. 在 HDFS 目录上设置粘滞位,以防止未经授权的用户使用以下命令删除目录或文件:
```sh
sudo -u hdfs hadoop fs -chmod 1777 /tmp
```
18. Verify the sticky bit setting with the following command:
```sh
hadoop fs -ls /
```
输出应类似于:
```sh
Found 2 items
drwxrwxrwt - hduser supergroup 0 2013-03-10 15:55 /tmp
drwxr-xr-x - hduser supergroup 0 2013-03-10 14:01 /user
```
19. 通过将以下行添加到$HADOOP_HOME/conf/mapred-site.xml文件来配置 MapReduce Kerberos 身份验证:
```sh
<property>
<name>mapreduce.jobtracker.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>mapreduce.jobtracker.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapreduce.tasktracker.kerberos.principal</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapreduce.tasktracker.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapred.task.tracker.task-controller</name>
<value>org.apache.hadoop.mapred.LinuxTaskController</value>
</property>
<property>
<name>mapreduce.tasktracker.group</name>
<value>hadoop</value>
</property>
```
20. 创建包含以下内容的$HADOOP_HOME/conf/taskcontrol.cfg文件:
```sh
mapred.local.dir=${hadoop.tmp.dir}/mapred/local
hadoop.log.dir=$HADOOP_HOME/logs
mapreduce.tasktracker.group=hduser
banned.users=
min.user.id=2000
```
21. Change the ownership and permission of the $HADOOP_HOME/conf/taskcontroller.cfg file:
```sh
sudo chown root:mapred $HADOOP_HOME/conf/task-controller.cfg
sudo chmod 4754 $HADOOP_HOME/conf/task-controller.cfg
```
### 备注
修改后的权限应如下所示:
```sh
-rwsr-xr-- 1 hduser superuser 91886 2013-03-10 13:44 task-controller.cfg
```
22. Start the MapReduce cluster with the following command:
```sh
start-mapred.sh
```
### 备注
我们应该能够获得类似于以下内容的日志记录消息:
```sh
13/02/26 12:25:02 INFO security.UserGroupInformation:
Login successful for user hduser/master.hdcluster.com@HDREALM using keytab file $HADOOP_HOME/conf/hduser.keytab.
```
23. 通过使用以下命令运行示例 MapReduce 作业来测试 Kerberos 配置:
```sh
hadoop jar $HADOOP_HOME/hadoop-example*.jar pi 20 1000000
```
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 Web UI 身份验证配方
- http://en.wikipedia.org/wiki/SPNEGO
- HTTPS://ccp.cloudera.com/display/CDHDOC/Configuring+Hadoop+Security+in+CDH3+(SPNEGO)
- 从web.mit.edu/kerberos/获取有关 kerberos 的更多信息
配置 Web 用户界面身份验证
默认情况下,Hadoop 用户和管理员无需任何身份验证即可访问 Hadoop 守护进程的 Web UI。 可以将 Hadoop 守护程序 Web UI 配置为使用 Kerberos 对用户进行身份验证。 在本菜谱中,我们将概述配置用户身份验证以访问 Web UI 的步骤。
做好准备
我们假设我们的 Hadoop 已经正确配置,并且所有守护进程都在正常运行,没有任何问题。 我们还假设已经正确配置了 Kerberos 身份验证。
在本配方中,我们假设所有属性配置都将在$HADOOP_HOME/conf/core-site.xml文件上进行更改。
怎么做……
使用以下步骤配置 Web 用户界面身份验证:
-
使用以下命令停止集群:
stop-all.sh -
添加或更改以下属性:
<property> <name>hadoop.http.filter.initializers</name> <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value> </property> -
Change the HTTP authentication type by adding the following code:
<property> <name>hadoop.http.authentication.type</name> <value>kerberos</value> </property>提示
其他 HTTP 身份验证类型包括简单身份验证和用户自定义身份验证,可通过指定
AUTHENTICATION_HANDLER_CLASSNAME值选择这两种身份验证类型。 默认身份验证类型为简单。 -
Configure the authentication token's valid time length by changing the
hadoop.http.authentication.token.validityproperty to the following:<property> <name>hadoop.http.authentication.token.validity</name> <value>10000</value> </property>提示
该值的单位是秒。 此属性的默认值为
36000。 -
Configure the location of the
signature.secretfile, which will be used to sign the authentication tokens, by changing thehadoop.http.authentication.signature.secret.fileproperty similar to the following:<property> <name>hadoop.http.authentication.signature.secret.file</name> <value>$HADOOP_HOME/conf/http-auth.secret</value> </property>备注
如果未设置此属性,将在启动时生成随机的
secret文件。 用于保密的默认文件将是${user.name}/hadoop-auth-signature-secret。 -
Configure the domain name for HTTP cookies, which stores authentication tokens, by changing the
hadoop.http.authentication.cookie.domainproperty similar to the following:<property> <name>hadoop.http.authentication.cookie.domain</name> <value>hdcluster.com</value> </property>提示
警告!
此属性是 HTTP 身份验证正常工作所必需的。
-
通过更改类似于以下内容的
hadoop.http.authentication.kerberos.principal属性来配置 HTTP 端点的 Kerberos 主体:<property> <name>hadoop.http.authentication.kerberos.principal</name> <value>HTTP/master.hdcluster.com@HDREALM</value> </property> -
通过更改类似于以下内容的
hadoop.http.authentication.kerberos.keytab属性,为 HTTP 终结点的 Kerberos 主体配置keytab文件的位置:<property> <name>hadoop.http.authentication.kerberos.keytab</name> <value>${user.home}/kerberos.hadoop.keytab</value> </property> -
使用以下命令将配置同步到从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo "Copying Hadoop configration files to host: ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
使用以下命令启动 Hadoop 集群:
```sh
start-all.sh
```
11. 通过打开 URLmaster:50030/jobtracker.jsp验证配置。
12. 或者,我们可以使用以下curl命令测试我们的配置:
```sh
curl -v -u hduser --negotiate http://master:50030/jobtracker.jsp
```
它是如何工作的.
Web UI 身份验证是使用 HTTP SPNEGO 协议实现的。 SPNEGO代表简单且受保护的协商机制。 它是一种 GSSAPI 机制,用于协商多种可能的实际机制之一。 当客户端应用想要向远程服务器进行身份验证,但两端都不确定对方支持哪种身份验证协议时,可以使用 SPNEGO。
伪机制使用协议来确定哪些常见的 GSSAPI 机制可用,选择一个,然后将所有进一步的安全操作分派给它。 这可以帮助组织分阶段部署新的安全机制。
有关 SPNEGO 的更多信息,请参考到它的维基页面en.wikipedia.org/wiki/SPNEGO。
还有更多...
其他身份验证方法包括简单身份验证。 如果使用此身份验证方法,则必须在第一次浏览器交互中使用 URL 中的user.name参数指定用户名。 例如,我们需要打开 JobTracker URL:http://master:50030/jobtracker.jsp?user.name=hduser。
如果使用简单身份验证作为身份验证类型,则可以通过更改以下属性来配置匿名用户 Web 用户界面请求:
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>true</value>
</property>
另请参阅
- 第 5 章,加强 Hadoop 集群中的使用 Kerberos配方保护 Hadoop 集群
- http://hadoop.apache.org/docs/stable/HttpAuthentication.html
从 NameNode 故障中恢复
Hadoop 集群中的 NameNode 跟踪整个 HDFS 文件系统的元数据。 不幸的是,在撰写本书时,Hadoop 当前稳定版本中的 NameNode 是单点故障。 如果 NameNode 的元数据损坏(例如,由于硬盘故障),则整个集群将变得不可用。 因此,保护 NameNode 免受这些灾难性故障的影响非常重要。
我们可以通过多种方式提高 HDFS 集群的弹性。 在本食谱中,我们将向您展示如何将 Second NameNode 配置为备份 NameNode,以及如何从 NameNode 故障中恢复。
做好准备
我们假设 Hadoop 集群已经正确配置,我们有一台机器master1作为 NameNode,另一台机器master2运行 Second daryNameNode。
备注
请做好准备,NameNode 故障可能会导致集群暂停。 可能需要一些时间才能从故障中恢复过来。
怎么做……
我们要介绍的第一种方法是将 NameNode 配置为将编辑日志和文件系统映像写入两个位置-一个在 NameNode 机器的本地目录上,另一个在 Second daryNameNode 机器上。 这些目录使用 HDFS 属性dfs.name.dir指定。 我们可以使用以下步骤进行配置:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Configure the following property in the
$HADOOP_HOME/conf/hdfs-site.xmlfile:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name,/mnt/snn/name</value> </property>提示
在该属性中,我们为 NameNode 配置了两个要向其中写入元数据的目录。 第一目录
/hadoop/dfs/name是master1上的目录,第二目录/mnt/ssn/name是master2上的一个 NFS 共享目录/hadoop/dfs/name。 换句话说,我们正在配置两台机器master1和master2,使其具有相同的 NameNode 目录布局。为简单起见,我们不会在本食谱中向您展示 NFS 的配置。 有关此主题的更多信息,请访问www.tldp.org/HOWTO/NFS-H…
-
在
$HADOOP_HOME/conf/core-site.xml文件中配置以下属性:<property> <name>fs.default.name </name> <value>master1:54310</value> </property> -
使用以下命令将配置复制到
master2:scp $HADOOP_HOME/conf/hdfs-site.xml master2:$HADOOP_HOME/conf/ scp $HADOOP_HOME/conf/slaves master2:$HADOOP_HOME/conf/ -
使用以下命令将配置文件复制到集群中的所有从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
Start the Hadoop cluster in
master1with the following command:start-all.sh提示
在此配置中,我们实际上没有在 Second daryNameNode 机器
master2上启动任何守护进程。 我们只使用这台机器存储master1上 NameNode 的元数据文件。 一旦 NameNode 出现故障,我们可以很轻松地在master2上快速启动 NameNode。
一旦master1上的 NameNode 出现故障,我们可以使用以下步骤进行恢复:
-
使用以下命令登录到
master2:ssh hduser@master2 -
使用以下命令停止集群:
ssh master1 -C "stop-all.sh" -
通过向
$HADOOP_HOME/conf/core-site.xml文件添加以下属性,将其配置为使用master2作为 NameNode:<property> <name>fs.default.name </name> <value>master2:54310</value> </property> -
使用以下命令将配置复制到集群中的所有从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
使用命令
start-all.sh启动 Hadoop 集群
它是如何工作的.
严格地说,HDFS Second daryNameNode 守护进程不是 NameNode。 它仅充当定期将文件系统元数据图像文件和编辑日志文件提取到属性fs.checkpoint.dir指定的目录的角色。 在 NameNode 出现故障的情况下,备份文件可用于恢复 HDFS 文件系统。
还有更多...
如前所述,NameNode 失败的主要原因是元数据文件损坏。 因此,NameNode 弹性的关键是元数据文件的恢复。 在这里,我们将介绍另外两种方法-一种是将元数据写入多个硬盘驱动器,另一种是从 Second daryNameNode 的检查点恢复。
具有多个硬盘的 NameNode 弹性
我们可以使用以下步骤配置具有多个硬盘的 NameNode:
-
将硬盘安装、格式化并挂载到机器上;假设挂载点为
/hadoop1/。 -
使用以下命令创建 Hadoop 目录:
mkdir /hadoop1/dfs/name -
Configure the following property in the
$HADOOP_HOME/conf/hdfs-site.xmlfile:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name,/hadoop1/dfs/name</value> </property>备注
在此配置中,我们添加了两个目录。 第一个是 Hadoop 的主目录。 第二个目录是单独硬盘驱动器上的目录。
我们可以使用以下步骤从 NameNode 故障中恢复:
-
使用以下命令停止 Hadoop 集群:
stop-all.sh -
在
$HADOOP_HOME/conf/hdfs-site.xml文件中配置以下属性:<property> <name>dfs.name.dir</name> <value>/hadoop1/dfs/name</value> </property> -
使用以下命令启动集群:
start-all.sh
从辅助 NameNode 的检查点恢复 NameNode
我们可以使用以下步骤配置 Second daryNameNode,并从 NameNode 故障中恢复:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Add the following line into the
$HADOOP_HOME/conf/mastersfile:master2备注
通过这样做,我们将其配置为在
master2上运行 Second daryNameNode。 -
在
$HADOOP_HOME/conf/hdfs-site.xml文件中配置以下属性:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name</value> </property> -
使用以下命令将配置文件同步到集群中的从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/hdfs-site.xml $host:$HADOOP_HOME/conf done -
使用以下命令启动集群:
start-all.sh
如果 NameNode 出现故障,我们可以使用以下步骤进行恢复:
-
使用以下命令停止集群:
stop-all.sh -
Prepare a new machine for running the NameNode.
备注
准备工作应包括正确配置 Hadoop。 建议新的 NameNode 计算机与出现故障的 NameNode 具有相同的配置。
-
使用以下命令格式化 NameNode:
hadoop fs -format -
使用以下命令配置 NameNode 版本号:
scp slave1:/hadoop/dfs/data/current/VERSION* /hadoop/dfs/name/current/VERSION -
使用以下命令从 Second daryNameNode 复制检查点映像:
scp master2:/hadoop/dfs/namesecondary/image/fsimage /hadoop/dfs/name/fsimage -
使用以下命令从 Second daryNameNode 复制当前编辑日志:
scp master2:/hadoop/dfs/namesecondary/current/* /hadoop/dfs/name/current -
使用以下命令将检查点转换为新版本格式:
hadoop namenode -upgrade -
使用以下命令启动集群:
start-all.sh
另请参阅
- 第 4 章,管理 Hadoop 集群中的管理 HDFS 集群配方
- 第 4 章,管理 Hadoop 集群中的管理 DataNode 守护进程配方
- https://issues.apache.org/jira/browse/HADOOP-2585
配置 NameNode 高可用性
在撰写本书时,Hadoop 稳定版本的 NameNode 是一个单点故障。 如果发生意外故障或定期维护,集群将变得不可用。 对于生产 Hadoop 集群来说,这是一个大问题。 在本食谱中,我们列出了配置 NameNode HA 的步骤。
为了使备用 NameNode 能够自动从活动 NameNode 故障中恢复,NameNode HA 实施要求备用 NameNode 的编辑日志始终与活动 NameNode 保持同步。 Hadoop HA 提供了两种方法来实现这一点。 一种基于仲裁,另一种基于使用 NFS 的共享存储。 在本食谱中,我们将只向您展示如何使用 Quorum 配置 HA。
做好准备
目前,Hadoop 版本 1.x.y(MRv1)不支持 NameNode HA,因此我们假设所有集群节点都已经安装了 Hadoop 版本 2.0.x(MRv2)。
提示
请注意,此 Hadoop 版本仍处于 Alpha 状态,因此不建议将其用于生产部署。 更多关于 mrv2 的开发情况,请参考官网:hadoop.apache.org/docs/curren…。
我们假设有两个主节点,主机名为master1和master2,用于运行 NameNode 守护进程。
怎么做……
使用以下步骤配置 Hadoop NameNode HA:
-
使用以下命令登录其中一台 NameNode 计算机:
ssh hduser@master1 -
Configure a logical name service by adding the following property to the
$HADOOP_CONF_DIR/hdfs-site.xmlfile:<property> <name>dfs.nameservices</name> <value>hdcluster</value> </property>备注
我们假设所有后续配置都在
$HADOOP_CONF_DIR/hdfs-site.xml文件上进行更改。 -
Specify the NameNode IDs for the configured name service by adding the following property to the file:
<property> <name>dfs.ha.namenodes.hdcluster</name> <value>namenode1,namenode2</value> </property>备注
此属性使用属性
dfs.ha.namenodes.<nameservices>指定 NameNode ID。 例如,在上一步中,我们已经配置了名称服务hdcluster,因此这里的属性名称将是dfs.ha.namenodes.hdcluster。 在此属性中,我们为logic名称服务指定了namenode1和namenode2。当前 HA 实施最多只支持两个 NameNode。
-
Configure the RPC address for
namenode1on themaster1host by adding the following property:<property> <name>dfs.namenode.rpc-address.hdcluster.namenode1</name> <value>master1:54310</value> </property>备注
NameNode 的 MRv1 RPC 地址规范类似于 MRv2 中的规范。 它们都使用
host:port格式。 -
通过添加以下属性,在
master2主机上配置namenode2的 RPC 地址:<property> <name>dfs.namenode.rpc-address.hdcluster.namenode2</name> <value>master2:54310</value> </property> -
通过向文件中添加以下行来配置两个 NameNode 的 HTTP Web UI 地址:
<property> <name>dfs.namenode.http-address.hdcluster.namenode1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.http-address.hdcluster.namenode2</name> <value>master2:50070</value> </property> -
Configure the NameNode
shared editsdirectory by adding the following property to the file:<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master1:8485;master1:8486;master2:8485/hdcluster</value> </property>备注
此属性为 Quorum 配置三个日志节点地址,以提供共享编辑存储。 共享编辑日志将由活动 NameNode 写入,并由备用 NameNode 读取。
-
Configure the Quorum
Journal Nodedirectory for storing edit logs in the local filesystem by adding the following property to the file:<property> <name>dfs.journalnode.edits.dir</name> <value>/hadoop/journaledits/</value> </property>备注
应该在每台 NameNode 计算机上配置此属性。
-
通过将以下行添加到文件来配置 NameNode HA 的代理提供程序:
<property> <name>dfs.client.failover.proxy.provider.hdcluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> -
Configure the
fencingmethod by adding the following property to the file:
```sh
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
```
### 提示
目前 NameNode HA 支持两种隔离方式,一种是`sshfence`,另一种是`shell`。 `sshfence`使用 SSH 登录到活动 NameNode 并终止进程,`shell`隔离使用常规 shell 命令来隔离活动 NameNode。 在这个配方中,我们假设使用`sshfence`方法。
11. Configure the private key file for the sshfence method by adding the following property to the file:
```sh
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>$HOME/.ssh/id_rsa</value>
</property>
```
### 提示
此属性的值应该是以逗号分隔的私钥文件列表。 为了使`sshfence`正常工作,我们正在配置私钥文件,以便它可以登录到目标节点,而无需提供释义。
12. 通过将以下属性添加到文件来配置 SSH 连接超时(以毫秒为单位):
```sh
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>50000</value>
</property>
```
13. Enable automatic failover by adding the following property to the file:
```sh
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
```
此配置将启用所有名称服务 ID 的自动故障转移。 如果我们要为特定的名称服务 ID(例如`hdcluster`)启用自动故障转移,我们可以配置以下属性:
```sh
<property>
<name>dfs.ha.automatic-failover.enabled.hdcluster</name>
<value>true</value>
</property>
```
14. 通过将以下属性添加到$HADOOP_CONF_DIR/core-site.xml文件来配置 ZooKeeper 服务:
```sh
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181</value>
</property>
```
15. 使用以下命令将配置同步到集群中的所有节点:
```sh
for host in cat $HADOOP_CONF_DIR/slaves; do
echo 'Sync configuration files to ' $host
scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/
scp $HADOOP_CONF_DIR/core-site.xml $host:$HADOOP_CONF_DIR/
done
```
16. Initialize the ZooKeeper with the following command:
```sh
hdfs zkfc -formatZK
```
### 备注
此命令将在 ZooKeeper 中创建**Znode**,自动故障转移系统将在其中存储数据。
17. Start the HDFS cluster with the following command:
```sh
start-dfs.sh
```
### 备注
此命令将在每台 NameNode 计算机上启动一个 ZKFC 守护进程,并在守护进程启动后选择活动的 NameNode。
或者,我们可以使用命令`hadoop-daemon.sh start zkfc`在每台 NameNode 机器上手动启动 ZKFC 守护进程。
我们可以使用以下步骤测试 NameNode HA 配置:
-
通过使用以下 URL 访问 NameNode Web 用户界面来检查 NameNode 的状态:
master1:50070 master2:50070 -
Assuming
master1has the active NameNode, we can get the NameNode process ID onmaster1with the following command:jps该命令将产生类似于以下内容的输出:
... 22459 NameNode ... -
Kill the NameNode process with the following command on
master1:kill -9 22459备注
如果备用 NameNode 自动成为活动 NameNode,并且 Hadoop 集群仍在工作,没有任何问题,则配置成功。
它是如何工作的.
Hadoop NameNode HA 是从版本 0.23.x 或 2.0.x 分支(MRv2)开始引入的。 目标是保证集群的可用性。 它使用集群中的两个 NameNode、一个活动 NameNode 和一个备用 NameNode 来解决该问题。 活动 NameNode 将提供与 MRv1 中的 NameNode 相同的服务。 与仅将 NameNode 映像和编辑日志复制到备份目录的 Second daryNameNode 不同,备用 NameNode 是活动 NameNode 的热备份节点。 如果活动 NameNode 出现故障,备用 NameNode 将在最短时间内成为活动节点。
还有更多...
在 NameNode HA 实现中,ZooKeeper 扮演着重要角色。 动物园管理员的安全可能是一个必要的问题。 我们可以使用以下步骤配置受保护的动物园管理员:
-
使用
ssh命令登录到master1机器。 -
Add the following property to the
$HADOOP_CONF_DIR/core-site.xmlfile:<property> <name>ha.zookeeper.auth</name> <value>@$HADOOP_CONF_DIR/zkauth.txt</value> </property>备注
此属性配置用于 ZooKeeper 身份验证的文件。 特殊符号
@指定配置指向文件,而不是内联。 该文件的内容应该类似于digest:zkuser:password,其中zkuser是 ZooKeeper 的用户,password是zkuser的密码。 -
Add the following property into the
$HADOOP_CONF_DIR/core-site.xmlfile for ZooKeeper access control:<property> <name>ha.zookeeper.acl</name> <value>@$HADOOP_CONF_DIR/zkacl.txt</value> </property>备注
与
ha.zookeeper.auth属性类似,值中的@字符指定configuration是磁盘上的文件。 -
Generate ZooKeeper ACL corresponding to the authentication with the following command:
java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-*.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider zkuser:password我们将得到类似于以下内容的输出:
zkuser:password->zkuser:a4XNgljR6VhODbC7jysuQ4gBt98= -
将加密密码添加到
$HADOOP_CONF_DIR/zkacl.txt文件:digest:zkuser:a4XNgljR6VhODbC7jysuQ4gBt98= -
使用以下命令将配置同步到
master2:scp $HADOOP_CONF_DIR/zkacl.txt master2:$HADOOP_CONF_DIR/ scp $HADOOP_CONF_DIR/zkauth.txt master2:$HADOOP_CONF_DIR/ -
使用以下命令格式化 ZooKeeper:
hdfs zkfc -formatZK -
Test the configuration with the following command:
zkCli.sh我们将得到类似于以下内容的输出:
[zk: master1:2181(CONNECTED) 1] getAcl /hadoop-ha'digest, zkuser: a4XNgljR6VhODbC7jysuQ4gBt98= : cdrwa -
使用以下命令重新启动集群:
start-dfs.sh
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 HDFS 联合配方
- http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithNF.html
配置 HDFS 联合
Hadoop NameNode 将元数据保存在主内存中。 当 HDFS 命名空间变大时,主内存可能成为集群的瓶颈。 在适用于 MRv2 的 Hadoop 中引入了 HDFS 联合。 它通过利用多个独立 NameNode 的容量来增加 NameNode 容量和吞吐量,每个 NameNode 托管或管理 HDFS 命名空间的一部分。
做好准备
目前,只有 Hadoop MRv2 支持 NameNode 联合,因此我们假设所有集群计算机上都正确配置了 Hadoop MRv2。
备注
我们假设所有配置都在对$HADOOP_CONF_DIR/hdfs-site.xml文件进行更改。
怎么做……
使用以下步骤配置 HDFS 联合:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Specify a list of NameNode service IDs by adding the following lines into the file:
<property> <name>dfs.nameservices</name> <value>namenode1,namenode2</value> </property>备注
此属性的值是以逗号分隔的 NameNode 服务 ID 列表。 例如,在此步骤中,该值指定了两个 NameNode 服务:
namenode1和namenode2。 -
Configure the NameNode RPC and HTTP URI for
namenode1by adding the following into the file:<property> <name>dfs.namenode.rpc-address.namenode1</name> <value>master1:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode1</name> <value>master1:50071</value> </property>备注
前面的配置假设 NameNode 守护进程以及 NameNode HTTP 和辅助 HTTP 守护进程位于主机
master1上。 -
通过将以下内容添加到文件中,指定
namenode2的 NameNode RPC 和 HTTP URI:<property> <name>dfs.namenode.rpc-address.namenode2</name> <value> master2:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode2</name> <value> master2:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode2</name> <value>master2:50071</value> </property> -
使用以下命令将配置同步到集群中的所有节点:
for host in cat $HADOOP_CONF_DIR/slaves; do echo 'Sync configuration files to ' $host scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/ done -
Format
namenode1onmaster1with the following command:hdfs namenode -format -clusterId hdcluster备注
在此命令中,
-clusterId选项应该是环境中唯一的集群 ID。 如果未指定,将自动生成唯一的集群 ID。 -
Similarly, format
namenode2onmaster2with the following command:hdfs namenode -format -clusterId hdcluster提示
警告!
此 NameNode 的集群 ID 应与为
namenode1指定的集群 ID 相同,以便两个 NameNode 位于同一集群中。 -
现在,我们可以使用以下命令在任一 NameNode 主机上启动或停止 HDFS 集群:
start-dfs.sh stop-dfs.sh
它是如何工作的.
在非联合 HDFS 集群上,所有 DataNode 都向单个 NameNode 注册并向其发送心跳信号。 在联合 HDFS 集群上,所有 DataNode 都将注册到集群中的所有 NameNode,并且心跳和数据块报告将发送到这些 NameNode。
联合 HDFS 集群由一个或多个命名空间卷组成,命名空间卷由命名空间和属于该命名空间的数据块池组成。 命名空间卷是集群中的管理单位。 例如,集群管理操作(如delete和upgrade)将在命名空间卷上操作。 此外,联合 NameNode 可以为不同的应用或情况隔离名称空间。
下表显示了配置 NameNode 联合的属性:
|精灵 / 恶魔 / 守护进程 / 后台程序
|
性质 / 财产 / 所有权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| NameNode | dfs.namenode.rpc-address | 用于 NameNode RPC 与客户端的通信 |
| dfs.namenode.servicerpc-address | 用于与 HDFS 服务进行 NameNode RPC 通信 |
| dfs.namenode.http-address | NameNode HTTP Web 用户界面地址 |
| dfs.namenode.https-addressw | NameNode 安全的 HTTP Web 用户界面地址 |
| dfs.namenode.name.dir | NameNode 本地目录 |
| dfs.namenode.edits.dir | NameNode 编辑日志的本地目录 |
| dfs.namenode.checkpoint.dir | Second daryNameNode 本地目录 |
| dfs.namenode.checkpoint.edits.dir | Second daryNameNode 编辑日志的目录 |
| Second DaryNameNode | dfs.secondary.namenode.keytab.file | Second daryNameNodekeytab文件 |
| dfs.namenode.backup.address | 备份节点的地址 |
| 备份节点 | dfs.secondary.namenode.keytab.file | 备份节点\T0 文件 |
还有更多...
NameNode 联合 Hadoop 集群的管理任务与不支持联合的旧版本(MRv1)不同。
从集群中取消 NameNode
将 NameNode ID 添加到$HADOOP_CONF_DIR/namenode_exclude.txt文件中。 例如,如果我们想要从集群中停用namenode1,文件的内容应该是:
namenode1
使用以下命令将exclude文件分发给所有 NameNode:
distributed-exclude.sh $HADOOP_CONF_DIR/namenode_exlude.txt
使用以下命令刷新 NameNode 列表:
refresh-namenodes.sh
我们可以使用以下 URL 访问 HDFS 集群的 Web 用户界面:
http://namenode2:50070/dfsclusterhealth.jsp
运行平衡机
与旧的 Hadoop 版本类似,平衡器用于平衡集群上的数据块。 在 HDFS 联合 Hadoop 集群上,我们可以使用以下命令运行平衡器:
hadoop-daemon.sh --config $HADOOP_HOME/conf --script hdfs start balancer -policy node
此命令将在节点级别平衡数据块。 另一个平衡策略是blockpool,它在数据块池级别和数据节点级别平衡存储。
添加新的 NameNode
假设我们已经配置了一个由 NameNode 联合的 Hadoop 集群,其中有两个正在运行的 NameNode。 我们想要在主机master3上添加第三个 NameNodenamenode3。 我们可以使用以下步骤来完成此操作:
-
登录到新的 NameNode 计算机
master3。 -
在
master3节点上配置 MRv2。 -
将以下行添加到
$HADOOP_CONF_DIR/hdfs-site.xml文件中:<property> <name>dfs.nameservices</name> <value>namenode1,namenode2,namenode3</value> </property> <property> <name>dfs.namenode.rpc-address.namenode1</name> <value>master1:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode1</name> <value> master1:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode1</name> <value>master1:50071</value> </property> <property> <name>dfs.namenode.rpc-address.namenode2</name> <value>master2:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode2</name> <value> master2:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode2</name> <value>master2:50071</value> </property> <property> <name>dfs.namenode.rpc-address.namenode3</name> <value>master3:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode3</name> <value> master3:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode3</name> <value>master3:50071</value> </property> -
使用以下命令格式化
namenode3:hdfs namenode -format -cluserId hdcluster -
使用以下命令将配置同步到所有其他 NameNode:
scp $HADOOP_CONF_DIR/hdfs-site.xml master1:$HADOOP_CONF_DIR/ scp $HADOOP_CONF_DIR/hdfs-site.xml master2:$HADOOP_CONF_DIR/ -
使用以下命令将配置同步到集群中的所有从节点:
for host in `cat $HADOOP_CONF_DIR/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/ done -
使用以下命令启动 HDFS 集群:
start-dfs.sh -
使用以下命令将 NameNodes 的更改告知 DataNodes:
for slavehost in `$HADOOP_CONF_DIR/slaves`; do echo "Processing on host " $slavehost ssh $slavehost -C "hdfs dfsadmin -refreshNameNode master3:54310" done
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 NameNode 高可用性配方
- http://hadoop.apache.org/docs/r2.0.2-alpha/hadoop-yarn/hadoop-yarn-site/Federation.html
- http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
六、监控 Hadoop 集群
在本章中,我们将介绍:
- 使用 JMX 监视 Hadoop 集群
- 使用 Ganglia 监视 Hadoop 集群
- 使用 Nagios 监视 Hadoop 集群
- 使用 Ambari 监视 Hadoop 集群
- 使用 Chukwa 监视 Hadoop 集群
简介
系统监控对于维护大型分布式系统(如 Hadoop)的健康和可用性至关重要。 常规监控任务包括监控集群节点和网络的健康状况,例如,内存、堆、CPU、网络等的使用情况。 对于 Hadoop 集群,我们可能还需要监视一些特定的指标,例如集群中作业和任务的状态、JobTracker、TaskTracker、NameNode 和 DataNode 的状态。
Hadoop 很幸运地出生在一个开放源码的世界! 许多非常稳定的开源系统监控工具正在等待加入 Hadoop 大家庭,其中许多系统已经被 Hadoop 用于监控目的。
在本章中,我们将首先介绍用于系统监控的管理框架Java Management Extension(JMX)。 接下来,我们将介绍两个著名的开源集群监控系统:Ganglia和Nagios。 Ganglia 是一个开源的可伸缩监控系统。 在监视主机上运行的监视守护程序将数据发送到监视服务器主机以进行存储、统计分析和可视化。 Nagios 是另一个著名的监控系统。 它使用插件监控集群中的主机。
接下来,我们将介绍特定于 Hadoop 的监视系统Ambari和Chukwa。 Ambari 旨在成为部署、管理和监控 Hadoop 集群的成熟系统。 它是基于 Ganglia 和 Nagios 的监控框架开发的。 但与 Ganglia 和 Nagios 不同的是,Apache Chukwa 通过分析从 Hadoop 集群收集的系统日志来监控 Hadoop 集群。 ApacheFlume是另一个用于流式传输数据(如系统日志)的通用数据分析框架。 它可以配置为进行系统监控,这与 Chukwa 类似。
使用 JMX 监控 Hadoop 集群
JMX 是 Java 用来构建、监视和管理分布式系统和网络应用的技术。 它已经从J2SEPlatform 5.0 并入 Java。 有关 jmx 的更多信息,请访问官方网站www.oracle.com/technetwork…。 在本食谱中,我们将概述使用 JMX 配置 Hadoop 集群监控的步骤。
提示
在本章中,我们假设监控 Hadoop 版本 1.1.y 或相应的 0.20.x Hadoop 版本。 监控 Hadoop 版本 2.0.x 或 0.23.x 的配置应该遵循食谱进行一些更改。
做好准备
我们假设已经安装了 Oracle JDK,并且我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
怎么做……
使用以下步骤配置 JMX 以监视 Hadoop 集群:
-
使用以下命令创建用于远程监控的 JMX 密码文件:
cp $JAVA_HOME/jre/lib/management/jmxremote.password.template $HADOOP_HOME/conf/jmxremote.password -
Open the template password
$HADOOP_HOME/conf/jmxremote.passwordfile with a text editor and the last few lines of this file will be similar to the following:# Following are two commented-out entries. The “measureRole” role has # password “QED”. The “controlRole” role has password “R&D”. # # monitorRole QED # controlRole R&D删除突出显示的两行的注释符号
#。提示
这两行指定
monitorRole和controlRole的密码。 JMX 将在远程监控中使用它们进行身份验证。使用以下命令将密码文件的权限更改为
600:chmod 600 $HADOOP_HOME/conf/jmxremote.password提示
警告!
如果此文件过于打开,则在启动 Hadoop 集群守护程序时会出现类似以下内容的错误:
master: Error: Password file read access must be restricted: /usr/local/hadoop/conf/jmxremote.password -
使用文本编辑器打开
$HADOOP_HOME/conf/hadoop-env.sh文件。 -
In this file, we will be able to find JMX monitoring configurations for the Hadoop daemons including NameNode, SecondaryNameNode, DataNode, balancer, JobTracker, and TaskTracker. The default configuration will be similar to the following:
export HADOOP_NAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS” export HADOOP_SECONDARYNAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS” export HADOOP_DATANODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS” export HADOOP_BALANCER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS” export HADOOP_JOBTRACKER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS”现在,我们需要通过将原始配置更改为以下内容来配置 Hadoop 守护程序的远程监控端口:
# Extra Java runtime options. Empty by default. export HADOOP_OPTS=”-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=$HADOOP_CONF_DIR/jmxremote.password” export HADOOP_NAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS -Dcom.sun.management.jmxremote.port=8004” export HADOOP_SECONDARYNAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS -Dcom.sun.management.jmxremote.port=8005” export HADOOP_DATANODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS -Dcom.sun.management.jmxremote.port=8006” export HADOOP_BALANCER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS -Dcom.sun.management.jmxremote.port=8007” export HADOOP_JOBTRACKER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS -Dcom.sun.management.jmxremote.port=8008” export HADOOP_TASKTRACKER_OPTS=”-Dcom.sun.management.jmxremote.port=8009” -
Use the following command to start the monitor user interface:
jconsole我们可以看到一个类似于以下屏幕截图的窗口:
在此窗口中,我们可以检查本地和远程进程的状态。 检查本地进程的状态相对简单。 首先,从进程列表中选择要检查的所需进程。 然后,我们只需单击连接按钮。 检查远程进程的状态相对复杂。 我们需要通过指定主机名和端口或协议和 SAP 来指定服务的位置,如屏幕截图所示。 出于验证目的,我们还需要输入用户名和密码值。 在以下步骤中,我们假设检查本地 JobTracker 进程的状态。
-
Select the Local Process radio button and then click on the Connect button. We can get a monitoring window after waiting for a few moments, as shown in the following screenshot:
该窗口显示 JobTracker 的后台进程状态。 在窗口中,我们可以查看内存使用情况、线程、类、JVM 摘要以及 MBean 的详细信息。
-
Check the memory of the daemon by clicking on the Memory tab of the
jconsolewindow, and we will get a window similar to the following:Memory 窗口以时间序列图的形式显示Heap Memory Usage页。 在此窗口中,我们可以从不同的图表和时间范围中选择要显示的内容。 窗口的底部是当前内存使用情况的摘要。
-
By clicking on the Threads tab of the window, we can check the running threads of the JobTracker and we can get a window similar to the following screenshot:
窗口的上半部分显示峰值活动线程数和当前活动线程数**。 在窗口的下部,我们可以看到一个线程列表,通过单击所需的线程名称可以查看这些线程的信息。**
同样,我们可以通过单击窗口的Classs选项卡检查当前类,并通过单击窗口的VM Summary选项卡检查 JVM 虚拟机的摘要。
*** The MBeans tab is the most informative one if you want to check the status details of the daemon. For example, the following screenshot shows more metrics details for JobTracker:

从该窗口中,我们可以获得多个 JobTracker 指标,例如正在运行的作业的数量、映射和还原插槽的数量以及正在运行的映射和还原任务的数量。**
**## 另请参阅
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 参考docs.oracle.com/javase/tuto…
- 请参考docs.oracle.com/javase/Tuto…
使用 Ganglia 监视 Hadoop 集群
Ganglia是一个开源、可伸缩的分布式监控系统,用于集群和计算网格。 它有三个主要的组件:监控守护进程、元数据守护进程和Web UI。 在本食谱中,我们将概述为 Hadoop 集群监控配置 Ganglia 的步骤。
做好准备
使用以下命令从管理员计算机登录到主节点:
ssh hdadmin@master
使用以下yum命令在主计算机上安装 Ganglia:
sudo yum install -y ganglia-gmond ganglia-gmetad ganglia-web
使用以下命令在所有从节点上安装 Ganglia 监视守护进程:
for host in `cat $HADOOP_HOME/conf/slaves`
do
echo ‘Installing Ganglia on host ‘ $host
sudo ssh $host -C “yum install -y ganglia-gmond”
done
提示
在本配方中,我们假设 Ganglia 服务器将在主节点上运行,监视守护进程在主节点和从节点上运行。
怎么做……
使用以下步骤为 Hadoop 集群监视配置 Ganglia:
-
用文本编辑器打开
gmond配置文件/etc/ganglia/gmond.conf。 -
将
cluster属性更改为以下内容:cluster { name = “hadoop” owner = “hduser” latlong = “unspecified” url = “unspecified” } -
将
udp_send_channel属性更改为以下内容:udp_send_channel { bind_hostname = yes # mcast_join = 239.2.11.71 host = master port = 8649 ttl = 1 } -
Change the
udp_recv_channelattribute to the following:udp_recv_channel { # mcast_join = 239.2.11.71 port = 8649 # bind = 239.2.11.71 }提示
Hadoop 支持通过单播(使用普通 IP 地址,我们在这里使用的地址)和多播(使用多播地址,如
239.2.11.71)进行网络通信。 要使用组播,所有受监控的主机都应位于同一 IP 网段中。 在本书中,我们假定使用单播。 -
Add all the hostnames in the cluster to the
gmetadconfiguration/etc/ganglia/gmetad.conffile, for example, this file should contain the following:data_source “hdcluster” master:8649备注
这里
hdcluster是 Ganglia 监视的集群的名称,master:8649是gmetad的网络地址。 -
Open the
$HADOOP_HOME/conf/hadoop-metrics.propertiesfile with your favorite text editor and add the following contents into the file:jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext jvm.period=10 jvm.servers=master:8649前三行配置 JVM 监视。
rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext rpc.period=10 rpc.servers=master:8649前三行配置 RPC 监视。
dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext dfs.period=10 dfs.servers=master:8649前三行配置 HDFS 监视。
mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext mapred.period=10 mapred.servers=master:8649前三行配置为监视 MapReduce 指标。
hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext hbase.period=10 hbase.servers=master:8649前三行配置监视 HBase 指标。
提示
在前面的配置中,我们指定了三个公共参数:
class、period和servers。 参数class指定 Ganglia 将使用的消息格式(可以是GangliaContext或GangliaContext31);period指定两个连续度量更新之间的时间间隔,servers指定监视消息应该发送到的服务器列表。 -
使用以下命令将配置文件复制到所有从节点:
for host in cat $HADOOP_HOME/conf/slaves do echo ‘Copying ganglia monitoring configuration file to host’ $host; sudo scp /etc/ganglia/gmond.conf $host:/etc/ganglia/gmond.conf sudo scp /etc/ganglia/gmetad.conf $host:/etc/ganglia/gmetad.conf sudo scp $HADOOP_HOME/conf/hadoop-metrics.properties $host:$HADOOP_HOME/conf/hadoop-metrics.properties; done -
使用以下命令重新启动 Hadoop 集群:
stop-all.sh start-all.sh -
Start the
gmonddaemon with the following command on the master node:sudo service gmond start提示
如果希望该进程在系统重新启动后继续运行,请运行
sudo chkconfig gmondON 命令。 -
Check the status of
gmondwith the following command:
```sh
curl master:8649
```
此命令将输出 XML 格式的 Ganglia 配置,如下所示:
```sh
<GANGLIA_XML VERSION=”3.1.7” SOURCE=”gmond”>
<CLUSTER NAME=”hdcluster” LOCALTIME=”1363403519” OWNER=”hduser” LATLONG=”unspecified” URL=”hdcluster.com”>
<HOST NAME=”master” IP=”10.147.166.55” REPORTED=”1363403500” TN=”19” TMAX=”20” DMAX=”0” LOCATION=”unspecified” GMOND_STARTED=”1363403380”>
<METRIC NAME=”proc_run” VAL=”3” TYPE=”uint32” UNITS=” “ TN=”42” TMAX=”950” DMAX=”0” SLOPE=”both”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”process”/>
<EXTRA_ELEMENT NAME=”DESC” VAL=”Total number of running processes”/>
<EXTRA_ELEMENT NAME=”TITLE” VAL=”Total Running Processes”/>
</EXTRA_DATA>
</METRIC>
<METRIC NAME=”dfs.datanode.heartBeats_avg_time” VAL=”1.0” TYPE=”double” UNITS=”” TN=”2” TMAX=”60” DMAX=”0” SLOPE=”both”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”dfs.datanode”/>
</EXTRA_DATA>
</METRIC>
<METRIC NAME=”mapred.shuffleOutput.shuffle_output_bytes” VAL=”0” TYPE=”float” UNITS=”” TN=”1225” TMAX=”60” DMAX=”0” SLOPE=”positive”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”mapred.shuffleOutput”/>
</EXTRA_DATA>
</METRIC>
...
<EXTRA_ELEMENT NAME=”GROUP” VAL=”system”/>
<EXTRA_ELEMENT NAME=”DESC” VAL=”Operating system release date”/>
<EXTRA_ELEMENT NAME=”TITLE” VAL=”Operating System Release”/>
</EXTRA_DATA>
</METRIC>
</HOST>
</CLUSTER>
</GANGLIA_XML>
```
### 备注
突出显示的行显示 Ganglia 正在监视某些 HDFS 和 MapReduce 指标。
11. 在主节点上使用以下命令启动gmetad守护进程:
```sh
sudo service gmetad start
```
12. 使用以下命令在所有从节点上启动gmond:
```sh
for host in cat $HADOOP_HOME/conf/slaves
do
echo ‘Starting gmond service on host: ‘ $host;
sudo ssh $host -C “service gmond start”;
done
```
13. Open the /etc/httpd/conf.d/ganglia.conf file with your favorite text editor and add the following content:
```sh
<Location /ganglia>
Order deny,allow
Allow from all
</Location>
```
### 备注
该文件中的`access control`设置允许每个人访问 Ganglia web UI。 出于安全原因,我们可以使用配置中的`Allow from`和`Deny from`语句限制 IP 地址、主机或域。
14. 使用以下命令启动httpd守护进程:
```sh
sudo service httpd start
```
15. Check the status of Ganglia by opening URL http://master:80/ganglia, and we can get a web page similar to the following screenshot:

UI 的左上角是集群的摘要,包括主机数量、主机状态、平均负载等。
屏幕截图右上角的部分显示了整个集群的概况,包括集群总负载、CPU 使用率、内存和网络流量。 当一个`teragen`作业正在运行时,屏幕截图包含大约 20 分钟的明显跳转,这会消耗集群资源。
屏幕截图的下部显示集群中每个节点的状态,包括主节点和所有从节点。 我们可以通过从组合框中选择来更改要显示的指标,如以下屏幕截图所示:

例如,通过选择指标**DFS_datenode.bytes_Writed**,我们可以获得每个节点的以下屏幕截图:

前面的屏幕截图确认 DataNode 是存储数据块的实际位置,而 NameNode 只跟踪数据块的元数据。 因此,NameNode 的写入数据大小要小得多。
16. Check the details of each cluster node by selecting the option from the combo box, which has the initial value of --Choose a Node. For example, if we want to check all the metric values for the master node, we will be able to get a web page similar to the following screenshot:

17. By scrolling down the window, we can check the Hadoop JobTracker metrics as shown in the following screenshot:

前面的屏幕截图包含 JobTracker 的状态信息,包括正在运行的作业数、MAP Reduce 插槽数等。
它是如何工作的.
Ganglia 监视系统由三个部分组成:监视守护进程gmond、元数据处理守护进程gmetad和 Web UI。
Gangliagmond守护进程在集群中受监视的每个节点上运行。 它们持续收集指标数据,并将其发送到主节点上运行的gmetad守护进程。 gmetad守护进程将数据存储到由rrdtool维护的数据库中。 Web 用户界面(包括所有图形)是通过 PHP 从数据库中提取数据生成的。 Ganglia 数据流可以用下图描述:
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考ganglia.sourceforge.net/
- 参考www.ibm.com/developerwo…
使用 Nagios 监视 Hadoop 集群
Nagios是一个强大的开源集群监控系统。 它不仅可以监控主机和服务器,还可以监控路由器和交换机等互联设备。 警报服务提供快速响应系统问题的通知机制。
Nagios 设计为通用监控系统,可以配置为监控 Hadoop 集群。 在本食谱中,我们将概述为 Hadoop 集群监控配置 Nagios 的步骤。
做好准备
在使用 Nagios 监视 Hadoop 集群之前,请执行以下步骤:
-
To get started with Nagios monitoring, we need to install it first. On CentOS and other Red Hat-compatible Linux systems, we can use the following
yumcommand to install Nagios:sudo yum install nagios nagios-plugins该命令将自动安装依赖软件包,如
libgd和libgd-devel。 安装后,Nagios 配置文件将位于/etc/nagios目录下,Nagios 守护进程将位于/etc/init.d/目录下。 -
Install the Nagios Remote Plugin Executor (NRPE) package with the following command:
sudo yum install nrpeNRPE 是一个 Nagios 插件,允许我们在远程机器上执行 Nagios 插件。 详情请查看:nagios.sourceforge.net/docs/3_0/ad…和nagios.sourceforge.net/docs/nrpe/N…。
-
Download the
check_jmxNagios plugin from exchange.nagios.org/directory/P….我们希望使用 Java JMX 作为 Nagios 插件来监控 Hadoop 指标。
使用以下命令构建
check_jmx包:tar xvf check_jmx.tgz cd check_jmx ant -
在之后,我们希望获得以下目录结构:
check_jmx ├── ... ├── nagios │ ├── plugin │ │ ├── check_jmx │ │ └── jmxquery.jar │ └── readme.txt └── ... -
Copy the two highlighted files in the
/usr/local/nagios/libexecdirectory:cp check_jmx/nagios/plugin/check_jmx /usr/local/nagios/libexec cp check_jmx/nagios/plugin/jmxquery.jar /usr/local/nagios/libexec通过这样做,我们将能够在 Nagios 监视配置中使用
check_jmx命令。
怎么做……
使用以下步骤配置用于 Hadoop 集群监视的 Nagios:
-
Open the
/etc/nagios/nagios.cfgfile with a text editor.提示
该文件是 Nagios 的主配置文件。 它引用了许多扩展名为
.cfg的文件,其中包含特定的监控配置。 -
Change the contacts information for alerting services by changing the e-mail address in the
/usr/local/nagios/etc/objects/contacts.cfgfile:define contact{ contact_name nagiosadmin use generic-contact alias Nagios email nagios@localhost }提示
也可以使用其他提醒方法,例如 SMS 消息和寻呼。 有关更多信息,请参阅以下网页:
http://nagios.sourceforge.net/docs/3_0/objectdefinitions.html
-
Change the Apache web server configuration file
/etc/httpd/conf/httpd.confby adding the following line:Include /etc/httpd/conf/nagios.conf/etc/httpd/conf/nagios.conf文件是 Nagios Web 界面的配置文件;该文件的内容应与以下内容类似:# Specifies the location of the cgi scripts. ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin <Directory “/usr/local/nagios/sbin”> AllowOverride AuthConfig Options ExecCGI Allow from all Order allow,deny </Directory> # Specifies the Nagios root directory. # This will enable us to visit Nagios through http://<host>/nagios Alias /nagios /usr/local/nagios/share <Directory “/usr/local/nagios/share”> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory>前面的配置指定了 Nagios web UI 的根目录和 CGI 目录;要使用户能够访问,我们需要创建
/usr/local/nagios/sbin/.htaccess和/usr/local/nagios/share/.htaccess文件,内容如下:AuthName “Nagios Access” AuthType Basic AuthUserFile /etc/nagios/htpasswd.users require valid-user -
Create an administrator user for the Nagios web UI with the following command:
sudo htpasswd -c /etc/nagios/htpasswd.users nagiosadmin提示
我们应该为
nagiosadmin用户键入两次密码。 用户名和密码将用于登录 Web 用户界面。
现在,我们已经准备好通过以下步骤指定 Hadoop 集群监控配置:
-
Open the
/etc/nagios/nagios.cfgfile and add the following content:cfg_file=/etc/nagios/hosts.cfg cfg_file=/etc/nagios/services.cfg前两行告诉主配置文件
nagios.cfg包括两个特定于用户的配置文件:hosts.cfg和services.cfg。 -
Configuration file
hosts.cfgspecifies the hosts we want to monitor, and it should have content similar to the following:##################################### ## Declare host groups. ##################################### define hostgroup { hostgroup_name hdgroup alias Hadoop cluster groups. } ##################################### # Define a host template. # All the hosts configuration in our # cluster should be derived from this # template. ##################################### define host { name hdhost use linux-server hostgroups hdgroup register 0 } ########################################## # This are the real hosts in the cluster. ########################################## define host{ host_name master alias The master node. address 10.194.19.16 use hdhost } define host{ host_name slave1 alias The slave 1. address 10.40.193.19 use hdhost } define host{ host_name slave2 alias The slave 2. address 10.36.117.108 use hdhost } define host{ host_name slave3 alias The slave 3. address 10.40.66.245 use hdhost } define host{ host_name slave4 alias The slave 4. address 10.245.133.242 use hdhost } define host{ host_name slave5 alias The slave 5. address 10.12.73.254 use hdhost }该文件配置集群中要监视的六台主机,包括一个主节点和五个从节点。
-
The configuration file
services.cfgspecifies the services we want to monitor. The contents of this file should be similar to the following:############################################### ## Service definitions. ## For example, we want to monitor the status of ## the system, including the load, cpu usage, ## memory usage etc. ## For the monitoring of Hadoop clsuters, ############################################### # Monitor system metrics. define service{ use generic-service hostgroup_name hdgroup service_description SSH check_command check_ssh } define service{ use local-service hostgroup_name hdgroup service_description Swap Usage check_command check_local_swap!20!10 } define service{ use local-service hostgroup_name hdgroup service_description Total processes check_command check_local_procs!250!400!RSZDT }此文件中配置的服务将应用于声称在
hosts.cfg文件中配置的hdgroup组中的每个主机。 -
Verify the configurations with the following command:
sudo nagios --verify-config /etc/nagios/nagios.cfg我们将获得类似于以下屏幕截图的输出:
-
使用以下命令启动 Nagios 服务:
sudo service nagios start -
Check the status of the service with the following command:
sudo service nagios status如果 Nagios 正在运行,输出应该类似于:
nagios (pid 21542) is running...如果 SELinux 处于打开状态,我们需要使用以下命令更改 Web 目录的上下文:
chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin/ chcon -R -t httpd_sys_content_t /usr/local/nagios/share/ -
Restart the web server with the following command:
sudo service httpd restart现在,我们应该能够通过打开 URL:
http://master/nagios来检查 Web 用户界面。提示
如果您是第一次打开 Web 用户界面,则需要键入用户名和密码。 用户名应为
nagiosadmin,密码应为您为htpasswd命令输入的密码。
它是如何工作的.
Nagios 是一个开源的集中式网络监控系统。 典型的 Nagios 部署由一个监控服务器和多个被监控的主机组成。 管理员使用一个或多个配置文件定义监控规范(哪些主机上有哪些服务)。 有关 Nagios 的更多信息,请参考:www.nagios.org。
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考library.nagios.com/library/pro…
使用 Ambari 监控 Hadoop 集群
ApacheAmbari项目(Hadoop)是一个开源项目,旨在简化 incubator.apache.org/ambari/集群的管… 目前,Ambari 支持对该软件的管理:HDFS、MapReduce、HBase 和 HIVE。 在本食谱中,我们将概述配置 Hadoop Ambari 以进行集群安装、监控和管理的步骤。
做好准备
我们假设 Hadoop 集群已正确配置。 执行以下步骤:
-
使用以下命令启用 NTP 服务器:
sudo service ntpd start sudo chkconfig ntpd on -
应该在安装了 Ambari 的服务器上禁用 SELinux。 我们可以使用以下命令临时禁用 SELinux:
sudo setenforce 0 -
To permanently disable SELinux, we need to edit the SELinux configuration file
/etc/selinux/configby changing the state of theSELINUXattribute to the following:SELINUX=disabled0提示
更改
/etc/selinux/config文件后,我们需要重新启动系统才能使其生效。 -
使用以下命令禁用
iptables服务:sudo service iptables stop sudo chkconfig iptables off -
Check the status of iptables with the following command:
sudo iptables -L输出应与以下内容类似:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
怎么做……
使用以下步骤配置 Ambari 以进行 Hadoop 监视和管理:
-
使用以下命令从 Horntonworks 网站下载存储库文件:
sudo wget http://public-repo-1.hortonworks.com/ambari/centos6/1.x/GA/ambari.repo -P /etc/yum.repos.d -
使用以下命令安装
epel存储库:sudo yum install epel-release -
Verify the repository list with the following command:
yum repolist输出应与以下内容类似:
Loaded plugins: langpacks, presto, refresh-packagekit ... repo id repo name status HDP-UTILS-1.1.0.15 HDP-UTILS-1.1.0.15 52 Updates-ambari-1.x ambari-1.x - Updates 10 ambari-1.x Ambari 1.x 5 epel Extra Packages for Enterprise Linux 5 - x86_64 -
Install Ambari with the following command:
sudo yum install ambari-server该命令将自动安装PostgreSQL数据库,这是 Ambari 所需的。
-
Set up the Ambari server with the following command:
sudo ambari-server setup提示
如果 SELinux 未禁用,我们将收到警告,如果未禁用,
iptables服务将被禁用。 在配置过程中,我们将被要求配置 PostgreSQL 数据库的用户名和密码。 如果您选择不这样做(这是默认选项),则默认用户名和密码将为ambari-server和bigdata。 然后,安装过程将提示下载 Oracle JDK,我们应该接受许可证。 在集群上部署包时,会将下载的 JDK 安装到主机上。设置过程的输出如以下屏幕截图所示:
-
现在,我们可以使用以下命令启动 Ambari 服务器:
sudo service ambari-server start -
Visit the web UI by opening URL:
http://master:8080.提示
现在,我们需要使用用户名和密码
admin登录到 Ambari 服务器。 -
After logging in, we will be able to install and manage our Hadoop cluster from the Ambari web UI, which is similar to the following screenshot:
-
Next, we need to configure Install Options as shown in the following screenshot:
-
After specifying the installation options as shown in the previous screenshot, we can click on the Register and Confirm button to start the installation process. This will lead to the host registration progress page as shown in the following screenshot. In this step, we need to confirm the hosts to install Hadoop:

- By clicking on the Next button, we will allow the web page to choose the services to install, as shown in the following screenshot:

- By default, all the services are selected to be installed; we can make changes based on the requirements and then click on the Next button. We will go to a web page to assign hosts as masters, slaves, and clients, as shown in the following screenshot:

- Next, we will go to a web page for customizing services, for example, configuring the location for the
NameNodedirectory. In this step, some services such as Hive and Nagios may ask you to enter administrative usernames and passwords, which are required for service installation.

- After everything is configured, we will get a summary page about our configurations, as shown in the following screenshot:

- By clicking on the Deploy button, the cluster deployment will start and a progress bar will appear for each service that is being installed, as shown in the following screenshot:

- After the deployment completes, we will get a Summary page as shown in the following screenshot:

- 通过单击完成按钮,集群安装过程将完成,和我们将能够看到集群的状态,如以下屏幕截图所示:
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 参考incubator.apache.org/ambari/
- 参考incubator.apache.org/ambari/1.2.…
使用 Chukwa 监视 Hadoop 集群
Chukwa是一个为收集和分析 Hadoop 日志而开发的项目。 它使用 HDFS 作为其存储架构,并包含许多用于日志分析和集群监控的工具包。 在本食谱中,我们将指导您完成配置 Chukwa 以监视 Hadoop 集群的步骤。
做好准备
最新版本的 Chukwa 使用 HBase 进行键值存储。 因此,在开始之前,我们假设 Hadoop 和 HBase 已经安装并正确配置。
接下来,我们可以使用以下步骤安装 Chukwa:
-
从官网incubator.apache.org/chukwa下载最新版本,例如使用以下命令:
sudo wget http://mirror.symnds.com/software/Apache/incubator/chukwa/chukwa-0.5.0/chukwa-incubating-src-0.5.0.tar.gz -P /usr/local -
使用以下命令解压缩存档文件:
sudo tar xvf chukwa-incubating-src-0.5.0.tar.gz -
使用以下命令为目录创建符号链接:
sudo ln -s chukwa-incubating-src-0.5.0 chukwa -
使用以下命令更改目录的所有权:
sudo chown hduser.hduser chukwa-incubating-src-0.5.0 -R sudo chown hduser.hduser chukwa -R -
通过将以下内容添加到
~/.bashrc文件中来更改环境变量:export CHUKWA_HOME=/usr/local/chukwa PATH=$CHUKWA_HOME/bin:$PATH -
使用以下命令从源代码构建 Chukwa:
source ~/.bashrc cd $CHUKWA_HOME mvn clean package -
When the compilation finishes, the directory structure of Chukwa will be similar to the following:
chukwa ├── bin │ ├── chukwa │ ├── chukwa-config.sh │ ├── slaves.sh │ ├── start-agents.sh │ ├── start-chukwa.sh │ ├── start-collectors.sh │ └── VERSION ├── conf │ ├── auth.conf │ ├── chukwa-agent-conf.xml │ ├── chukwa-collector-conf.xml │ ├── chukwa-demux-conf.xml │ ├── chukwa-env.sh │ ├── chukwa-log4j.properties │ ├── collectors │ ├── agents │ ├── hadoop-log4j.properties │ ├── hadoop-metrics.properties │ ├── hbase.schema │ ├── initial_adaptors │ └── system-data-loader.properties └── ... 29 directories, 93 files提示
如果您下载的是 Chukwa 的二进制版本,则目录结构可能与此不同。
-
使用以下命令安装
telnet:sudo yum install telnet -
使用以下命令将中的从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置 Chukwa 以进行 Hadoop 监视:
-
将
$HADOOP_HOME/conf/log4j.properties文件中的log4j.appender.DRFA变量更改为以下值:log4j.appender.DRFA=org.apache.log4j.net.SocketAppender -
使用以下命令将 Hadoop
metrics文件从Chukwa目录复制到 Hadoop 配置目录:cp $CHUKWA_HOME/etc/chukwa/hadoop-metrics.properties $HADOOP_HOME/conf -
使用以下命令将
client.jar文件从 Chukwa 安装目录复制到 Hadoop 共享目录:cp $CHUKWA_HOME/share/chukwa/chukwa-0.5.0-client.jar $HADOOP_HOME/lib -
使用以下命令将
json库从 Chukwa 库复制到 Hadoop 库:cp $CHUKWA_HOME/share/chukwa/lib/json-simple-1.1.jar $HADOOP_HOME/lib -
使用以下命令将文件和配置同步到从节点:
for host in cat $HADOOP_HOME/conf/slaves do echo ‘Copying file to ‘ $host scp $HADOOP_HOME/lib/chukwa-0.5.0-client.jar $host:$HADOOP_HOME/lib; scp $HADOOP_HOME/lib/json-simple-1.1.jar $host: $HADOOP_HOME/lib; scp $HADOOP_HOME/conf/hadoop-metrics.properties $host:$HADOOP_HOME/conf done -
使用以下命令重启 Hadoop 集群:
stop-all.sh start-all.sh -
使用以下命令启动 HBase 后台进程:
start-hbase.sh -
Import the Chukwa
schemafile to HBase with the following command:hbase shell < $CHUKWA_HOME/etc/chukwa/hbase.schema该命令将产生类似于以下内容的输出:
HBase Shell; enter ‘help<RETURN>’ for list of supported commands. Type “exit<RETURN>” to leave the HBase Shell Version 0.94.5, r1443843, Fri Feb 8 05:51:25 UTC 2013 create “Hadoop”, {NAME => “ClientTrace”, VERSIONS => 65535}, {NAME => “dfs_namenode”, VERSIONS => 65535}, {NAME => “dfs_FSNamesystem”, VERSIONS => 65535}, {NAME => “dfs_datanode”, VERSIONS => 65535}, {NAME => “mapred_jobtracker”, VERSIONS => 65535}, {NAME => “mapred_shuffleOutput”, VERSIONS => 65535}, {NAME => “mapred_tasktracker”, VERSIONS => 65535}, {NAME => “jvm_metrics”, VERSIONS => 65535}, {NAME => “mapred_Queue”, VERSIONS => 65535}, {NAME => “metricssystem_MetricsSystem”, VERSIONS => 65535}, {NAME => “rpc_rpc”, VERSIONS => 65535}, {NAME => “rpcdetailed_rpcdetailed”, VERSIONS => 65535}, {NAME => “ugi_ugi”, VERSIONS => 65535} 0 row(s) in 2.7920 seconds create “HadoopLog”, {NAME => “NameNode”, VERSIONS => 65535}, {NAME => “Audit”, VERSIONS => 65535} 0 row(s) in 1.0740 seconds create “Jobs”, {NAME => “summary” } 0 row(s) in 1.0610 seconds create “SystemMetrics”, {NAME => “cpu”, VERSIONS => 65535}, {NAME => “system”, VERSION => 65535}, {NAME => “disk”, VERSION => 65535}, {NAME => “memory”, VERSION => 65535}, {NAME => “network”, VERSION => 65535}, {NAME => “tags”, VERSION => 65535} 0 row(s) in 1.1030 seconds create “ClusterSummary”, {NAME=> “cpu”, VERSIONS => 65535}, {NAME => “system”, VERSION => 65535}, {NAME => “disk”, VERSION => 65535}, {NAME => “memory”, VERSION => 65535}, {NAME => “network”, VERSION => 65535}, {NAME => “hdfs”, VERSION => 65535}, {NAME => “mapreduce”, VERSION => 65535} 0 row(s) in 1.0830 seconds create “chukwa”, {NAME=>”chukwaAgent_chunkQueue”, VERSIONS => 65535}, {NAME => “chukwaAgent_metrics”, VERSION => 65535}, {NAME => “chukwaAgent_httpSender”, VERSION => 65535} 0 row(s) in 1.0860 seconds输出显示已经创建了 6 个 HBase 表。
-
Use a text editor to open the
$CHUKWA_HOME/etc/chukwa/chukwa-collector-conf.xmlfile and comment thechukwaCollector.pipelineproperty by adding the following string before the property:<!--在属性末尾添加以下字符串:
-->通过这样做,我们已经将 Chukwa 配置为使用 HBase 进行日志收集存储。
-
将文件中的环境变量配置为以下值:
```sh
export JAVA_HOME=/usr/java/latest
export HADOOP_HOME=/usr/local/hadoop
export HBASE_HOME=/usr/local/hbase
export HADOOP_CONF_DIR=$HADOOP_HOME/conf
export HBASE_CONF_DIR=$HBASE_HOME/conf
```
11. 通过将以下主机名添加到$CHUKWA_HOME/etc/chukwa/agents文件,将 Chukwa 配置为从从节点收集数据:
```sh
slave1
slave2
slave3
...
```
12. We can run multiple collectors (for example, we want to run collectors on the master and slave1 nodes) by adding the following content into the $CHUKWA_HOME/etc/chukwa/collectors file:
```sh
http://master:8081
http://slave1:8081
```
### 备注
多个收集器可以提高数据收集过程的吞吐量。
13. Start the Chukwa agents with the following command:
```sh
start-agents.sh
```
我们将获得类似于以下屏幕截图的输出:

14. Start the Chukwa collector with the following command:
```sh
start-collectors.sh
```
此命令的输出类似于以下内容:

15. 使用
```sh
export PIG_CLASSPATH=$HADOOP_HOME/conf:$HBASE_HOME/conf
```
将 Hadoop 和 HBase 的配置目录添加到 Pig`CLASSPATH`条目
16. 使用pig通过以下命令分析数据:
```sh
pig -Dpig.additional.jars=$HBASE_HOME/hbase-0.94.5.jar:$PIG_HOME/pig-0.11.0.jar $CHUKWA_HOME/share/chukwa/script/pig/ClusterSummary.pig
```
17. 使用以下命令启动Hadoop Infrastructure Care Center(HICC)的 Web UI:
```sh
chukwa hicc
```
18. 打开 URLhttp://master:4080,并使用admin作为登录的用户名和密码。
提示
我们可以修改$CHUKWA_HOME/etc/chukwa/auth.conf文件以更改登录凭据。
默认情况下,该文件将包含以下内容:
admin: admin, user
这个的意思是username: password[, role]。
它是如何工作的.
Chukwa 旨在收集集群中跨分布式机器动态生成的数据。 它有四个主要组件:Adaptor、收集器、MapReduce或其他数据处理作业,以及称为HICC的 Web UI。
Chukwa 适配器部署在每台数据源计算机上。 适配器在这些机器上以代理的形式运行,这些代理将收集的数据发送到本地或远程机器上的收集器。
Chukwa 收集器将数据从代理输送到 HDFS 等数据存储系统。 出于性能原因,数据通常作为序列文件写入,这些文件将由 MapReduce 作业处理。
MapReduce 作业将生成键-值对,以供最后一个组件-HICC 进行可视化。 Chukwa 使用嵌入式 Web 服务器Jetty部署 Web 存档文件$CHUKWA_HOME/ share/chukwa/webapps/hicc.war。
提示
有时,您可能在运行 HICC 和访问 Web UI 时遇到问题;最可能的原因是您有不兼容的 Hadoop、HBase 和 Chukwa 的.jar文件。 在这种情况下,我的建议是从 GitHub(github.com/apache/chuk…)克隆源代码,然后从源代码编译hicc.warWeb 归档文件。 有关更多信息,请查看源代码根目录中的README.txt文件。
总而言之,楚科瓦的数据流可以用下图来描述:
有关楚克瓦设计的更多信息,请查看网址:incubator.apache.org/chukwa/docs…。
还有更多...
由于该软件包的不稳定,在将其部署到集群上时可能需要进行一些调试。 但是,要开始使用 Chukwa,建议始终以本地或伪分布式模式运行它,这将在本地计算机上启动一个代理和一个收集器。 为此,可以使用以下命令:
chukwa agent local
前面的命令将给出以下输出:
OK chukwaAgent.checkpoint.dir [File] = /tmp/chukwa/log/
OK chukwaAgent.checkpoint.interval [Time] = 5000
OK chukwaAgent.control.port [Portno] = 9093
OK chukwaAgent.sender.fastRetries [Integral] = 4
我们还可以使用以下命令:
chukwa collector local
此命令将提供以下输出:
OK chukwaCollector.http.port [Integral] = 8081
OK chukwaCollector.pipeline [ClassName list] = org.apache.hadoop.chukwa.datacollection.writer.SocketTeeWriter,org.apache.hadoop.chukwa.datacollection.writer.hbase.HBaseWriter
OK chukwaCollector.rotateInterval [Time] = 300000
OK chukwaCollector.writerClass [ClassName] = org.apache.hadoop.chukwa.datacollection.writer.PipelineStageWriter
OK writer.hdfs.filesystem [URI] = hdfs://master:54310
started Chukwa http collector on port 8081
我们可以通过使用以下命令跟踪日志文件来检查守护程序的状态:
tail -f /tmp/chukwa/logs/agent.log
tail -f /tmp/chukwa/logs/collector.log
目前,Chukwa 是Apache Free Software(AFS)基金会下的孵化器项目。 我们可以在wiki.apache.org/hadoop/chuk…的维基页面或官方网站incubator.apache.org/chukwa/上查看开发计划和进展。 与许多开放源码项目类似,会报告新的错误并添加新功能;跟上最新更改的一个很好的方法是使用源代码存储库,它可以在:github.com/apache/chuk…中找到。
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考incubator.apache.org/chukwa/docs…**