参考
Hadoop Configuration 源码详解
使用Hadoop Configuration一些需要注意的细节
hadoop3.0 api
介绍
使用Configuration类的对象去初始化一个任务,在整个任务执行过程中,作为参数的携带者,任务执行过程中所需要的所有参数都从该对象中获取,是一个配置文件管理类。
设置属性方式
hadoop jar $jar \
${classname} \ # 类名
-conf ${conf_file} \ #xml文件,配置属性
-Ddfs.client.socket-timeout=59001 \ #-D...=... 单独设置属性
-Dmapreduce.map.speculative=true \
-Dmapreduce.reduce.speculative=true \
-Dcom.miaozhen.etl.blacklist=$cfg_path/etl_black_list.conf \
${参数1} \
${参数2}
//在run中添加配置信息
public void set(String name, String value)
public void addResource(String name) //Path,url均可,只是参数不同
//conf的配置必须在新建job之前,之后的设置不起作用
//必须在新建job,传conf前配置好conf相关信息,后续设置的将不起作用
conf.set("myjob.config", "/user/adm/tmp");
Job job = Job.getInstance(conf, "verifyresult_getmerge");
//不起作用,在mapper,reducer中访问不到
conf.set("myjob.config1", "/user/adm/tmp1");
属性加载方式顺序
- 通过
set
设置的属性优先级比通过addResource
设置要高; - 通过相同方式(都是通过
set
、或都是通过addResource
)设置属性,后面的会覆盖掉前面的设置;但是如果都是通过addResource
设置,而且前面有些属性使用了final属性,那么后面的设置不能覆盖前面的设置; - 如果系统加载的配置文件(core-site.xml、mapred-site.xml以及hdfs-site.xml等)中有相关的属性被设置为final,那么用户程序里面不管是通过
set
还是addResource
方式设置,都无法覆盖系统的设置。所以Hadoop管理员通常会将一些系统级别的属性设置为final,以防止用户自己修改,如下。
<property>
<name>dfs.hosts.include</name>
<value>/etc/hadoop/conf/hosts.include</value>
<final>true</final>
</property>
属性扩展
<property>
<name>basedir</name>
<value>/user/${user.name}</value>
</property>
<property>
<name>tempdir</name>
<value>${basedir}/tmp</value>
</property>
<property>
<name>otherdir</name>
<value>${env.BASE_DIR}/other</value>
</property>
When conf.get("tempdir")
is called, then ${*basedir*}
will be resolved to another property in this Configuration, while ${*user.name*}
would then ordinarily be resolved to the value of the System property with that name.
When conf.get("otherdir")
is called, then ${*env.BASE_DIR*}
will be resolved to the value of the ${*BASE_DIR*}
environment variable. It supports ${*env.NAME:-default*}
and ${*env.NAME-default*}
notations. The former is resolved to “default” if ${*NAME*}
environment variable is undefined or its value is empty. The latter behaves the same way only if ${*NAME*}
is undefined.
就是说会逐步去找相应的值,直到拼出最后的结果。
属性延迟加载
在新建Configuration对象的时候并没有真正解析配置文件中的内容,成员变量properties里的数据,只有真正需要的时候,才会被加载进来。在这个方法里,首先判断properties是否为空。如果为空,这时才执行loadResources()方法加载配置资源。这里其实采用了延迟加载的设计模式,当真正需要配置数据的时候,才开始分析配置文件。