Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

介绍

MapReduce应用程序框架具有基本支持,可以通过分布式缓存部署新版本的MapReduce框架。通过设置适当的配置属性,用户可以运行与最初部署到集群的MapReduce不同的版本。例如,集群管理员可以在HDFS中放置多个版本的MapReduce,并配置mapred-site.xml以指定默认情况下将使用哪些版本的作业。这使管理员可以在某些情况下对MapReduce框架进行滚动升级。

前提条件和局限性

当前通过分布式缓存部署MapReduce框架的支持无法解决用于提交和查询作业的作业客户端代码。它还没有解决在每个NodeManager中作为辅助服务运行的ShuffleHandler代码。因此,以下限制适用于可通过分布式缓存以滚动升级方式成功部署的MapReduce版本:

  • MapReduce版本必须与用于提交和查询作业的作业客户端代码兼容。如果不兼容,则必须在将要提交或查询使用新MapReduce版本的作业的任何节点上分别升级作业客户端。

  • MapReduce版本必须与提交作业的作业客户端使用的配置文件兼容。如果它与该配置不兼容(例如:必须设置新属性或更改现有属性值),则必须首先更新该配置。

  • MapReduce版本必须与集群中的节点上运行的ShuffleHandler版本兼容。如果不兼容,则必须将新的ShuffleHandler代码部署到集群中的所有节点,并且必须重新启动NodeManager,以获取新的ShuffleHandler代码。

通过分布式缓存部署新的MapReduce版本

部署新的MapReduce版本包括三个步骤:

  1. 将MapReduce存档上传到作业提交客户端可以访问的位置。理想情况下,存档应位于群集的默认文件系统上的公共可读路径中。有关更多详细信息,请参见下面的存档位置讨论。您可以使用框架上传器工具来执行此步骤,例如mapred frameworkuploader -target hdfs:///mapred/framework/hadoop-mapreduce-3.2.1.tar#mrframework。它将选择类路径中的jar文件,并将它们放入-target和-fs选项指定的tar归档文件中。然后,该工具会返回有关如何设置mapreduce.application.framework.pathmapreduce.application.classpath的建议

    -fs:目标文件系统。默认为fs.defaultFS设置的默认文件系统。

    -target是框架tarball的目标位置,可以选择后面跟一个带有本地化别名的#。然后将tar上传到指定目录。不需要gzip,因为jar文件已经被压缩。确保目标目录可被所有用户读取,但除管理员以外的其他用户不可写入,以保护群集安全。

  2. 配置mapreduce.application.framework.path指向存档所在的位置。与为作业指定分布式缓存文件时一样,这是一个URL,如果指定了URL片段,它也支持为归档创建别名。例如,hdfs:///mapred/framework/hadoop-mapreduce-3.2.1.tar.gz#mrframework将被本地化为mrframework而不是hadoop-mapreduce-3.2.1.tar.gz

  3. 配置mapreduce.application.classpath来设置正确的类路径,以与上面配置的MapReduce存档一起使用。如果使用frameworkuploader工具,它将上载所有依赖项并返回需要在此处配置的值。如果发生错误:注意mapreduce.application.framework.path被构造但mapreduce.application.classpath如果指定的别名不引用存档路径或别名的基本名称。

请注意,MapReduce存档的位置对于作业提交和作业启动性能至关重要。如果归档文件不在群集的默认文件系统上,则它将被复制到每个作业的作业登台目录中,并本地化到作业任务运行所在的每个节点。这将减慢作业提交和任务启动性能。

如果归档文件位于默认文件系统上,则作业客户端将不会将归档文件上载到每个作业提交的作业登台目录。但是,如果档案路径不是所有集群用户都可读的,则档案将针对执行任务的每个节点上的每个用户分别进行本地化。这可能会导致分布式缓存中不必要的重复。

当使用大型群集时,增加归档的复制因子以提高其可用性可能很重要。当群集中的节点首次本地化存档时,这将分散负载。

上面提到的frameworkuploader工具还具有其他有助于调整性能的参数:

-initialReplication:这是创建框架tarball的复制计数。将该值保留为默认值3是安全的。这是经过测试的方案。

-finalReplication:收集并上传所有块后,上载器工具将设置复制。如果需要快速初始启动,则建议将其设置为委托节点数除以2,但不超过512。这将利用HDFS以分布式方式分布tarball。作业启动后,它们很可能会命中本地HDFS节点进行本地化,或者可以从大量其他源节点中进行选择。如果将其设置为较低的值(如10),则这些复制节点的输出带宽将影响第一个作业的运行速度。一旦所有作业在群集中启动,就可以将复制计数手动降低到10之类的低值,以节省磁盘空间。

-acceptableReplication:该工具将等到压缩包被复制此次数后退出。复制计数应小于或等于finalReplication中的值。这通常是finalReplication中值的90%,以适应出现故障的节点。

-timeout:以秒为单位的超时,等待退出工具之前达到acceptableReplication。否则,该工具会记录错误并返回。

MapReduce存档和类路径配置

为MapReduce存档设置适当的类路径取决于存档的组成以及它是否具有任何其他依赖关系。例如,归档文件不仅可以包含MapReduce jar,还可以包含必要的YARN,HDFS和Hadoop Common jar和所有其他依赖项。在这种情况下,会将mapreduce.application.classpath配置为类似于以下示例,其中档案库的基本名称为hadoop-mapreduce-3.2.1.tar.gz,并且档案库的内部组织方式类似于标准Hadoop分发档案库:

$ HADOOP_CONF_DIR,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / mapreduce / *,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop -mapreduce-3.2.1 / share / hadoop / mapreduce / lib / *,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / common / *,$ PWD /hadoop-mapreduce-3.2.1.tar.gz/hadoop-mapreduce-3.2.1/share/hadoop/common/lib/*,$PWD/hadoop-mapreduce-3.2.1.tar.gz/hadoop-mapreduce- 3.2.1 / share / hadoop / yarn / *,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / yarn / lib / *,$ PWD / hadoop- mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / hdfs / *,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / hdfs / lib / *

另一种可能的方法是使存档仅由MapReduce jar组成,并从节点上安装的Hadoop分发中获取其余的依赖项。在这种情况下,上面的示例将变为以下内容:

$ HADOOP_CONF_DIR,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop-mapreduce-3.2.1 / share / hadoop / mapreduce / *,$ PWD / hadoop-mapreduce-3.2.1.tar.gz / hadoop -mapreduce-3.2.1 / share / hadoop / mapreduce / lib / *,$ HADOOP_COMMON_HOME / share / hadoop / common / *,$ HADOOP_COMMON_HOME / share / hadoop / common / lib / *,$ HADOOP_HDFS_HOME / share / hadoop / hdfs / *,$ HADOOP_HDFS_HOME / share / hadoop / hdfs / lib / *,$ HADOOP_YARN_HOME / share / hadoop / yarn / *,$ HADOOP_YARN_HOME / share / hadoop / yarn / lib / *

frameworkuploader工具有以下参数控制,罐子在框架压缩包结束:

-input:这是迭代的输入类路径。找到的jar文件将添加到tarball中。它默认为hadoop classpath命令返回的类路径

-blacklist:这是一个逗号分隔的正则表达式数组,用于过滤jar文件名以从类路径中排除。例如,它可以用于排除本地化不需要的测试jar或Hadoop服务。

-whitelist:这是一个逗号分隔的正则表达式数组,其中包含某些jar文件。这可以用来提供附加的安全性,以便在运行该工具时,没有任何外部源可以在类路径中包含恶意代码。

-nosymlink:此标志可用于排除指向同一目录的符号链接。这没有被广泛使用。例如,/a/foo.jar和符号链接/a/bar.jar它指向/a/foo.jar通常会添加foo.jar中bar.jar到压缩包作为单独的文件,尽管它们实际上是相同的文件。此标志将使该工具排除/a/bar.jar,因此仅添加文件的一个副本。

如果集群中还启用了随机加密,那么我们将遇到MR作业失败的问题,如下所示:

2014-10-10 02:17:16,600警告[fetcher#1] org.apache.hadoop.mapreduce.task.reduce.Fetcher:无法连接到junpingdu-centos5-3.cs1cloud.internal:13562(具有1个地图输出)
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到指向所请求目标的有效证书路径
    在com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    在com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
    在com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
    在com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
    在com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
    在com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
    在com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
    在com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
    在com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
    在com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
    在com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
    在com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
    在sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
    在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:81)
    在sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:61)
    在sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:584)
    在sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1193)
    在java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    在sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
    在org.apache.hadoop.mapreduce.task.reduce.Fetcher.verifyConnection(Fetcher.java:427)
....

这是因为MR客户端(从HDFS部署)无法访问$ HADOOP_CONF_DIR目录下本地FS中的ssl-client.xml。要解决此问题,我们可以将带有ssl-client.xml的目录添加到MR的类路径中,该目录已在上述“ mapreduce.application.classpath”中指定。为了避免MR应用程序受到其他本地配置的影响,最好创建一个用于放置ssl-client.xml的专用目录,例如$ HADOOP_CONF_DIR下的子目录,例如:$ HADOOP_CONF_DIR / security。

框架上传工具可用于收集MapReduce AM,映射器和精简器将使用的集群jar。它返回提供建议配置值的日志

INFO uploader.FrameworkUploader:上传的hdfs://mynamenode/mapred/framework/mr-framework.tar#mr-framework
INFO uploader.FrameworkUploader:建议的mapreduce.application.classpath $ PWD / mr-framework / *

分别将mapreduce.application.framework.path设置为上面的第一个记录值,并将mapreduce.application.classpath设置为上面的第二个记录值。