Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

Apache Hadoop的许多功能都是通过shell控制。有几种方法可以修改这些命令的默认行为。

重要的最终用户环境变量

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代理服务器发送此命令。

注意:如果定义了“ YARN_CLIENT_OPTS”,则当使用“ yarn”运行命令时,它将替换“ HADOOP_CLIENT_OPTS”。

(命令)_(子命令)_OPTS

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

例如,要将映射的distcp配置为使用2GB堆,可以使用:

MAPRED_DISTCP_OPTS =“-Xmx2g”

这些选项将在执行期间出现 HADOOP_CLIENT_OPTS 之后,并且通常优先。

HADOOP_CLASSPATH

注意:应通过shellprofile条目配置站点范围的设置,并应使用hadoop_add_classpath函数通过$ {HOME} /。hadooprc配置永久的用户范围的设置。请参阅下面的详细信息。

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

HADOOP_CLASSPATH = $ {HOME} / lib / myjars / *。jar hadoop类路径

用户可以通过HADOOP_USER_CLASSPATH_FIRST变量提供有关路径位置的提示。将此值设置为任何值将告诉系统尝试将这些路径推到最前面。

自动设置变量

如果用户具有一组通用设置,则可以将它们放入$ {HOME} /。hadoop-env文件中。始终读取此文件以初始化和覆盖用户可能要自定义的任何变量。它使用bash语法,类似于.bashrc文件:

例如:

#
#我的自定义Apache Hadoop设置!
#

HADOOP_CLIENT_OPTS =“-Xmx1g”
MAPRED_DISTCP_OPTS =“-Xmx2g”
HADOOP_DISTCP_OPTS =“-Xmx2g”

.hadoop-ENV文件也可用于扩展功能,并教的Apache Hadoop的新花样。例如,要运行hadoop命令来访问在环境变量$ {HADOOP_SERVER}中引用的服务器,.hadoop-env中的以下命令将做到这一点:

如果[[-n $ {HADOOP_SERVER}]]; 然后
  HADOOP_CONF_DIR = / etc / hadoop。$ {HADOOP_SERVER}
科幻

一句话警告:并非所有的Unix Shell API例程都可用或在.hadoop-env中正常工作。有关.hadooprc的更多信息,请参见下文。

管理员环境

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

  • 影响系统运行方式的许多环境变量。本指南仅重点介绍一些关键的内容。通常,各种* -env.sh文件中包含更多信息。

  • 对现有脚本进行补充或做一些特定于平台的更改。Apache Hadoop提供了执行功能覆盖的功能,因此可以在不进行所有所有工作的情况下就地更改现有代码库。稍后在Shell API文档中介绍如何替换功能。

(命令)_(子命令)_OPTS

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

与上面的用户命令类似,所有守护程序都将遵循(command)_(subcommand)_OPTS模式。通常建议在hadoop-env.sh中进行设置,以确保系统知道重启时应使用哪些设置。不同于面向用户的子命令,守护进程将兑现HADOOP_CLIENT_OPTS

此外,以额外安全性模式运行的守护程序还支持(command)_(subcommand)_SECURE_EXTRA_OPTS。这些选项是通用* _OPTS的补充它们将在之后出现,因此通常优先。

(命令)_(子命令)_USER

Apache Hadoop提供了一种执行用户检查每个子命令的方法。尽管此方法很容易被规避并且不应被视为安全功能,但它确实提供了一种预防事故的机制。例如,设置HDFS_NAMENODE_USER = hdfs将使hdfs namenodehdfs --daemon start namenode命令通过检查USER环境变量来验证运行命令的用户是hdfs用户。这也适用于非守护程序。设置HADOOP_DISTCP_USER = jane将在允许用户执行hadoop distcp命令之前验证USER是否设置为jane

如果存在_USER环境变量,并且以特权(例如,以root身份运行;请参见API文档中的hadoop_privilege_check)运行命令,则执行将首先切换到指定的用户。对于出于安全原因支持用户帐户切换的命令,因此具有SECURE_USER变量(请参阅下文),基本_USER变量必须是预期用于切换到SECURE_USER帐户的用户。例如:

HDFS_DATANODE_USER =根
HDFS_DATANODE_SECURE_USER = HDFS

将强制将“ hdfs –daemon start datanode”设置为root,但在特权工作完成后最终将切换到hdfs用户。

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

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

外壳轮廓

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

此功能的核心是外壳配置文件的概念。Shell概要文件是可以执行诸如将jar添加到类路径,配置Java系统属性等操作的shell片段。

Shell配置文件可以安装在$ {HADOOP_CONF_DIR} /shellprofile.d$ {HADOOP_HOME} /libexec/shellprofile.d中libexec目录中的Shell配置文件是基本安装的一部分,不能被用户覆盖。如果最终用户在运行时更改配置目录,则可以忽略配置目录中的Shell配置文件。

shell配置文件的示例在libexec目录中。

Shell API

Apache Hadoop的外壳程序代码具有一个功能库,该功能库可供管理员和开发人员使用,以帮助其配置和高级功能管理。这些API遵循标准的Apache Hadoop接口分类,并具有以下补充:可替换。

Shell代码允许重写核心功能。但是,并非所有功能都可以被替换或可以安全地替换。如果某个函数不能安全替换,它将具有可替换的属性:否。如果某个函数可以安全替换,将具有可替换的属性:是。

为了替换功能,$ {HADOOP_CONF_DIR}目录中创建一个名为hadoop-user-functions.sh的文件。只需在此文件中定义新的替换功能,系统就会自动选择它。该文件中可能有许多替换功能。函数替换的示例在hadoop-user-functions.sh.examples文件中。

标记为“公共”和“稳定”的功能可以安全地在shell概要文件中使用。在次要版本中,其他功能可能会更改。

用户级API访问

除了.hadoop-env(允许单个用户覆盖hadoop-env.sh)之外,用户还可以使用.hadooprc。在配置了Apache Hadoop Shell环境之后,将调用此方法,并允许完整的Shell API函数调用集。

例如:

hadoop_add_classpath /some/path/custom.jar

会进入.hadooprc

动态子命令

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

在执行子命令之前,主脚本将检查(scriptname)_subcommand_(subcommand)函数是否存在。使用设置为所有其余命令行参数的参数执行该函数。例如,如果定义了以下功能:

函数yarn_subcommand_hello
{
  回声“ $ @”
  退出$?
}

然后执行yarn --debug hello world我看到您将激活脚本调试并按以下方式调用yarn_subcommand_hello函数:

yarn_subcommand_hello world我见到你

这将导致输出:

我看见你的世界

也可以将新的子命令添加到用法输出中。该hadoop_add_subcommand函数添加文本使用输出。利用标准的HADOOP_SHELL_EXECNAME变量,我们可以限制哪个命令获得我们的新功能。

如果[[“ $ {HADOOP_SHELL_EXECNAME}” =“纱”]]; 然后
  hadoop_add_subcommand“你好”客户端“在屏幕上打印一些文本”
科幻

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

函数hdfs_subcommand_fetchdt
{
  ...
}

…将用自定义命令替换现有的hdfs fetchdt子命令。

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

  • HADOOP_CLASSNAME

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

  • HADOOP_PRIV_CLASSNAME

这是期望守护程序在特权模式下运行时要使用的Java类的名称。(请参阅下文。)

  • HADOOP_SHELL_EXECNAME

这是正在执行的脚本的名称。它将是hadoop,hdfs,mapred或yarn之一。

  • HADOOP_SUBCMD

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

  • HADOOP_SUBCMD_ARGS

此数组包含Apache Hadoop通用参数处理完成后的参数列表,并且与作为参数传递给子命令函数的列表相同。例如,如果在命令行上执行了hadoop --debug 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

在完成任何解析之前,这是命令行的全部内容。它将包含--debug之类的标志。它可能无法被操纵。

如果不需要进一步处理,则Apache Hadoop运行时设施要求函数退出。例如,在上面的hello示例中,不需要Java和其他功能,因此只需退出$?。足够了。但是,如果该函数使用HADOOP_CLASSNAME,则必须继续执行程序,以便针对给定的Java类启动具有Apache Hadoop特定参数的Java。另一个示例是发生不可恢复的错误的情况。该函数负责打印适当的消息(最好使用hadoop_error API调用)并适当退出。

以特权运行(安全模式)

某些守护程序,例如DataNode和NFS网关,可以在特权模式下运行。这意味着它们应该以root身份启动,并且(默认情况下)可以通过jsvc切换到另一个用户ID。这允许这些守护程序获取低特权端口,然后在正常执行期间放弃超级用户特权。使用动态子命令的第三方也可以特权运行。如果满足以下条件:

  • (命令)_(子命令)_SECURE_USER环境变量已定义并指向有效的用户名
  • HADOOP_SECURE_CLASSNAME已定义,并指向有效的Java类

然后,shell脚本将尝试像内置命令一样,以特权方式运行该类。通常,要求用户定义_SECURE_USER变量,而开发人员则在其Shell脚本引导程序中定义_CLASSNAME。