MapReduce应用程序框架提供了基本支持,可以通过分布式缓存部署新版本的MapReduce框架。通过设置适当的配置属性,用户可以运行与集群初始部署版本不同的MapReduce版本。例如,集群管理员可以将多个版本的MapReduce存放在HDFS中,并通过配置mapred-site.xml
来指定作业默认使用的版本。这使得管理员能够在特定条件下对MapReduce框架进行滚动升级。
目前通过分布式缓存部署MapReduce框架的功能尚未支持用于提交和查询作业的客户端代码,也未处理在每个NodeManager中作为辅助服务运行的ShuffleHandler
代码。因此,以下限制适用于能以滚动升级方式通过分布式缓存成功部署的MapReduce版本:
MapReduce版本必须与用于提交和查询作业的作业客户端代码兼容。如果不兼容,则必须在任何将使用新MapReduce版本提交或查询作业的节点上单独升级作业客户端。
MapReduce版本必须与提交作业的作业客户端使用的配置文件兼容。如果与该配置不兼容(例如:需要设置新属性或更改现有属性值),则必须先更新配置。
MapReduce版本必须与集群节点上运行的ShuffleHandler
版本兼容。如果不兼容,则必须将新的ShuffleHandler
代码部署到集群中的所有节点,并且必须重新启动NodeManagers以获取新的ShuffleHandler
代码。
部署新版本的MapReduce包含三个步骤:
将MapReduce归档文件上传至作业提交客户端可访问的位置。理想情况下,归档文件应存放在集群默认文件系统的公开可读路径下。更多详情请参阅下文关于归档文件位置的讨论。您可以使用框架上传工具执行此步骤,例如mapred frameworkuploader -target hdfs:///mapred/framework/hadoop-mapreduce-3.4.1.tar#mrframework
。该工具会选取classpath中的jar文件,并将其打包到由-target和-fs选项指定的tar归档文件中。随后工具会返回如何设置mapreduce.application.framework.path
和mapreduce.application.classpath
的建议。
-fs
: 目标文件系统。默认为fs.defaultFS
设置的默认文件系统。
-target
是框架压缩包的目标位置,可选择性地在#后添加本地化别名。随后将tar文件上传至指定目录。由于jar文件已压缩,无需使用gzip。请确保目标目录对所有用户可读,但除管理员外其他用户不可写,以保障集群安全。
配置 mapreduce.application.framework.path
指向归档文件所在位置。与为作业指定分布式缓存文件时类似,该URL支持在指定URL片段时为归档创建别名。例如,hdfs:///mapred/framework/hadoop-mapreduce-3.4.1.tar.gz#mrframework
将被本地化为 mrframework
而非 hadoop-mapreduce-3.4.1.tar.gz
。
配置mapreduce.application.classpath
以设置与上述MapReduce归档文件配合使用的正确类路径。如果使用frameworkuploader
工具,该工具会上传所有依赖项并返回需要在此处配置的值。注意:如果配置了mapreduce.application.framework.path
但mapreduce.application.classpath
未引用归档路径的基名或指定的别名(如果指定了别名),则会发生错误。
请注意,MapReduce归档文件的位置对作业提交和作业启动性能至关重要。如果归档文件未位于集群的默认文件系统上,则每次作业时它将被复制到作业暂存目录,并本地化到运行作业任务的每个节点。这将降低作业提交和任务启动性能。
如果归档文件位于默认文件系统上,那么作业客户端将不会为每次作业提交将归档文件上传到作业暂存目录。然而,如果归档路径不是所有集群用户都可读,则归档文件将在执行任务的每个节点上为每个用户单独本地化。这可能导致分布式缓存中出现不必要的重复。
在处理大型集群时,提高归档文件的复制因子以增强其可用性可能非常重要。这将分散集群节点首次本地化归档文件时的负载压力。
上述提到的frameworkuploader
工具包含有助于调整性能的额外参数:
-initialReplication
: 这是框架压缩包创建时使用的副本数量。保持默认值3是安全的,这是经过测试的场景。
-finalReplication
: 上传工具会在所有数据块收集并上传完成后设置副本数。若需要快速启动,建议将该值设置为已部署节点数除以二(但不超过512)。这将利用HDFS以分布式方式传播压缩包。当作业启动时,它们很可能从本地HDFS节点获取数据,或从众多备选源节点中选择。若将此值设置为较低数值(如10),则这些副本节点的输出带宽将影响首个作业的运行速度。待集群中所有作业启动后,可手动将副本数降至较低值(如10)以节省磁盘空间。
-acceptableReplication
: 该工具将等待直到压缩包达到此复制次数后才会退出。此复制次数应小于或等于finalReplication
中的值。通常取finalReplication
值的90%以应对节点故障情况。
-timeout
: 以秒为单位的超时时间,表示工具在退出前等待达到acceptableReplication
的时长。否则工具会记录错误并返回。
为MapReduce归档文件设置适当的类路径取决于归档文件的组成以及它是否有其他依赖项。例如,归档文件不仅可以包含MapReduce的jar包,还可以包含必要的YARN、HDFS和Hadoop Common的jar包以及所有其他依赖项。在这种情况下,mapreduce.application.classpath
将被配置为类似以下示例的内容,其中归档文件的基本名称为hadoop-mapreduce-3.4.1.tar.gz,并且归档文件内部的组织结构与标准的Hadoop发行版归档文件类似:
$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/mapreduce/lib/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/common/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/common/lib/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/yarn/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/yarn/lib/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/hdfs/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/hdfs/lib/*
另一种可能的方法是让归档文件仅包含MapReduce的jar包,而其余依赖项则从节点上安装的Hadoop发行版中获取。在这种情况下,上述示例将更改为类似以下内容:
$HADOOP_CONF_DIR,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.1/share/hadoop/mapreduce/*,$PWD/hadoop-mapreduce-3.4.1.tar.gz/hadoop-mapreduce-3.4.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
工具提供以下参数来控制哪些jar包最终包含在框架压缩包中:
-input
: 这是被遍历的输入类路径。找到的jar文件将被添加到压缩包中。默认值为hadoop classpath
命令返回的类路径。
-blacklist
: 这是一个用逗号分隔的正则表达式数组,用于过滤要从类路径中排除的jar文件名。例如,可用于排除测试jar或不需本地化的Hadoop服务。
-whitelist
: 这是一个逗号分隔的正则表达式数组,用于包含特定的jar文件。这可用于提供额外的安全性,确保在工具运行时没有外部来源能在类路径中包含恶意代码。
-nosymlink
: 该标志可用于排除指向同一目录的符号链接。此选项并不常用。例如,/a/foo.jar
和指向/a/foo.jar
的符号链接/a/bar.jar
通常会将foo.jar
和bar.jar
作为单独文件添加到压缩包中,尽管它们实际上是同一个文件。使用此标志将使工具排除/a/bar.jar
,从而只添加文件的一个副本。
如果在集群中也启用了shuffle加密,那么我们可能会遇到MR作业失败并出现如下异常的问题:
2014-10-10 02:17:16,600 WARN [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.Fetcher: Failed to connect to junpingdu-centos5-3.cs1cloud.internal:13562 with 1 map outputs javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:81) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.setNewClient(AbstractDelegateHttpsURLConnection.java:61) at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:584) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1193) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) at org.apache.hadoop.mapreduce.task.reduce.Fetcher.verifyConnection(Fetcher.java:427) ....
这是因为MR客户端(从HDFS部署)无法访问本地文件系统中$HADOOP_CONF_DIR目录下的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: Uploaded hdfs://mynamenode/mapred/framework/mr-framework.tar#mr-framework INFO uploader.FrameworkUploader: Suggested mapreduce.application.classpath $PWD/mr-framework/*
将mapreduce.application.framework.path
设置为第一个值,mapreduce.application.classpath
设置为上面记录的第二个值。