hadoop configuration

参考

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()方法加载配置资源。这里其实采用了延迟加载的设计模式,当真正需要配置数据的时候,才开始分析配置文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值