본문 바로가기

IT for researcher/Cloud Computing

The JobConf Object in Detail


Pro Hadoop 책에 부록 A에서 일부분을 발췌해서 발번역함.

job의 모든것은 JobConf 객체를 통해 제어된다; 이것은 맵리듀스 job의 중심이다. 프레임워크는 JobConf 객체를 가져다가 XML로 표현할 것이다. 그런 후 모든 태스크들은 시작될 때 XML을 로드할 것이다. 이번 섹션은 관련 메소드들을 다루고 기본적인 사용 예제들을 제공할 것이다.
JobConf 클래스는 Configuration 클래스로부터 상속받는다. JobConf 객체는 프로그래머와 프레임워크 사이에 주요 인터페이스이기 때문에 Configuration 베이스 클래스로 부터 온 메소드와 구분없이 사용자가 이용할 수 있는 JobConf의 모든 메소드에 대해서 상세히 알아볼 것이다. 그림 A-1에서 보여진 것 같이 새로운 JobConf 객체는 hadoop-default.xml과 hadoop-site.xml 파일을 로드하고 합친다.
디폴트 파일인  hadoop-default.xml과 hadoop-site.xml  파일과 사용자가 지정한 추가 XML 리소스들은 (AddResource 메소드를 이용해서 지정) JVM 클래스 패스에서 찾아지고 설정데이터에 합쳐진다. 리소스로써 로드된 설정 값들은 reloadConfiguration을 호출하여 제거된다. 반면에 clear() 를 호출하는 것은 모든 값들을 제거한다. 값을 찾을 때, setter 호출을 통해 값을 셋팅하는 것은 리소스에 의해 로드된 값들 보다 우선적이다. 그림 A-1에 룩업 과정이 기술되어 있다.
각 설정 항목은 이름과 값 쌍으로 되어 있다. 이 파라미터들은 하둡 프레임워크 코드에게 어떻게 클러스터와 연락하는지 말해주고 여러 속성들의 디폴트이며 태스크들에게 임의의 값들을 전달하도록 허락한다. conf/hadoop-default.xml 파일은 하둡 코어 프레임워크 파라미터들의 대부분 목록을 가지고 있다. 다른 파라미터들은 소스코드를 읽어야 찾아진다.
당신은 설정에서 값 쌍들을 위한 임의의 이름을 지정할 수 있고 이러한 이름=값 쌍들은 맵리듀스 태스크에서 이용된다. 태스크가 시작하면 객체는 직렬화 되고 각 맵리듀스 태스크에 의해 역직렬화 된다.
설정 파라미터들에 대한 네이밍 관례는 area.subarea.specif 이다. 분산 파일 시스템을 설정하는 파라미터들은 dfs 로 시작하고 맵리듀스 프레임워크를 설정하는 파라미터들은 mapred로 시작한다.




JobConf Object in the Driver and Tasks

JobConf 객체는 두가지 롤을 가지고 있다. job 드라이버에서 JobConf 객체는 job을 위한 모든 파라미터를 가지고 만들어진다. job 실행에는 요구 데이터, JobConf 객체, JAR 파일, 아카이브 그리고 다른 리소스들이 특정 job 디렉토리 HDFS 안에 저장된다.
태스크에서 JobConf 객체는 재구성되고 지역화된다. mapred.local.dir에 정의된 경로들에서 디렉토리가 설정된다. job JAR 파일과같이 로컬 파일 시스템으로 부터 참조되야만 하는 항목이거나 DistributedCache를 통하여 전달될 다른 항목들은 로컬 디렉토리에 압축이 풀리고 설정에서 항목에대한 경로 참조가 태스크 로컬 경로가 되도록 조정된다. 태스크가 실행을 위한 JVM을 위한 클래스패스 또한 태스크가 클래스패스 리소스들이 풀려있는 로컬 파일시스템의 위치를 포함하도록 설정된다.

JobConf is a Properties Table

JobConf 인스턴스들은 모든 설정 파라미터들을 위한 키/값 쌍의 테이블을 유지한다. 값들은 String 객체로써 저장되고 그들이 객체라면 직렬화 된다. 가장 낮은 레벨에서, 오퍼레이션들은 키에 대한 값을 가져오거나 저장한다.


Variable Expansion
JobConf 객체는 값을 리턴하는 것이 그들에 포함된 특수 텍스트를 가지면 값들에 변수 확장을 수행한다. 문법은 ${key} 이다. 이것은 키의 값으로 대체될 것이다.
설정 파일들에서 너는 종종 다음과 같은 값들을 볼 수 있다.
<value>${key}something</value>
키가 System.properties 또는 현재 설정에 존대한다면, ${key}는 키에 대한 값으로 대체될 것이다.
그림 A-1을 보면 ${key}를 가지고 있는 값들은 System.properties에서 키에 대한 값을 찾는다. 찾을 수 없다면 JbConf 객체의 설정에서 찾는다. 이 확장은 재귀적이다. 확장이 또 다른 ${item} 참조를 가진다. 이러한 프로세스는 항목이 없을때 까지 계속된다.


<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>no.expansion</name>
<value>no.expansion Value</value>
</property>
<property>
<name>expansion.from.configuration</name>
<value>The value of no.expansion is ${no.expansion}</value>
</property>
<property>
<name>java.io.tmpdir</name>
<value>failed attempt to override a System.properties value for variable expansion</value>
</property>
<property>
<name>order.of.expansion</name>
<value>The value of java.io.tmpdir from System.properties: ${java.io.tmpdir}</value>
</property>
<property>
<name>expansion.from.JDK.properties</name>
<value>The value of java.io.tmpdir from System.properties: ${java.io.tmpdir}</value>
</property>
<property>
<name>nested.variable.expansion</name>
<value>Will expansion.from.configuration's value have substition: [${expansion.from.configuration}]</value>
</property>
</configuration>


Final Values

<final> true <final> --> set 함수를 통해서 오버라이드 할 수 없다.