2021SC@SDUSC hadoop源码分析(十一)

2021SC@SDUSC

本篇我将对hadoop-common中的Unix Shell Guide进行分析

重要的最终用户环境变量

Apache Hadoop有许多控制软件各个方面的环境变量。(参见hadoop-env.sh和相关文件。)其中一些环境变量专门用于帮助最终用户管理他们的运行时。

HADOOP_CLIENT_OPTS:

此环境变量用于所有最终用户的非守护程序操作。它可以用于通过系统属性定义设置任何Java选项以及任何Apache Hadoop选项。例如:

HADOOP_CLIENT_OPTS="-Xmx1g -Dhadoop.socks.server=localhost:4000" hadoop fs -ls /tmp

将增加内存,并通过SOCKS代理服务器发送此命令。

(command)_(subcommand)_OPTS:

也可以根据每个子命令设置选项。这允许用户为特定情况创建特殊选项。模式的第一部分是正在使用的命令,但全部是大写的。命令的第二部分是正在使用的子命令。然后最后是字符串_OPT。

例如,要配置mapred distcp要使用2GB堆,可以使用:

MAPRED_DISTCP_OPTS="-Xmx2g"

HADOOP_CLASSPATH:

应该通过shellprofile条目配置站点范围的设置,应该通过${HOME}/配置永久的用户范围的设置。hadooprc使用hadoop_add_classpath功能。更多信息见下文。

Apache Hadoop脚本能够通过设置此环境变量,将更多内容注入到正在运行的命令的类路径中。它应该是以冒号分隔的目录、文件或通配符位置列表。

HADOOP_CLASSPATH=${HOME}/lib/myjars/*.jar hadoop classpath

用户可以通过HADOOP_USER_CLASSPATH_FIRST变量。将该值设置为任意值将告诉系统尝试将这些路径推到前面。

Auto-setting of Variables:
 

如果用户有一组通用的设置,可以将它们放入${HOME}/。hadoop-env文件。该文件总是被读取以初始化和覆盖用户可能想要定制的任何变量。它使用bash语法,类似于。bashrc文件:

例如:

#
# my custom Apache Hadoop settings!
#

HADOOP_CLIENT_OPTS="-Xmx1g"
MAPRED_DISTCP_OPTS="-Xmx2g"
HADOOP_DISTCP_OPTS="-Xmx2g"

这.hadoop-env文件还可以用来扩展功能,并教授Apache Hadoop新技巧。例如,运行hadoop命令来访问环境变量中引用的服务器${HADOOP_SERVER},以下在。hadoop-env会这么做:

if [[ -n ${HADOOP_SERVER} ]]; then
  HADOOP_CONF_DIR=/etc/hadoop.${HADOOP_SERVER}
fi

并不是所有的Unix Shell API例程都可用或者在.hadoop-env。

管理员环境:

除了各种XML文件之外,管理员在使用Unix Shell时,还有两项关键功能可以配置Apache Hadoop:

  • 影响系统运行方式的许多环境变量。本指南将只强调一些关键问题。通常有更多的信息*-环境卫生文件。

  • 对现有脚本进行补充或做一些特定于平台的更改。Apache Hadoop提供了进行函数覆盖的功能,因此现有的代码库可以在不做所有这些工作的情况下就地更改。替换函数将在后面的外壳应用编程接口文档中介绍。

(命令)_(子命令)_OPTS:

到目前为止,最重要的是_OPTS控制守护进程工作方式的变量。这些变量应该包含这些守护程序的所有相关设置。

与上面的用户命令类似,所有守护程序都将遵守(命令)_(子命令)_OPTS模式。通常建议将这些设置在hadoop-env.sh以保证系统知道重启时应该使用哪些设置。与面向用户的子命令不同,守护程序将荣耀HADOOP_CLIENT_OPTS。

此外,以额外安全模式运行的守护程序也支持(命令)_(子命令)_SECURE_EXTRA_OPTS。这些选项是补充的普通的*_OPTS并且将出现在之后,因此通常优先。

(命令)_(子命令)_USER

Apache Hadoop提供了一种按子命令进行用户检查的方法。虽然这种方法很容易被规避,不应该被认为是一种安全特性,但它确实提供了一种防止事故的机制。例如,设置HDFS _名称节点_用户=hdfs会让hdfs名称节点和hdfs -守护进程启动名称节点命令通过检查用户环境变量。这也适用于非守护程序。环境HADOOP_DISTCP_USER=jane会证实这一点用户设置为简在被允许执行hadoop distcp命令。

如果_USER环境变量存在,并且命令以特权运行,执行将首先切换到指定的用户。对于出于安全原因支持用户帐户切换并因此具有SECURE_USER变量的命令,base _USER变量需要是预期用于切换到SECURE_USER帐户的用户。例如:

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs

将强制“hdfs–守护程序start datanode”成为root用户,但最终将在特权工作完成后切换到HDFS用户。

请注意,如果使用- workers标志,则会发生用户切换在...之后ssh被调用。但是,sbin中的多守护进程启动和停止命令将在之前切换(如果合适),因此将使用指定的_USER的键。

开发人员和高级管理员环境:

Shell Profiles:

pache Hadoop允许第三方通过各种可插拔接口轻松添加新功能。这包括一个外壳代码子系统,可以很容易地将必要的内容注入到基础安装中。

这个功能的核心是外壳概要文件的概念。Shell概要文件是shell代码片段,可以完成诸如向类路径添加jar、配置Java系统属性等任务。

外壳配置文件可以安装在$ { HADOOP _ CONF _ DIR }/shell profile . d或者$ { HADOOP _ HOME }/libexec/shell profile . d。中的外壳配置文件libexec目录是基本安装的一部分,用户不能覆盖。如果最终用户在运行时更改配置目录,配置目录中的Shell配置文件可能会被忽略。

shell配置文件的一个例子在libexec目录中。

Shell API:

Apache Hadoop的外壳代码有一个函数库管理员和开发人员可以使用它来帮助他们进行配置和高级功能管理。这些应用编程接口遵循标准Apache Hadoop接口分类,增加一项:可更换。

外壳代码允许核心函数被覆盖。然而,并不是所有的功能都可以或安全地被替换。如果一个函数不能安全替换,它将具有可替换的属性:否。如果一个函数可以安全替换,它将具有可替换的属性:是。

为了替换一个函数,创建一个名为Hadoop-用户-函数. sh在……里${HADOOP_CONF_DIR}目录。只需在这个文件中定义新的替换函数,系统就会自动提取它。这个文件中可以有任意多的替换函数。函数替换的例子在Hadoop-用户-函数. sh .示例文件。

标记为“公共”和“稳定”的函数在shell配置文件中按原样使用是安全的。其他功能可能会在小版本中发生变化。

User-level API Access:

除.hadoop-env之外,允许单个用户覆盖hadoop-env.sh,用户也可以使用.hadooprc.这是在Apache Hadoop外壳环境配置完成后调用的,允许全套外壳API函数调用。

例如:

hadoop_add_classpath /some/path/custom.jar

Dynamic Subcommands:

利用Shell API,第三方可以将自己的子命令添加到主Hadoop shell脚本(Hadoop、hdfs、mapred、yarn)中。

在执行子命令之前,主脚本将检查是否存在(script name)_ sub command _(sub command)函数。该函数在参数设置为所有剩余命令行参数的情况下执行。例如,如果定义了以下函数:

function yarn_subcommand_hello
{
  echo "$@"
  exit $?
}

然后执行 yarn --debug hello world I see you将激活脚本调试并调用yarn_subcommand_hello功能如下:

yarn_subcommand_hello world I see you

这将导致输出:

world I see you

还可以将新的子命令添加到用法输出中。这hadoop _ add _子命令函数将文本添加到用法输出中。利用标准的HADOOP_SHELL_EXECNAME变量,我们可以限制哪个命令得到我们的新函数。

if [[ "${HADOOP_SHELL_EXECNAME}" = "yarn" ]]; then
  hadoop_add_subcommand "hello" client "Print some text to the screen"
fi

我们将子命令类型设置为“客户端”,因为没有特殊限制、额外功能等。这个功能也可以用来覆盖内置的。例如,定义:

function hdfs_subcommand_fetchdt
{
  ...
}

将取代现有的hdfs fetchdt带有自定义命令的子命令。

动态子命令的一些关键环境变量:

  • HADOOP _ CLASSNAME

这是程序继续执行时要使用的Java类的名称。

  • HADOOP _ PRIV _ CLASSNAME

这是当守护程序预期以特权模式运行时要使用的Java类的名称。(详见下文。)

  • HADOOP_SHELL_EXECNAME

这是正在执行的脚本的名称。它将是hadoop、hdfs、mapred或纱线中的一种。

  • HADOOP_SUBCMD

这是在命令行上传递的子命令。

  • ARGS

该数组包含Apache Hadoop公共参数处理完成后的参数列表,并且是作为参数传递给子命令函数的同一列表。例如,如果hadoop -调试subcmd 1 2 3已经在命令行上执行,那么${HADOOP_SUBCMD_ARGS[0]}将是1和hadoop_subcommand_subcmd也会有等于1的1美元。这个数组列表可以由子命令函数修改,以便从参数列表中添加或删除值,以便进一步处理。

  • HADOOP _ SECURE _ CLASSNAME

如果此子命令运行支持安全模式的服务,则应将此变量设置为安全版本的类名。

  • HADOOP_SUBCMD_SECURESERVICE

将此设置为true将强制子命令在安全模式下运行,而不管hadoop_detect_priv_subcmd如何。预计HADOOP_SECURE_USER将被设置为执行最终流程的用户。查看有关安全模式的更多信息。

  • HADOOP _ SUBCMD _ SUPPORTDAEMONIZATION

如果此命令可以作为守护程序执行,请将其设置为true。

  • HADOOP_USER_PARAMS

这是命令行的全部内容,在任何解析完成之前。它将包含标志,例如-调试。它可能不会被操纵。

如果不需要进一步处理,Apache Hadoop运行时工具需要函数退出。例如,在上面的hello示例中,不需要Java和其他工具退出$?已经足够了。然而,如果要利用该功能HADOOP _ CLASSNAME,那么程序执行必须继续,这样带有Apache Hadoop特定参数的Java将针对给定的Java类启动。另一个例子是不可恢复的错误。函数的责任是打印适当的消息(最好使用hadoop_error API调用)并适当退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值