Hadoop配置
本文章在其他文章基础上参考编辑
Hadoop配置API
hadoop中的组件都是通过Hadoop自己的配置API配置的,一个Configuration
类的实例代表了Hadoop集群的配置。配置类似于Map,由属性及值组成。属性为String
类型,值则可以为java基本类型、其他有用类型(例如String、Class、java.io.File)及String集合。
API重要属性
- quitemode:boolean类型,配置信息加载过程中,是否处于安静模式,即有一些信息不会被记录,默认是true;
- resources:ArrayList类型,Resource是Configuration的内部类,有两个属性Object resource和String name;resources是一个对象数组,用于存储有关包含配置信息的对象;
- finalParameters:Set类型,所有被声明为final的变量集合,声明为final就表示不能被后续覆盖;
- loadDefaults:boolean类型,是否加载默认配置;
- REGISTRY:WeakHashMap<Configuration,Object>类型,用于多个对象的相关配置的注册及对它们进行管理,记录了所有的Configuration;
- defaultResources:CopyOnWriteArrayList类型,用于存储默认的配置资源名或路径;
- properties:java内置的Properties类型,存储所有配置信息,KV值;
- overlay:Properties类型,是用户设置的而不是通过对资源解析得到的;
- classloader:ClassLoader类型,主要用于加载指定的类或者加载相关资源;
- updatingResource:HashMap<String, String[]>类型,存储最近加载或修改的属性
- VAR_PATTERN:静态Pattern类型,用于正则匹配,Pattern.compile("\$\{[\}\$\u0020]+\}"),正则表达式中$、{、}都是保留字,所以需要用"“进行转义,“\$\{”用于匹配${key}中的key前面的”${";最后的"\}“用于匹配key后的”}";中间部分"[\}\KaTeX parse error: Can't use function '\u' in math mode at position 1: \̲u̲0020]+"用于匹配属性扩展…"、"}“和空格(\u0020指的是空格)以外的所有字符,还有”+"出现至少1次。
- MAX_SUBST:静态int类型,默认值是20,MAX_SUBST是设定对带有环境变量的值所能够深入解析的层次数,超出这个最大的层数的值将不能够解析。
API初始化
- 静态代码块: 调用构造方法之前执行,会加载core-default.xml和core-site.xml两个文件,Configuration的子类也会同样加载这两个文件。
static {
deprecationContext = new AtomicReference(new Configuration.DeprecationContext((Configuration.DeprecationContext)null, defaultDeprecations));
ClassLoader cL = Thread.currentThread().getContextClassLoader();
if (cL == null) {
cL = Configuration.class.getClassLoader();
}
if (cL.getResource("hadoop-site.xml") != null) {
LOG.warn("DEPRECATED: hadoop-site.xml found in the classpath. Usage of hadoop-site.xml is deprecated. Instead use core-site.xml, mapred-site.xml and hdfs-site.xml to override properties of core-default.xml, mapred-default.xml and hdfs-default.xml respectively");
}
addDefaultResource("core-default.xml");
addDefaultResource("core-site.xml");
VAR_PATTERN = Pattern.compile("\\$\\{[^\\}\\$ ]+\\}");
}
- 构造方法:
- Configuration():调用参数为
true
的构造方法。 - Configuration(boolean loadDefaults):确认是否加载默认配置。
- Configuration(Configuration other):第三个就是将指定的Configuration对象重新复制一份。
- 加载资源
可以通过Configuration的addResource()方法或者静态方法addDefaultResource()(设置了loadDefaults标志)来添加资源到Configuration中。但是add之后资源并不会立即被加载,hadoop的Configuration被设计成了“懒加载”,即在需要时才会被加载。在add之后会调用reloadConfiguration()方法清空properties和finalParameters。- addDefaultResource()方法,这是一个静态方法。通过这个方法可以添加系统的默认资源。在HDFS中会被用来加载hdfs-default.xml和hdfs-site.xml;在MapReduce中会被用来加载mapred-default.cml和mapred-site.xml,可以在相关的Configuration子类中找到相应地静态代码块。
- addResource方法,该方法有6种形式,也就是可以add的形式:可以是一个输入流、HDFS文件路径、WEB,URL、CLASSPATH资源、以及Configuration对象。这些方法都会将参数封装成Resource对象后,传递给addResourceObject方法并调用该方法。在addResourceObject方法中会将Resource对象加入resources中并调用reloadConfiguration方法
- 属性获取
见:https://www.cnblogs.com/lxf20061900/p/4189727.html
配置属性特性
- 配置可以被覆盖,也可以被系统属性或其他属性重新定义。一般优先级为:系统定义(例如命令行模式下用JVM参数
-Dproperty=value
覆盖资源文件中的该属性定义) > 资源文件定义 - 资源文件中被标记为
final
的属性无法被覆盖 - 系统属性可以覆盖配置属性,但是如果定义了系统属性,但没有定义同名的配置属性,则无法通过该API访问。
配置管理
管理配置的目的
开发Hadoop应用时,经常需要在本地运行和集群运行之间切换,因此通过不同Hadoop配置文件包含各个集群配置,在运行时指定连接。
基于环境变量
通过配置HADOOP_CONF_DIR
。当使用Configuration conf = new Configuration()
时Hadoop会自动加载该变量指向的目录下的资源文件。
通过Hadoop自带工具的-conf
参数配置
使用方法:hadoop fs -conf [config local path] [cmd]
使用例子:hadoop fs -conf conf/hadoop-local.xml -ls /
通过使用Tool
接口实现
GenericOptionParser
该类的主要作用是通过解析常用的Hadoop命令行选项,并为Configuration
对象是指相应的取值。不过通常情况下不使用该类,而是实现Tool
接口,通过ToolRunner
类运行。后者内部调用该类。
Tool和ToolRunner
在下面的实例中,ConfigurationPrinter
作为Configured
的一个子类,Configured
是Configurable
接口的一个实现
资源文件:
example/resource_1.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<property>
<name>sizes</name>
<value>10</value>
</property>
<property>
<name>weight</name>
<value>50</value>
<final>true</final>
</property>
<property>
<name>size-weigh</name>
<value>${sizes},${weight},${test}</value>
</property>
</configuration>
example-resource_2.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<property>
<name>sizes</name>
<value>1</value>
</property>
<property>
<name>weight</name>
<value>20</value>
<final>true</final>
</property>
</configuration>
使用示例:
package chapter6;
/*
* @author 赵鹏越
* @date 2018/11/2
*/
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.util.Map;
/**
* 用于解析命令行参数
* hadoop chapter6.ConfigurationPrinter -D color=value |egrep 'color|weight|sizes|size-weigh|test'
* 注:
* -D 设置一个属性键值对
* out:
* color=value
*/
public class ConfigurationPrinter extends Configured implements Tool {
static {
// 加载配置文件
Configuration.addDefaultResource("hadoop/core-site.xml");
Configuration.addDefaultResource("hadoop/hdfs-site.xml");
Configuration.addDefaultResource("hadoop/mapred-site.xml");
Configuration.addDefaultResource("hadoop/yarn-site.xml");
}
public int run(String[] strings) throws Exception {
// 所有命令行参数都会加载到下面的Configuration对象中
Configuration conf = getConf();
for (Map.Entry<String, String> entry: conf) {
System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
}
// 系统变量配置sizes,优先级最高
System.setProperty("sizes", "12");
conf.addResource("example/resource_1.xml");
conf.addResource("example/resource_2.xml");
// 系统变量test在资源未见中未定义,可引用,但是无法获取
System.setProperty("test", "12");
// 系统变量优先级较高,输出12
System.out.println("sizes: " + conf.get("sizes"));
// resource_1文件中标记为final属性,故输出50
System.out.println("weight: " + conf.get("weight"));
// 引用相关变量,故输出12,50,12
System.out.println("size-weigh: " + conf.get("size-weigh"));
// 系统变量test在资源未见中未定义,可引用,但是无法获取,输出null
System.out.println("test: " + conf.get("test"));
return 0;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
System.exit(exitCode);
}
}
// STDOUT
sizes: 1
weight: 50
size-weigh: 12,50,12
test: null