Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[꿀팁] 하둡 inputPath로 다중 File 작업하기

BigDATA/Hadoop 2015.02.04 10:50
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


[그림 - 1 : 안구정화용~~]


// 참고 소스~~


// 아래처럼 path 들을 list에 넣어준다.

List<String> inputPath = new ArrayList<String>();
inputPath.add(otherArgs[0]+"/01_acet.clicklog_mo");
inputPath.add(otherArgs[0]+"/02_acet.clicklog_mo");


// 입출력 데이터 경로 설정
//FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

for(String input : inputPath){ // list에 담겨져있는 path들을 하나씩 넣어준다.
FileInputFormat.addInputPath(job, new Path(input));
}


나의 의문은 현재 하나의 파일을 input하여 output을 하는 단순한 맵-리듀스 프로그래밍을 했다.

그런데 input되는 파일이 하나가 아니라면? 경로를 어떻게 해줘야 많은 파일들을 처리할 수 있을까?

답은 위처럼 for을 돌려서 Path에 경로들을 넣어주면 돌아간다~


     - END -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Hadoop] 하둡 맵-리듀스 따라잡기

BigDATA/Hadoop 2015.02.02 13:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



맵-리듀스! 이녀석을 알아가기 위해 정리를 하나씩 해보려고 한다.

가장 쉬우면서도 어려운 맵-리듀스 소스 짜보기!


1. Maven 설정

 

<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>


2. runner : runner는 우선 map, reduce, data format등 그리고 run을 통해 시작 시킬수 있는 친구라고 생각하고 넘어가자.
아래의 소스는 가장 단순한 형태 이다. 보통 책에 나오거나 튜토리얼에 나오는 소스 형태! 중요한 것은 runner보다 map과reduce!

public class MoClickDistributionChartRunner extends Configured implements Tool {

public MoClickDistributionChartRunner() {
}

@Override
public int run(String[] args) throws Exception {

String[] otherArgs = new GenericOptionsParser(getConf(), args).getRemainingArgs();

// 입출력 데이터 경로 확인
if (otherArgs.length != 2) {
System.err.println("Usage: MoClickDistributionChartRunner <in> <out>");
System.exit(2);
}

// Job 이름 설정
Job job = new Job(getConf(), "MoClickDistributionChartJob");

// 입출력 데이터 경로 설정
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

// Job 클래스 설정
job.setJarByClass(MoClickDistributionChartJob.class);

// Mapper 클래스 설정
job.setMapperClass(MoClickDistributionChartMapper.class);
// Reducer 클래스 설정
job.setReducerClass(MoClickDistributionChartReducer.class);


// 입출력 데이터 포맷 설정
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

// 출력키 및 출력값 유형 설정
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

job.waitForCompletion(true);

return 0;
}

public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
// Tool 인터페이스 실행
int res = ToolRunner.run(new Configuration(), new MoClickDistributionChartRunner(), args);
System.out.println("## RESULT:" + res);
}
}

3. Mapper

public class MoClickDistributionChartMapper extends
Mapper<LongWritable, Text, Text, Text> {
// 입출력의 데이터포맷을 알수가 있다.

// map 메소드를 통해 수행 되어지며 key, value의 입력값들이 들어오게 된다.
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { ..블라블라~.. }}

- key는 라인을 나타내는 숫자형태이며, value는 Text형태의 값들이 들어온다.

- value값을 가지고 파싱하여 vo에 넣을수도 있으며 원하는 값을 가지고 오기 위해 parsing작업을 한다.

// 원하는 값들을 구하여 아래에 context.write를 해주면 output value로 들어가게 된다. Text, Text형태가 될 것이다. context.write(new Text(moSize), new Text(xyNum + "\t1"));


즉, 코딩에 들어가기전에 map과 reduce의 입력과 출력형태의 key, value를 고려하여야 한다.

4. Reducer : 

public class MoClickDistributionChartReducer extends
Reducer<Text, Text, Text, Text> {

protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {


작성 중~~

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

하둡 configuration으로 객체 넘기기!

BigDATA/Hadoop 2015.01.12 11:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



음....하둡 MR작업 중...

configuration에서 객체를 넘겨주고 싶어서 아래와 같이 인터페이스(QueryCodeList)와 구현체(QueryCodeListImpl)을 만든 뒤

setClass를 해주었다..

conf.setClass("queryCodeList", QueryCodeListImpl.class, QueryCodeList.class);

아래처럼 setClass시에 잘 생성 된 것을 알수가 있다.


그런 뒤 getClass를 통해 해당 객체를 가져오려고 하는데...잘안된다 ㅋㅋㅋㅋㅋ 널포인트 예외..ㄷㄷㄷ


 new 연산자를 통해 생성한 뒤에는 getClass로 가져올 수가 있었지만 아무 의미 없다~ 내가 하고자하는 것은 객체에 이미 데이터가 들어가 있는 상태이기 때문이다.

어떻게 해서 객체를 전달할 수 있을까?

1) Job쪽에 사용하고자 하는 객체를 생성 및 setter를 통해 데이터를 넣어줬다.

2) Gson을 통해 객체를 String형태로 만들어준다.

Gson gson = new Gson();    
conf.set("queryCodeList", gson.toJson(queryCodeListImplObject));

3) Map에서 conf.get을 통해 가져온다.

QueryCodeListImpl queryList = gson.fromJson(config.get("queryCodeList"), QueryCodeListImpl.class);

4) 해당 객체를 디버깅해서 보면 setter로 넣은 값들이 잘들어가 있는것을 확인할 수 있다. good~^0^


성능에 영향을 얼마나 줄지..과연!

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

04. 하둡 예제 실행 및 코딩해보기!

BigDATA/Hadoop 2014.09.15 14:56
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


1. 예제 실행


저번 시간에는 2014/09/11 - [BigDATA/Hadoop] - 부록. 하둡 설치  을 해보았습니다.


우선! 하둡에서 제공되어지는 예제코드와 예제 코드를 패키징한 jar를 수행 해보겠습니다.


1) 예제를 실행하기 전에 우선 다음과 같이 hadoop-env.sh 파일을 HDFS에 업로드 합니다.

    그냥 따라해봅시다~

  dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env.sh


fs 명령어를 아직은 잘은 모르지만 한번 해봅시다~

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -lsr conf/ 

-rw-r--r--   3 dakao supergroup       2540 2014-09-07 17:23 /user/dakao/conf/hadoop-env.sh


2) 파일이 업로드 되면 다음과 같이 하둡 명령어를 이용해 jar 파일을 실행합니다.

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$

./bin/hadoop jar hadoop-examples-*.jar wordcount conf/hadoop-env.sh wordcount_output

위의 명령어는 하둡명령어를 통해 jar를 수행한 것이고, hadoop-examples-*.jar파일에 있는 wordcount class를 실행하는데, 입력값은 

conf/hadoop-env.sh 파일을, 출력값은 output 디렉토리를 사용하겠다는 의미 입니다.

14/09/07 17:50:15 INFO input.FileInputFormat: Total input paths to process : 1

14/09/07 17:50:15 INFO util.NativeCodeLoader: Loaded the native-hadoop library

14/09/07 17:50:15 WARN snappy.LoadSnappy: Snappy native library not loaded

14/09/07 17:50:16 INFO mapred.JobClient: Running job: job_201409071442_0001

14/09/07 17:50:17 INFO mapred.JobClient:  map 0% reduce 0%

14/09/07 17:50:23 INFO mapred.JobClient:  map 100% reduce 0%

14/09/07 17:50:32 INFO mapred.JobClient:  map 100% reduce 100%

14/09/07 17:50:34 INFO mapred.JobClient: Job complete: job_201409071442_0001

14/09/07 17:50:34 INFO mapred.JobClient: Counters: 29

14/09/07 17:50:34 INFO mapred.JobClient:   Job Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Launched reduce tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=6145

14/09/07 17:50:34 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

14/09/07 17:50:34 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

14/09/07 17:50:34 INFO mapred.JobClient:     Launched map tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     Data-local map tasks=1

14/09/07 17:50:34 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=9190

14/09/07 17:50:34 INFO mapred.JobClient:   File Output Format Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Bytes Written=2283

14/09/07 17:50:34 INFO mapred.JobClient:   FileSystemCounters

14/09/07 17:50:34 INFO mapred.JobClient:     FILE_BYTES_READ=2983

14/09/07 17:50:34 INFO mapred.JobClient:     HDFS_BYTES_READ=2665

14/09/07 17:50:34 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=124429

14/09/07 17:50:34 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=2283

14/09/07 17:50:34 INFO mapred.JobClient:   File Input Format Counters 

14/09/07 17:50:34 INFO mapred.JobClient:     Bytes Read=2540

14/09/07 17:50:34 INFO mapred.JobClient:   Map-Reduce Framework

14/09/07 17:50:34 INFO mapred.JobClient:     Map output materialized bytes=2983

14/09/07 17:50:34 INFO mapred.JobClient:     Map input records=61

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce shuffle bytes=2983

14/09/07 17:50:34 INFO mapred.JobClient:     Spilled Records=348

14/09/07 17:50:34 INFO mapred.JobClient:     Map output bytes=3719

14/09/07 17:50:34 INFO mapred.JobClient:     Total committed heap usage (bytes)=176033792

14/09/07 17:50:34 INFO mapred.JobClient:     CPU time spent (ms)=1180

14/09/07 17:50:34 INFO mapred.JobClient:     Combine input records=305

14/09/07 17:50:34 INFO mapred.JobClient:     SPLIT_RAW_BYTES=125

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce input records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce input groups=174

14/09/07 17:50:34 INFO mapred.JobClient:     Combine output records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Physical memory (bytes) snapshot=245370880

14/09/07 17:50:34 INFO mapred.JobClient:     Reduce output records=174

14/09/07 17:50:34 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=1276059648

14/09/07 17:50:34 INFO mapred.JobClient:     Map output records=305 

    

3) 이제 wordcount를 실행한 출력값이 정상적으로 생성됐는지 확인해보겠습니다. 

    fs 명령어의 cat 파라미터를 사용해서 HDFS에 저장된 출력값을 확인해보겠습니다.

우선은 fs -lsr로 어떤 파일들이 있는지 확인 해보겠습니다.(namenode이나 datanode 아무곳에서나 확인 가능!)


dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -lsr wordcount_output/

-rw-r--r--   3 dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_SUCCESS

drwxr-xr-x   - dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_logs

drwxr-xr-x   - dakao supergroup          0 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history

-rw-r--r--   3 dakao supergroup      13774 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history/job_201409071442_0001_1410137416094_dakao_word+count

-rw-r--r--   3 dakao supergroup      51778 2014-09-07 17:50 /user/dakao/wordcount_output/_logs/history/job_201409071442_0001_conf.xml

-rw-r--r--   3 dakao supergroup       2283 2014-09-07 17:50 /user/dakao/wordcount_output/part-r-00000 


    

- Result

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ ./bin/hadoop fs -cat wordcount_output/part-r-00000

# 39

$HADOOP_BALANCER_OPTS" 1

$HADOOP_DATANODE_OPTS" 1

$HADOOP_HOME/conf/slaves 1

$HADOOP_HOME/logs 1

$HADOOP_JOBTRACKER_OPTS" 1

$HADOOP_NAMENODE_OPTS" 1

$HADOOP_SECONDARYNAMENODE_OPTS" 1

$USER 1

'man 1

(fs, 1

-o 1

/tmp 1

1000. 1

A 1

All 1

CLASSPATH 1

Command 1

ConnectTimeout=1 1

Default 1

Empty 2

Extra 3

File 1

HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_CLASSPATH= 1

HADOOP_CLIENT_OPTS 1

HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_HEAPSIZE=2000 1

HADOOP_HOME_WARN_SUPPRESS="TRUE" 1

HADOOP_IDENT_STRING=$USER 1

HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_LOG_DIR=${HADOOP_HOME}/logs 1

HADOOP_MASTER=master:/home/$USER/src/hadoop 1

HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_NICENESS=10 1

HADOOP_OPTS 1

HADOOP_OPTS=-server 1

HADOOP_PID_DIR=/var/hadoop/pids 1

HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote 1

HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves 1

HADOOP_SLAVE_SLEEP=0.1 1

HADOOP_SSH_OPTS="-o 1

HADOOP_TASKTRACKER_OPTS= 1

Hadoop-specific 1

JAVA_HOME 1

JAVA_HOME. 1

JAVA_HOME=/home/hadoop/hadoop/jdk1.7.0_67 1

JAVA_HOME=/usr/lib/j2sdk1.5-sun 1

Java 2

MB. 1

NOTE: 1

Optional. 1

Otherwise 1

Required. 1

Seconds 1

See 1

SendEnv=HADOOP_CONF_DIR" 1

Set 1

The 6

This 1

Unset 2

When 1

Where 1

a 3

ace-t 1

amount 1

appended 1

applies 1

are 4

arrive 1

attack. 1

be 4

best 1

between 1

by 9

can 4

clusters, 1

code 1

commands 1

commands. 1

configuration 1

correctly 1

daemon 1

daemons. 1

default. 8

defined 1

dfs, 1

directory 2

distcp 1

distributed 1

e.g., 1

elements. 1

environment 2

etc) 1

export 21

faster 1

file, 1

files 2

following 1

for 2

from. 1

fsck, 1

going 1

hadoop 2

hadoop. 1

heap 1

here. 1

host:path 1

hosts. 1

implementation 1

in 3

instance 1

is 5

it 2

java 1

large 1

log 1

master 1

maximum 1

modify 1

multiple 1

naming 1

nice'. 1

nodes. 1

of 2

on 1

only 2

optional. 1

options 1

options. 2

others 1

otherwise 1

pid 1

potential 1

priority 1

processes. 1

remote 2

representing 1

required 1

rsync'd 1

rsyncs 1

run 1

running 1

runtime 1

scheduling 1

service 1

set 2

should 2

slave 3

sleep 1

so 1

specific 1

specified 1

ssh 1

stored. 2

string 1

symlink 1

than 1

that 3

the 4

them. 1

there 1

this 3

to 9

use, 1

use. 1

useful 1

users 1

variable 1

variables 1

when 1

where 2

where, 1

written 1 

잘 이해가 가지 않더라도 그냥 이런식으로 되어지는구나..라고만 느끼자! 필 충만! 


2. 개발 환경 구성

여기에서는 이클립스와 JDK1.7을 셋팅 해보겠습니다.

  1) eclipse download - 클릭!

  2) JDK download - 클릭!     


참고 : 2014/07/02 - [Language/Java] - Mac에서 Jdk8 설치 되는 장소!


우선 /Users/AceT/app/hadoop 이라는 디렉토리에 ide 디렉토리와 java 디렉토리를 만들었습니다.

AceTui-MacBook-Pro:hadoop AceT$ pwd

/Users/AceT/app/hadoop

AceTui-MacBook-Pro:hadoop AceT$ ls

ide java 



jdk 심볼릭 링크 걸기!(java디렉토리에서)

 ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home hadoop_java1.7


잘걸어져있나 확인!

ls -alr

total 8

lrwxr-xr-x  1 AceT  staff   63  9 15 16:16 hadoop_java1.7 -> /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home

drwxr-xr-x  5 AceT  staff  170  9 15 15:21 ..

drwxr-xr-x  3 AceT  staff  102  9 15 16:16 .


심볼릭 링크 삭제는 rm 명령어를 통해 삭제하면 된다.

ex) rm (심볼릭 링크이름)

     rm hadoop_java1.7


이클립스를 기동 시킨 뒤  환경설정에서 Java쪽을 1.7로 바꿔준다. 디폴트로 1.8로 되어있었음! 

(기존에 1.6, 1.8이 셋팅되어있었기 때문에..이클립스가 그냥 기동되었던것 같다. jdk가 기존에 셋팅이 되어있지 않으신 분들은 셋팅을 해야 합니다. 즉, 터미널에서 java -version 쳤을 때 뭔가 나와야 한다는 것이다.) 


[이클립스 기동]




[환경 설정]

 - Eclipse > 환경설정...


- Java 버전 수정!

  -- Compiler

 

  -- JRE


이제는 maven 프로젝트를 하나 만듭니다.



simple하고 프로젝트를 만들어봅니다.


아래와 같이 hadoop-map-reduce라는 메이븐 프로젝트가 만들어졌습니다.(reduce인데..오타났네요 ㅠ)



자! 이제 대망의 맵리듀스 코딩을 해보겠습니다.

참고자료는 현재 사내스터디 책인 "하둡완벽가이드 개정3판" 으로 하겠습니다.^-^


코딩을 하기전에 input data가 필요 합니다. 그래서 기상 데이터를 분석해보도록 하겠습니다.

사용할 데이터는 국립기후자료센터(NCDC) 입니다. 


책의 부록을 보면 http://hadoopbook.com/code.html 의 사이트를 소개 합니다.

가보면 github 주소를 알려줍니다.goooood~^0^ 

input data : https://github.com/tomwhite/hadoop-book/tree/master/input/ncdc

                         sample.txt를 다운 받으신 뒤 하둡서버에 올려주시면 되겠습니다~

또한 hadoop 명령어 fs -put을 통해서 hdfs에 put을 해놓습니다.

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1$ 

hadoop fs -put input/ncdc/sample.txt input/ncdc/sample.txt


소스 : https://github.com/tomwhite/hadoop-book/tree/master/ch02/src/main/java


이제 이클리스를 기동하시고! 차례대로 따라하시면 됩니다.

1) 이클립스 기동!

2) pom.xml hadoop-core 추가! dependency는 메이븐레파지토리 사이트에서 원하는 jar에 맞게 가져오시면 됩니다.

<dependencies>  

   <dependency>

      <groupId>org.apache.hadoop</groupId>

      <artifactId>hadoop-core</artifactId>

      <version>1.2.1</version>

   </dependency>

</dependencies> 


3) 코딩! 3부분 코딩- Map / Reduce / main




4) jar로 묶기

  4-1) Export 하기


  4-2) jar 만들기 - Java > JAR file 선택



  4-3) jar file명 넣기 - hadoop-acet-example.jar



  4-5) Main class 지정 - 이 설정 때문인지..삽질 좀 했네요 ㅠㅠ 



5) 만들어진 jar를 하둡이 셋팅 된 서버에 옮겨놓습니다.



6) 실행 합니다!

   $hadoop jar hadoop-acet-example.jar input/ncdc/sample.txt output


중요! 아래와 같이 MaxTemperature라는 메인 클래스를 넣었을 때는..동작하지 않았었습니다..

 - 실행 - hadoop jar hadoop-acet-example.jar MaxTemperature input/ncdc/sample.txt output

 - 동작 X - $ hadoop jar hadoop-acet-example.jar MaxTemperature input/ncdc/sample.txt output

                    Usage: MaxTemperature <input path> <output path> 



7) 결과


8) file 확인 - hadoop fs -lsr output


9) file 내용 확인 - hadoop fs -cat /user/dakao/output/part-r-00000


맵-리듀스의 실행동작을 알아보았습니다. 대충 감이 오네요 후후~

하지만 더 중요한 것은!!! 맵과 리듀스의 코드겠죵?! 더더더 중요한 것은 하둡의 핵심인 HDFS와 MapReduce의 아키텍처입죠!

차근차근 이해하면서 제대로 알아가봐야겠네요^0^

그럼 오늘은 여기까쥐~!! 


참고 

1) http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html#Inputs+and+Outputs

2) https://github.com/rgan/hadoop-mapreduce-example

3) https://github.com/tomwhite/hadoop-book/tree/master/input/ncdc

4) 하둡 완벽가이드 개정3판


      - END -

저작자 표시 비영리 변경 금지
신고

'BigDATA > Hadoop' 카테고리의 다른 글

What is MapReduce??  (0) 2014.12.02
부록. 하둡설치(CDH)-클라우데라 배포판  (0) 2014.10.07
04. 하둡 예제 실행 및 코딩해보기!  (0) 2014.09.15
부록. 하둡 설치  (0) 2014.09.11
03. 맵리듀스 시작하기 - 맵-리듀스 개념  (5) 2014.09.01
02. About HDFS..  (0) 2014.08.28

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

부록. 하둡 설치

BigDATA/Hadoop 2014.09.11 01:25
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

하둡을 설치하기전에 해야할 일!

바로 리눅스 설치....

사실 하둡보다 리눅스 설치가 더 힘들었다..


setting~~



result :




환 경 : 맥북 프로 - Parallels

         setting OS - Ubuntu 14.04.1-server-amd64.iso   - 2014.09.04 최신버전!


목표 : 

  • 총 4대 : 네임노드 서버(Hadoop01) 1대, 데이터노드(Hadoop02, Hadoop03, Hadoop04) 3대 
  • openssh setting(Server, Client) - sudo apt-get install openssh-client openssh-server
  • mac에서 터미널로 접근(ssh hadoop01@xx.xx.xx.xx)
  • hadoop 계정 생성(홈디렉토리 지정)
  • Hadoop ver 1.x setting
  • JDK 1.6 이상 setting


1) mac 터미널로 접근을 해보자!

openssh를 설치하지 않으면! 접근 NO~~ - Connection refused!




그러므로 먼저 ssh를 셋팅하자!

sudo apt-get install openssh-client openssh-server



참고 사이트 : 우분투  SSH 셋팅 관련


이제는 하둡을 셋팅하기 위해 계정을 설정 해보자.

2) 하둡 실행 계정 생성

먼저 root로 로그인을 해야하기 때문에 처음 셋팅 시 root의 암호를 지정해줘야한다.

   $ sudo passwd


   root로 로그인하기 su root or su -


   login이후 계정생성!  계정은 반드시!! 전부 dakao로 해주어야한다!!! 그렇지 않으면 ssh 할 때 문제가..ㅠ.ㅠ..

   ex) adduser dakao --home /home/hadoop/hadoop


팁 : 유저변경 후 권한은 chown -R dakao:dakao /home/  이런식으로 하면 다카오계정에 다카오그룹이 홈이하로~


3) 하둡 설치-생성한 계정으로! ex) su dakao

wget을 이용!

wget "http://mirror.apache-kr.org/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz"


압축해제! tar -xvf hadoop-1-2-1.tar.gz


tip) chmod 명령어로 파일 또는 디렉토리 권한 설정을할 수 있음.


4) hosts 설정

root권한으로 /etc/hosts에 아래와 같이 상황에 맞게 수정한다.

10.231.15.1    search-nn-hadoop01

10.231.15.2    search-dn-hadoop02

10.231.15.3    search-dn-hadoop03

10.231.15.4    search-dn-hadoop04


5) 인코딩 확인

인코딩 확인 - utf-8이 아니라면 수정해줘야한다! 

     어디에서? 당근 루뜨로! vi /etc/sysconfig/i18n

     수정 후, source /etc/sysconfig/i18n

dakao01@ubuntu:~/hadoop-1.2.1$ echo $LANG

en_US.UTF-8


6) 자바 설치

명령어로 해보려하였지만..그냥 오라클 사이트가서 다운로드 뒤 파일지라로 업로드 하였음!

/home/hadoop01/hadoop/jdk1.7.0_67


setting 후 .profile에 추가!

export JAVA_HOME=/home/hadoop/hadoop/jdk1.7.0_67

export HADOOP_HOME=/home/hadoop/hadoop/hadoop-1.2.1

export PATH=$PATH:$HADOOP_HOME/bin:$JAVA_HOME/bin


source .profile


적용 후! java -version 과 hadoop을 쳐보면 됩니다.


java -version

dakao01@ubuntu:~$ java -version

java version "1.7.0_67"

Java(TM) SE Runtime Environment (build 1.7.0_67-b01)

Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)


hadoop

Warning: $HADOOP_HOME is deprecated.


Usage: hadoop [--config confdir] COMMAND

where COMMAND is one of:

  namenode -format     format the DFS filesystem

  secondarynamenode    run the DFS secondary namenode

  namenode             run the DFS namenode

  datanode             run a DFS datanode

  dfsadmin             run a DFS admin client

  mradmin              run a Map-Reduce admin client

  fsck                 run a DFS filesystem checking utility

  fs                   run a generic filesystem user client

  balancer             run a cluster balancing utility

  oiv                  apply the offline fsimage viewer to an fsimage

  fetchdt              fetch a delegation token from the NameNode

  jobtracker           run the MapReduce job Tracker node

  pipes                run a Pipes job

  tasktracker          run a MapReduce task Tracker node

  historyserver        run job history servers as a standalone daemon

  job                  manipulate MapReduce jobs

  queue                get information regarding JobQueues

  version              print the version

  jar <jar>            run a jar file

  distcp <srcurl> <desturl> copy file or directories recursively

  distcp2 <srcurl> <desturl> DistCp version 2

  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive

  classpath            prints the class path needed to get the

                       Hadoop jar and the required libraries

  daemonlog            get/set the log level for each daemon

 or

  CLASSNAME            run the class named CLASSNAME

Most commands print help when invoked w/o parameters.


7) SSH 설정

  - SSH공개키를 생성(ssh-keygen -t rsa) - 명령어 수행 후 엔터신공! enter x 3 :D

dakao01@ubuntu:~$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hadoop/hadoop/.ssh/id_rsa): 

Created directory '/home/hadoop01/hadoop/.ssh'.

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /home/hadoop/hadoop/.ssh/id_rsa.

Your public key has been saved in /home/hadoop01/hadoop/.ssh/id_rsa.pub.

The key fingerprint is:

55:cc:3e:f2:50:bf:61:d6:28:fc:73:8d:60:79:0f:56 dakao01@ubuntu

The key's randomart image is:

+--[ RSA 2048]----+

|           o.    |

|           .+   E|

|          .+ o + |

|         .o O X .|

|        S  = X *.|

|            . = +|

|               o |

|                 |

|                 |

+-----------------+

 

공개키는 홈디렉토리 .ssh 폴더에 생성됩니다. 이제 생성된 공개키를 ssh-copy-id 명령어를 이용해 다른 서버에 복사합니다. ssh-copy-id 명령어는 대상 서버의 .ssh 디렉토리안에 있는 authorized_keys파일에 공개키를 입력합니다.


 - ssh-copy-id명령어 수행(우선 범위는 hadoop02)

dakao01@ubuntu:~$ ssh-copy-id -i /home/hadoop/hadoop/.ssh/id_rsa.pub dakao02@search-dn-hadoop02

The authenticity of host 'search-dn-hadoop02 (10.211.55.10)' can't be established.

ECDSA key fingerprint is 93:ba:c4:69:8b:e6:d7:f9:ee:2a:e2:39:5d:88:53:ff.

Are you sure you want to continue connecting (yes/no)? yes

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

dakao02@search-dn-hadoop02's password: 


Number of key(s) added: 1


Now try logging into the machine, with:   "ssh 'dakao02@search-dn-hadoop02'"

and check to make sure that only the key(s) you wanted were added.


 - dakao02서버에서 확인 - vi로 authorized_keys 확인! 

dakao02@ubuntu:~/.ssh$ ls

 

authorized_keys  id_rsa  id_rsa.pub


 - 테스트!

 search-nn-hadoop01 서버에서 ssh 명령어를 통해 붙어보자! 암호를 묻지 않고 붙는다면 OK!!

dakao01@ubuntu:~$ ssh search-dn-hadoop02

Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)


 * Documentation:  https://help.ubuntu.com/


  System information as of Wed Sep  3 23:00:02 PDT 2014


  System load:  0.0               Processes:           160

  Usage of /:   3.0% of 61.88GB   Users logged in:     1

  Memory usage: 12%               IP address for eth0: ip가 나오지용!

  Swap usage:   0%


  Graph this data and manage this system at:

    https://landscape.canonical.com/


dakao02@ubuntu:~$ 


서로서로 전부 복사를 해줘야한다. 확인은 암호를 입력하지 않아도 쌍방향으로 서로 SSH에 접속이 되는지 보면 된다.

즉, authorized_keys 파일에는 자기자신을 포함 모든 키 정보가 들어가있어야 한다!


8) 하둡 환경설정 파일 수정!

    설치 작업의 끝이 보이는군요~~~ㅎㅎㅎㅎ

    슈퍼맨 서버 한대에 설정을 합니다! 그런 뒤에 압축해서 다른 서버에서 사용하도록 합니다.^-^b

              

    

 파일명

 용 도

 hadoop-env.sh

 하둡을 실행하는 쉘 스크립트 파일에서 필요한 환경 변수를 설정

 하둡 홈 디렉토리 아래에 있는 bin 디렉토리에 있는 쉘 스크립트 파일이 hadoop-env.sh를 사용합니다. 

 이 파일에는 JDK경로, ClassPath, 데몬 실행 옵션 등 다양한 환경변수를 설정할 수 있습니다.

 masters 

 보조 네임노드를 실행할 서버를 설정합니다.

 slaves

 데이터노드를 실행할 서버를 설정합니다. 

 core-site.xml

 HDFS맵-리듀스에서 공통적으로 사용할 환경 정보를 설정!

 hadoop-core-1.2.1.jar에 포함돼 있는 core-default.xml을 오버라이딩한 파일입니다.

 core-site.xml에 설정값이 없을 경우, core-default.xm에 있는 기본값을 사용합니다.

 hdfs-site.xml

 HDFS에서 사용할 환경 정보를 설정합니다. 

 hadoop-core-1.2.1.jar에 포함돼 있는 hdfs-default.xml를 오버라이딩한 파일 입니다. 

 hdfs-site.xml에 설정값이 없을 경우. hdfs-default.xml에 있는 기본값을 사용합니다.

 mapred-site.xml

 맵-리듀스에서 사용할 환경정보를 설정합니다. 

 hadoop-core-1.2.1.jar에 포함돼 있는 mapred-default.xml을 오버라이드한 파일입니다. 

 mapred.site.xml에 설정값이 없을 경우, mapred-default.xml에 있는 기본값을 사용합니다.


 - hadoop-env.sh 수정

   JDK_HOME  파라미터를 실제 JDK가 설치된 경로로 수정합니다.

   열어보시면 주석으로 막혀있습니다. 

   기존 :

    # The java implementation to use.  Required.

  # export JAVA_HOME=/usr/lib/j2sdk1.5-sun


   추가 :

   # modify ace-t

 export JAVA_HOME=/home/hadoop/hadoop/jdk1.7.0_67

  

  hadoop-env.sh에는 다양한 옵션들을 설정할 수 있습니다. 이 부분은 우선은 pass~~

  책 - 34~35page! 에 나와있습니다. 참고하세요^-^/


  - masters 수정

    masters 파일에는 보조 네임노드를 실행할 서버를 설정합니다.

    2개 이상의 보조 네임노드를 설정할 수 있으며, 한 줄에 하나의 서버를 기재하면 됩니다.

    서버는 호스트명 혹은 IP로 기재!


    현재 서버는 4대이며, 아래와 같이 구성해보도록 하겠습니다.

    search-nn-hadoop01 - 네임노드

    search-dn-hadoop02 - 보조 네임노드 겸 데이터노드

    search-dn-hadoop03 - 데이터 노드

    search-dn-hadoop04 - 데이터 노드


  - slaves 수정

    데이터노드를 실행할 서버를 설정! 2개 이상의 데이터노드를 설정할 수 있으며, 한줄에 하나의 서버를 기재하면 됩니다.

    서버는 호스트명 혹은 IP로 기재!


  - core-site.xml 수정

 fs.default.name과 hadoop.tmp.dir 속성을 추가하고, 다른 속성들은 core-default.xml에 있는 기본값을 사용!    

<configuration> 

 <property>

   <name>fs.default.name</name>

   <value>hdfs:search-nn-hadoop01:9000</value>

 </property>

 <property>

   <name>hadoop.tmp.dir</name>

   <value>/home/hadoop/hadooap/hadoop-data/

 </property>

</configuration>


fs.default.name : 데이터노드는 여러 작업을 진행하기 위해 반드시 네임노드의 주소를 알고 있어야 합니다.

                        예를 들어 네임노드로 하트비트나 블록 리포트를 보낼 때 바로 이값을 참조해서 네임노드를 호출 합니다.

hadoop.tmp.dir : 하둡에서 발생하는 임시 데이터를 저장하기 우한 공간 입니다. 

attempt-xxxx, history..등등  MR작업 등 하둡에서 무엇인가 동작할 때 아직은 잘모르겠지만 로그성 같은 저장 합니다.


 - hdfs-site.xml 수정

   dfs.replication : 이 친구는 HDFS의 저장될 데이터의 복제본 개수를 의미 합니다.

   dfs.http.address : 네임노드용 웹서버의 주소값입니다. 기본값은 0.0.0.0:50070으로 설정돼 있습니다.

   완전 분산 모드로 설치할 경우 반드시 이 속성을 설정해야 합니다.

   이 속성이 없으면 보조 네임노드가 네임노드에 접속하지 못하기 때문 입니다.

<configuration>

  <property>

    <name>dfs.replication</name>

    <value>3</value>

  </property>

  

  <property>

    <name>dfs.http.address</name>

    <value>search-nn-hadoop01:50070</value>

  </property>

  

  <property>

    <name>dfs.secondary.http.address</name>

    <value>search-dn-hadoop02:50090</value>

  </property>

</configuration>


 - mapred-site.xml 수정

   mapred.job.tracker 속성을 추가하며,아래와 같이 작성 되어집니다.

   또한 잡트래커(JobTrakcer) 데몬의 주소를 의미하며, 데이터노드에서 이 주소로 맵-리듀스 작업을 요청하게 됩니다.

<configuration>

  <property>

    <name>mapred.job.tracker</name>

    <value>search-nn-hadoop01:9001</value>

  </property>

</configuration>


여기까쥐~!! 한대의 서버에다가 설정을 하였습니다. 이제는 압축을 한 뒤에 각각의 서버에 복사 해보도록 하겠습니다!


9) 압축하기

dakao01@ubuntu:~$ tar cvfz hadoop-1.2.1.tar.gz hadoop-1.2.1/


10) 각 서버에 복사하기(SCP명령어 사용)

scp [원본경로] [전송될 서버의 계정@전송될 호스트명:전송될 디렉토리]

dakao01@ubuntu:~$ scp hadoop-1.2.1.tar.gz dakao02@search-dn-hadoop02:/home/hadoop02/hadoop

hadoop-1.2.1.tar.gz 


각 서버 search-dn-hadoop02, search-dn-hadoop03search-dn-hadoop04에 전송한다!


11) 압축 해제! (원본을 가지고 있는 서버에서 수행하시면 됩니다.)

ssh dakao@search-dn-hadoop03 "cd /home/hadoop03/hadoop; tar xvzf hadoop-1.2.1.tar.gz; chmod -R 775 hadoop-1.2.1/"


12) 전송 및 압축 해제가 잘되었는지 확인하고! 위에서 언급하였던 core-site.xml에서 경로부분을 수정하여 줍니다.

   음...hadoop01, hadoop02, hadoop03, hadoop04이런식이 아닌 hadoop으로 경로를 맞춰주면 더 편하겠네요!

   ex) 아래의 value부분의 서버에 맞게 경로를 맞춰줍니다.

   <name>hadoop.tmp.dir</name>

   <value>/home/hadoop02/hadooap/hadoop-data/


13) 마지막으로 .profile의 내용이 안먹히는 현상이 있다면 source .profile를 해줍니다.

      java -version or hadoop 등 명령어 수행 해보신 뒤에 말이죠!^^;


14) 하둡 실행 전 해야할 일!

리눅스에서 실행 중인 방화벽 서비스를 종료해야 합니다. 하둡의 여러 데몬들은 특정 포트로 RPC또는 HTTP통신을 하게 됩니다. 방화벽은 기본적인 포트를 제외하고 대부분 포트를 차단하고 있기 때문에 하둡이 정상적으로 실행되지 않을 수 있습니다.

그래서 실행 중인 방화벽 서비스를 정지하고, 서버가 부팅할 때도 방화벽이 실행되지 않도록 chkconfig명령어를 실행해야 합니다. root권한으로 실행해야 합니다. 반드시!


   (1) service iptables stop

ubuntu에서는 명령어가 조금 달랐다. 루트로 접속한 뒤에 ufw status는 상태를!(inactive : stop, active : ing)

ufw disable은 정지를! ufw enable은 시작을! 

(참고 http://www.cyberciti.biz/faq/ubuntu-start-stop-iptables-service/ )

root@ubuntu:/home/hadoop01/hadoop# sudo ufw status    - 방화벽 상태

Status: inactive

root@ubuntu:/home/hadoop01/hadoop# sudo ufw disable

Firewall stopped and disabled on system startup


   (2) chkconfig iptables off

ubuntu는 이것 역시 달랐다!


찾아봤더니..sysv-rc-conf라는 것이 있었다.

(참고 : http://askubuntu.com/questions/221293/why-is-chkconfig-no-longer-available-in-ubuntu)


install : sudo apt-get install sysv-rc-conf


설치 후 sysv-rc-conf --list  or sysv-rc-conf --list iptalbes 을 보면 현황을 알수있다.

sysv-rc-conf iptables off를 하면 off가 되어진다.

root@ubuntu:/home/hadoop01/hadoop# sysv-rc-conf iptables off

root@ubuntu:/home/hadoop01/hadoop# sysv-rc-conf --list iptables

iptables     2:off 3:off 4:off 5:off


15) 하둡 실행!(실행하기 빡세군요..ㄷㄷ)

 루트에서 다시 원래의 계정으로 돌아오신 뒤에 /home/hadoop01/hadoop/hadoop-1.2.1/bin 의 hadoop을 실행시켜 보면 아래와 같은 정보를 볼 수 있습니다.

dakao01@ubuntu:~/hadoop-1.2.1/bin$ ./hadoop

Warning: $HADOOP_HOME is deprecated.


Usage: hadoop [--config confdir] COMMAND

where COMMAND is one of:

  namenode -format     format the DFS filesystem

  secondarynamenode    run the DFS secondary namenode

  namenode             run the DFS namenode

  datanode             run a DFS datanode

  dfsadmin             run a DFS admin client

  mradmin              run a Map-Reduce admin client

  fsck                 run a DFS filesystem checking utility

  fs                   run a generic filesystem user client

  balancer             run a cluster balancing utility

  oiv                  apply the offline fsimage viewer to an fsimage

  fetchdt              fetch a delegation token from the NameNode

  jobtracker           run the MapReduce job Tracker node

  pipes                run a Pipes job

  tasktracker          run a MapReduce task Tracker node

  historyserver        run job history servers as a standalone daemon

  job                  manipulate MapReduce jobs

  queue                get information regarding JobQueues

  version              print the version

  jar <jar>            run a jar file

  distcp <srcurl> <desturl> copy file or directories recursively

  distcp2 <srcurl> <desturl> DistCp version 2

  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive

  classpath            prints the class path needed to get the

                       Hadoop jar and the required libraries

  daemonlog            get/set the log level for each daemon

 or

  CLASSNAME            run the class named CLASSNAME

Most commands print help when invoked w/o parameters.


네임노드를 초기화 시키는 작업을 해보겠습니다.


./hadoop namenode -format


오류내역


위의 오류는 확인해보니... </value>를 해주지 않았었네요ㅠㅠ


다시 수행해보겠습니다.

dakao01@ubuntu:~/hadoop-1.2.1/bin$ ./hadoop namenode -format

Warning: $HADOOP_HOME is deprecated.


14/09/04 21:41:39 INFO namenode.NameNode: STARTUP_MSG: 

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG:   host = ubuntu/127.0.1.1

STARTUP_MSG:   args = [-format]

STARTUP_MSG:   version = 1.2.1

STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013

STARTUP_MSG:   java = 1.7.0_67

************************************************************/

14/09/04 21:41:39 INFO util.GSet: Computing capacity for map BlocksMap

14/09/04 21:41:39 INFO util.GSet: VM type       = 64-bit

14/09/04 21:41:39 INFO util.GSet: 2.0% max memory = 1013645312

14/09/04 21:41:39 INFO util.GSet: capacity      = 2^21 = 2097152 entries

14/09/04 21:41:39 INFO util.GSet: recommended=2097152, actual=2097152

14/09/04 21:41:39 INFO namenode.FSNamesystem: fsOwner=dakao01

14/09/04 21:41:39 INFO namenode.FSNamesystem: supergroup=supergroup

14/09/04 21:41:39 INFO namenode.FSNamesystem: isPermissionEnabled=true

14/09/04 21:41:40 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100

14/09/04 21:41:40 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)

14/09/04 21:41:40 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0

14/09/04 21:41:40 INFO namenode.NameNode: Caching file names occuring more than 10 times 

14/09/04 21:41:40 INFO common.Storage: Image file /home/hadoop01/hadooap/hadoop-data/dfs/name/current/fsimage of size 113 bytes saved in 0 seconds.

14/09/04 21:41:40 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/hadoop01/hadooap/hadoop-data/dfs/name/current/edits

14/09/04 21:41:40 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/hadoop01/hadooap/hadoop-data/dfs/name/current/edits

14/09/04 21:41:40 INFO common.Storage: Storage directory /home/hadoop/hadooap/hadoop-data/dfs/name has been successfully formatted.

14/09/04 21:41:40 INFO namenode.NameNode: SHUTDOWN_MSG: 

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1

************************************************************/


위에보시면 /home/hadoop/hadooap/hadoop-data/dfs/name has been successfully formatted.라고 나오시면 됩니다!

초기화 완료!


이제는 bin디렉토리에 있는 start-all.sh를 통해 하둡과 관련된 모든 데몬을 실행시켜 보겠습니다.

slaves 파일과 ssh 공개키 설정이 제대로 됐다면 데이터노드용 서버에서 데이터노드와 태스크트래커 데몬을 각각 실행 합니다. 


매우 중요!!

error01) 계정과 홈디렉토리를 구분이 되게끔 하려고했으나..아래처럼..찾지 못하는 현상이 있으므로..계정과 홈디렉토리는 각 서버마다 맞춰줘야 합니다.!!

dakao@ubuntu:~/hadoop-1.2.1/bin$ ./start-all.sh

starting namenode, logging to /home/hadoop01/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-namenode-ubuntu.out

search-dn-hadoop02: bash: line 0: cd: /home/hadoop01/hadoop/hadoop-1.2.1/libexec/..: No such file or directory

search-dn-hadoop02: bash: /home/hadoop01/hadoop/hadoop-1.2.1/bin/hadoop-daemon.sh: No such file or directory


error02) java.io.IOException: Incomplete HDFS URI, no host: 네임노드, 데이터노드 안뜨는 현상!

/home/hadoop/hadoop/hadoop-1.2.1/conf 에서 core-site.xml 부분에...잘못 적었다!! -0-;;

<configuration>

 <property>

   <name>fs.default.name</name>

   <value>hdfs://search-nn-hadoop01:9000</value> - good hdfs:// 인데..hdfs:로 해놨었다..ㅠ.ㅠ..

 </property>

 <property>

   <name>hadoop.tmp.dir</name>

   <value>/home/hadoop/hadoop/hadoop-data/</value>

 </property>

</configuration>


위와같이 올바르게 작성한 뒤 다시!!! hadoop namenode -format이라는 것을 통해 다시 빌드 시켜줘야한다!!! 



결과

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1/bin$ ./start-all.sh 

Warning: $HADOOP_HOME is deprecated.  <-- 요녀석이 안뜰려면 hadoop-env.sh 에서 export HADOOP_HOME_WARN_SUPPRESS="TRUE" 를 export해주면 된다.


starting namenode, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-namenode-ubuntu.out

search-dn-hadoop02: starting datanode, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-datanode-ubuntu.out

search-dn-hadoop03: starting datanode, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-datanode-ubuntu.out

search-dn-hadoop04: starting datanode, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-datanode-ubuntu.out

search-dn-hadoop02: starting secondarynamenode, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-secondarynamenode-ubuntu.out

jobtracker running as process 3927. Stop it first.

search-dn-hadoop04: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-tasktracker-ubuntu.out

search-dn-hadoop02: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-tasktracker-ubuntu.out

search-dn-hadoop03: starting tasktracker, logging to /home/hadoop/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-dakao-tasktracker-ubuntu.out



잘 떴나 확인!

 - 네임노드 서버에서 jps명령어를 통해 NameNode와 JobTracker를 확인!

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1/bin$ jps

7114 Jps

6824 NameNode

7004 JobTracker


 - 데이터노드 서버에서 jps명령어를 통해 DataNode와 TaskTracker 등을 확인!

dakao@ubuntu:/home/hadoop/hadoop/hadoop-1.2.1/conf$ jps

7165 TaskTracker

6913 DataNode

7248 Jps

7038 SecondaryNameNode


 - END -

            





저작자 표시 비영리 변경 금지
신고

'BigDATA > Hadoop' 카테고리의 다른 글

부록. 하둡설치(CDH)-클라우데라 배포판  (0) 2014.10.07
04. 하둡 예제 실행 및 코딩해보기!  (0) 2014.09.15
부록. 하둡 설치  (0) 2014.09.11
03. 맵리듀스 시작하기 - 맵-리듀스 개념  (5) 2014.09.01
02. About HDFS..  (0) 2014.08.28
01. 하둡 소개  (0) 2014.08.27

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

03. 맵리듀스 시작하기 - 맵-리듀스 개념

BigDATA/Hadoop 2014.09.01 14:34
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

회사 위키에 정리해서 복사&붙여넣기를 하니..깨져서 나오는 현상이 있어서 하루패드의 마크다운 기능을 사용해보았습니다.

 

목 차

맵-리듀스 개념
맵-리듀스 아키텍처

1.맵-리듀스 개념

  1. 맵-리듀스 패턴(Scatter-Gather의 한 형태[Hohpe and Woolf])은 클러스터에서 많은 장비의 장점을 활용해 처리하며서 데이터가 위치한 노드에서 최대한 많은 처리가 실행되도록 작업을 조직하는 방법이다. 맵-리듀스는 구글의 맵-리듀스 프레임워크[Dean and Ghemawat]로 유명해졌다. 맵-리듀스란 이름은 함수형 프로그래밍 언어에서 컬렉션에 대해 맵과 리듀스 연산을 하는 데서 영감을 얻은 것이다.

  2. 맵리듀스 프로그래밍 모델은 단순하게 맵(map)과 리듀스(reduce)라는 두 개의 메소드로 다음과 같은 동작을 수행합니다.

     : (k1, v1) → list(k2, v2)

    리듀스 : (k2, list(v2))→ list(k3, v3)

* 맵 메소드는 키(k1)와 값(v1)으로 구성된 데이터를 입력받아 이를 가공하고 분류한 후 새로운 키(k2)와 값(v2)으로 구성된 목록을 출력 합니다.
이때 맵 메소드가 반복해서 수행되다 보면 새로운 키(k2)를 가지는 여러 개의 데이터가 만들어집니다. 리듀스 메소드의 새로운 키(k2)로 그룹핑된 값의 목록(list(v2))를 입력 데이터로 전달받습니다. 이후 값의 목록(list(v2))에 대한 집계 연산을 실행해 새로운 키(k3)와 값(v3)으로 구성된 목록을 생성 합니다.

예를 들어서 맵리듀스로 "read a book"과 "write a book"이라는 두 줄의 문장으로 구성된 텍스트 파일을
입력받아 전체 글자 수를 계산해 보겠습니다.

 (1) 맵-리듀스는 입력 파일을 키와 값 형식의 데이터로 분류 합니다. 위의 예제에서는 키는 라인 번호 이고 값은 문장 입니다.

 (2) 키와 값 형식의 데이터는 맵 메소드의 입력 데이터로 전달 됩니다.

 (3) 맵 메소드는 라인 번호별로 문장을 체크해 키에 해당하는 글자별로 글자 수를 출력합니다.

 (4) 맵-리듀스는 맵 메소드의 출력 데이터를 정렬하고, 병합합니다.

 (5) 4번의 결과가 리듀스 메소드의 입력 데이터로 전달 됩니다.

 (6) 리듀스 메소드는 새로운 키인 글자별로 각 글자 수를 합산해서 출력 합니다.

 (7) 리듀스 메소드의 출력 데이터를 하둡 파일 시스템에 저장 합니다.

그림_a) 맵리듀스 개념 예제

 

Tip) 굿팁!

  • 맵 작업은 한 집합에 대해서만 적용할 수 있고, 리듀스 작업은 한 키에 대해서만 적용할 수 있다. 이러한 제약조건에서도 잘 동작하려면 프로그램의 구조를 다르게 생각해야 한다.
  • 맵-리듀스는 클러스터에서 계산의 병령화를 쉽게 해주는 패턴이다.
  • 맵 작업은 집합으로부터 데이터를 읽어 관련된 키-값 쌍으로 압축한다. 맵은 한번에 레코드 하나만 읽으므로 병렬화될 수 있고 해당 레코드를 저장한 노드에서 실행된다.
  • 리듀스 작업은 한 키에 대해 맵 작업의 결과로 나온 많은 값을 취해 출력 하나로 요약한다. 각 리듀스 함수는 한 키에 대해 작용하기 때문에 키로 병렬화할 수 있다.

2. 맵-리듀스 아키텍처

  1. 시스템 구성

맵-리듀스 시스템은 클라이언트, 잡트래커, 태스크트래커로 구성 됩니다.

* 클라이언트 
사용자가 실행한 맵-리듀스 프로그램과 하둡에서 제공하는 맵리듀스 API를 의미 합니다. 사용자는 맵-리듀스 API로 맵-리듀스 프로그램을 개발하고, 개발한 프로그램을 하둡에서 실행할 수 있습니다.

* 잡트래커(JobTracker)
클라이언트가 하둡으로 실행을 요청하는 맵-리듀스 프로그램은 잡(Job)이라는 하나의 작업 단위로 관리됩니다. 잡트래커는 하둡 클러스터에 등록된 전체 잡의 스케줄링을 관리하고 모니터링 합니다.
전체 하둡 클러스터에서 하나의 잡트래커가 실행되며(죽으면???), 보통 하둡의 네임노드 서버에서 실행됩니다. 
※ 반드시 네임노드 서버에서 실행할 필요는 없음. 페이스북 같은경우 잡트래커를 별개의 서버에서 동작하도록 구성 함.

또한 사용자가 새로운 잡을 요청하면 잡트래커는 잡을 처리하기 위해 몇 개의 맵과 리듀스를 실행할지 계산합니다. 이때 태스크트래커는 잡트래커의 작업 수행 요청을 받아 맵리듀스 프로그램을 실행합니다. 잡트래커와 태스크트래커는 하트비트(heardbeat)라는 메소드로 네트워크 통신을 하면서 태스크트래커의 상태와 작업 실행 정보를 주고받게 됩니다. 만약 태스크트래커에 장애가 발생하면 잡트래커는 다른 대기 중인 태스크트래커를 찾아 태스크를 재실행하게 됩니다.

* 태스크트래커(TaskTracker)
태스크트래커는 사용자가 설정한 맵-리듀스 프로그램을 실행하며, 하둡의 데이터노드에서 실행되는 데몬입니다. 태스크트래커는 잡트래커의 작업을 요청받고, 잡트래커가 요청한 맵과 리듀스 개수만큼 맵 태스크(map task)와 리듀스 태스크(Reduce Task)를 생성 합니다. 여기서 맵 태스크와 리듀스 태스크란 사용자가 설정한 맵과 리듀스 프로그램입니다.


2.맵-리듀스 작동 방식

"복잡하지만 이해하여 BOA요!"

그림_c) 맵-리듀스의 작동방식

1) 맵리듀스잡실행

사용자는 잡에 대한 실행 정보를 설정한 후(직접 개발을 해야 무슨소린지 알수 있을듯..ㅋㅋ) waitForCompletion 메소드를 호출해 잡을 실행합니다.

※ 잡 제출 시 waitForCompletion()은 2초에 한번씩 진행 과정을 조사하여 변경이 생기면 콘솔로 보여준다.


2) 신규 잡 제출(Job Submission)

잡 인터페이스에서는 새로운 잡클라이언트 객체가 생성되고, 이 객체가 잡트래커에 접속해 잡을 실행해줄 것을 요청 합니다. 이때 잡트래커는 잡클라이언트에게 새로운 Job ID를 반환합니다.(잡트래커 상에서 getNewJobId()호출) Job ID를 전달받은 잡클라이언트는 사용자가 설정한 출력 경로를 확인하는데, 이미 존재하는 경로를 입력했으면 에러가 발생하고 맵리듀스 프로그램이 종료됩니다.


3) 입력 스플릿 생성

잡클라이언트는 잡의 입력 데이터에 대한 입력 스플릿(input split)을 계산합니다. 당연히 입력 경로를 잘못 입력해서, 입력 스플릿을 계산할 수 없다면 에러가 발생하고 맵리듀스 프로그램은 종료됩니다. 입력 스플릿이 계산되고 나면 입력 스플릿 정보, 설정 파일, 맵리듀스 JAR파일을 HDFS에 저장하고, 잡트래커에게 잡을 시작할 준비가 끝났음을 알려줍니다.

  • 입력 스플릿이란?
    하나의 맵에서 처리해야 하는 입력 파일의 크기 입니다. 하둡은 맵리듀스 잡의 입력 데이터를 입력 스플릿이라는 고정된 크기의 조각으로 분리합니다. 하둡은 생성된 입력 스플릿마다 맵 태스크를 하나씩 생성 합니다. 그리고 입력 스필릿을 해당 맵 태스크의 입력 데이터로 전달합니다. 입력 데이터가 HDFS의 기본 블록 사이즈인 64MB보다 큰 경우에만 입력 스플릿이 생성됩니다. ※ 입력 스플릿의 크기는 하둡 환경설정 파일인 mapred-site.xml에서 수정할 수 있습니다. 입력 스플릿의 최소 바이트 크기는 mapred.min.split.size 프로퍼티이며, 기본값은 0 바이트 입니다.


4) 잡 할당

잡 클라이언트의 메시지를 받은 잡트래커는 잡을 큐에 등록하고, 잡스케줄러가 큐(Queue)에 가져와서 초기화 합니다. 초기화 후 잡스케줄러는 잡클라이언트가 HDFS에 등록한 입력 스플릿 정보를 가져와 입력 스플릿의 개수만큼 맵 태스크를 생성하고 ID를 부여합니다. 태스크트래커는 주기적으로 잡트래커의 하트비트(heartbeat)라는 메소드를 호출해서 자신의 상태정보를 잡트래커에게 알려줍니다. 잡트래커는 하트비트 메소드를 통해 전달된 저옵를 이용해 어떠한 태스크트래커에게 태스크 실행을 요청할지 결정한 후, 해당 태스크트래커에 태스크 실행을 요청합니다.


5) 매퍼 실행

태스크트래커는 잡트래커가 할당해준 맵 태스크를 실행 합니다. 맵 태스크는 사용자가 설정한 매퍼 클래스이며, 입력 스필릿은 키와 값의 형태로 맵 태스크의 입력 데이터로 전달됩니다. 또한 맵 태스크는 맵 메소드의 정의돼 있는 로직을 실행하고, 출력 데이터를 메모리 버퍼에 저장합니다. 이때 파티셔너는 해당 출력 데이터가 어떤 리듀스 태스크에 전달돼야 할지를 결정하고, 그에 맞는 파티션을 지정해줍니다. 파티션에서는 메모리에 있는 데이터를 키에 따라 정렬한 후, 로컬 디스크에 저장해줍니다. 파티션별로 디스크 저장이 완료되면 이 파일들은 하나의 출력 파일로 병합되고 정렬 됩니다.


6) 정렬, 병합

리듀스 태스크는 사용자가 설정한 리듀서 클래스 입니다. 리듀스 태스크는 자신이 필요한 맵 태스크의 모든 출력 데이터가 있어야만 작업을 실행할 수 있습니다. 그렇다면 어떻게 맵 태스크의 출력 데이터를 복사할까요? 맵 태스크는 출력이 완료되면 자신을 실행한 태스크트래커에게 작업이 정상적으로 끝났다고 알려줍니다. 이 메시지를 받은 태스크트래커는 잡트래커에게 해당 맵 태스크의 상태와 맵 태스크의 출력 데이터 경로를 알려줍니다. 리듀스 태스크에서는 주기적으로 잡트래커에게 맵 태스크의 출력 데이터 경로를 물어보며, 출력 데이터 경로가 정상적으로 조회되면 해당 출력 데이터를 로컬 노드로 복사합니다. 이때 파일이 크면 디스크로 복사하고, 작을 경우 메모리로 복사 합니다.


7) 리듀서 실행

리듀스 태스크는 모든 맵 태스크의 출력 데이터를 복사한 후, 맵 태스크의 출력 데이터를 병합합니다. 병합이 완료되면 리듀스 메소드를 호출해서 분석 로직을 실행 합니다.


8) 출력 데이터 저장

리듀스 태스크는 출력 데이터를 HDFS에 part-nnnn이라고 저장합니다. 여기서 nnnn은 파티션 ID를 의미하며, 00000부터 1씩 증가됩니다.


시작하세요! 하둡 프로그래밍과 하둡완벽 가이드 책을 맵-리듀스 부분을 병행하며 보고 있는데..책의 장단점들이 있네요 ㅎㅎㅎㅎ 

# 이전 글 
2014/08/27 - [BigDATA/Hadoop] - 01. 하둡 소개 
2014/08/28 - [BigDATA/Hadoop] - 02. About HDFS..

#참고 문헌 :
1. 시작하세요! 하둡프로그래밍 - 정재화 지음
2. 빅데이터 세상으로 떠나는 간결한 안내서 NoSQL - 마틴 파울러 지음
3. 하둡 완벽 가이드 개정3판

저작자 표시 비영리 변경 금지
신고

'BigDATA > Hadoop' 카테고리의 다른 글

04. 하둡 예제 실행 및 코딩해보기!  (0) 2014.09.15
부록. 하둡 설치  (0) 2014.09.11
03. 맵리듀스 시작하기 - 맵-리듀스 개념  (5) 2014.09.01
02. About HDFS..  (0) 2014.08.28
01. 하둡 소개  (0) 2014.08.27
[하둡교육 3일차] Pig  (0) 2013.06.05

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • Favicon of http://anyjava.tistory.com BlogIcon anyjava 2014.09.03 13:17 신고 답글 | 수정/삭제 | ADDR

    오홀! 굳굳 멋져!! 앞으로도 기대하겠습니다~ ㅎㅎ

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.09.03 13:24 신고 수정/삭제

      ㅎㅎㅎ 아직 쪼렙이라...ㅋㅋㅋ
      언능 고렙되어서 저의 생각을 심오하게 포스팅에 녹이고 싶네요! ㅎㅎㅎ
      anyjava님의 활약도 요즘 장난 아니던데요?!!
      화이팅 입니다^-^

  • good 2016.08.02 23:20 신고 답글 | 수정/삭제 | ADDR

    맵 리듀스에 대해서 자세히 알려주셔서 감사합니다~
    따로 정리해서 포스팅해도 될까요??

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2016.08.02 23:22 신고 수정/삭제

      넵~댓글 감사합니다^-^ 참조 링크만 하나 달아주시면 감사요! 열공 즐프하세요~~

    • good 2016.08.05 16:13 신고 수정/삭제

      감사합니다~

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

02. About HDFS..

BigDATA/Hadoop 2014.08.28 20:04
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

목차

HDFS 기초

HDFS 아키텍처

HDFS 명령어 사용

정리

HDFS 기초

HDFS는 수십 테라바이트 또는 페타바이트 이상의 대용량 파일을 분산된 서버에 저장하고, 많은 클라이언트가 저장된 데이터를 빠르게 처리할 수 있게 설계된 파일 시스템 입니다.

HDFS과 기존 대용량 파일 시스템(DAS, NAS, SAN)의 가장 큰 차이점은 저사양 서버를 이용해 스토리지를 구성할 수 있다는 것 입니다.

HDFS는 다음과 같이 네 가지 목표를 가지고 설계됐습니다.

1) 장애 복구

     HDFS를 구성하는 분산 서버는 다양한 장애가 발생할 수 있습니다. 그러나 장애를 빠른 시간에 감지하고, 대처할 수 있게 설계돼 있습니다.(Really??)

     HDFS는 데이터를 저장하면, 복제 데이터도 함께 저장해서 데이터 유실을 방지! 또한 분산 서버 간에는 주기적으로 상태를 체크해 빠른 시간에 장애를 인지하고, 대처할 수 있게 도와줍니다.

2) 스트리밍 방식의 데이터 접근

    HDFS에 파일을 저장하거나, 저장된 파일을 조회하려면 스트리밍 방식으로 데이터에 접근해야 합니다.

    기존의  파일 시스템은 사용자가 빠르게 데이터에 접근하는 것을 목표로 하지만, HDFS는 기존 파일 시스템들과는 달리 배치 작업에 적합하도록 설계돼 있고, 낮은 데이터 접근 지연 시간보다는 높은 데이터 처리량에 중점을 두고 있습니다.

Tip. Hadoop Streaming - 하둡 스트리밍

Hadoop streaming is a utility that comes with the Hadoop distribution. The utility allows you to create and run Map/Reduce jobs with any executable or script as the mapper and/or the reducer. For example:

발번역..(big grin) => 하둡 스트리밍은 하둡배포에 딸려있는 하나의 유틸리티 입니다.  이 유틸리티는 당신이 어떤 실행 가능한 것이나 스크립트를 가지고 mapper나 또는 reducer를 생성하거나 Map/Reduce jobs를 실행 시킬수 있습니다. 예를 들어서:

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -input myInputDirs \ -output myOutputDir \ -mapper /bin/cat \ -reducer /bin/wc

참고 URL : http://hadoop.apache.org/docs/r1.2.1/streaming.html#Hadoop+Streaming

 3) 대용량 데이터 저장

     HDFS는 하나의 파일이 기가바이트에서 테라바이트 이상의 사이즈로 저장될 수 있게 설계 됐습니다. 높은 데이터 전송 대역폭과 하나으 ㅣ클러스터에서 수백 대의 노드를 지원할 수 있어야 합니다. 또한 하나의 인스턴스에서는 수백만 개 이상의 파일을 지원 합니다.

4) 데이터 무결성

    HDFS는 한번 저장한 데이터는 더는 수정할 수 없고, 읽기만 가능하게 해서 데이터 무결성을 유지 합니다. 데이터 수정은 불가능하지만 파일 이동, 삭제, 복사할 수 있는 인터페이스는 제공합니다. Hadoop 2.0 알파ver 부터는 HDFS에 저장된 파일에 append가 제공.

HDFS 아키텍처

 1) HDFS는?

     -  블록 구조의 파일 시스템 입니다.

     - HDFS에 저장하는 파일은 특정 사이즈의 블록으로 나눠져 분산된 서버에 저장 됩니다.

     - 블록 사이즈는 기본적으로 64MB로 설정되어있고 변경이 가능 합니다.

     - 여러 개의 블록은 동일한 서버에 저장되는 것이 아니라 여러 서버에 나눠서 저장 됩니다.

★ 왜 64MB 인가?? 외국인형이 stackoverflow에 질문 올린 글! 참조~

   HDFS blocks are large compared to disk blocks, and the reason is to minimize the cost of seeks

   발번역 (big grin) - HDFS 블록들은 디스크 블록들과 비교했을 때 크다. 그리고 이유는 최저의 비용으로 찾을 수 있다는 것이다.


 

그림_a) HDFS의 파일 복제 구조

 

 

 

320MB의 파일을 HDFS에 저장했을 때 블록이 복제되는 것을 나타낸 그림 입니다. 

파일은 다섯 개의 블록으로 분리 된 후, 블록당 3개씩 HDFS에 저장돼 있습니다. 

HDFS는 블록을 저장할 때 기본적으로 3개씩 블록의 복제본을 저장 합니다.(default) 

역시나! HDFS의 블록사이즈처럼 복제본의 수도 하둡 환경 설정 파일에서 수정할 수 있습니다. 

어떻게 복제가 되는지는 뒷부분에 자세히 다루도록 하겠습니다.^0^~good~ 

복제단위는 위와같이 블록단위라는것만 기억하도록 합시다!

 

 2) 네임노드(NameNode)와 데이터 노드 (DataNode)

HDFS는 마스터(Master)-슬레이브(Slave) 아키텍처로 구성 됩니다. 

즉, 마스터 역할을 하는 네임노드(NameNode)서버가 한대, 슬레이브 역할을 하는 데이터노드(DataNode) 서버가 여러 대로 구성 됩니다. 

그림을 보기전에 용어와 역할을 조금 살펴보면.. 

 - 네임노드 :  HDFS의 모든 메타데이터를 관리하고, 클라이언트가 HDFS에 저장된 파일에 접근 할 수 있게 함.(접근 가능케하는 정보가 있겠죵?-디렉토리명, 파일명 등) 

 - 데이터노드 : HDFS에 저장할 때 블록으로 나눠진 데이터는 여러 대의 데이터노드에 분산저장 됨. 

 - 애플리케이션 : 사용자가 구현한 애플리케이션은 HDFS에 파일을 저장하거나. 저장된 파일을 읽기 위해 HDFS 클라이언트(이하 클라이언트)를 사용하며, 클라이언트 API 형태로 사용자에게 제공 됩니다.  

 - RACK : Hadoop data nodes (servers) are installed in racks. Each rack typically contains multiple data node servers with a top of rack switch for network communication. 

               “Rack awareness” means that the name node knows where each data node server is and in which rack. 

              영어라서 당황 스러우셨죠? 발번역 -  하둡 데이터노드들은 rack에 설치가 되어져있습니다. 

               각각의 rack은 보통 네트워크 통신을 하기 위한 상위 rack switch에 여러개의 데이터노드들로 구성되어져있습니다.

              "Rack awareness"는 노드네임이 각 rack의 데이터노드서버들이 어디에 있는지 아는 의미 입니다.

 

   참고 사이트 : http://www.ibmbigdatahub.com/blog/running-hadoop-cloud 

                         http://wiki.apache.org/hadoop/topology_rack_awareness_scripts

 

자! 아래의 네임노드 관련 그림을 보시면!

그림_b) HDFS 아키텍처

 

 

네임노드와 데이터노드의 구조를 살펴보았습니다.

 

3) 파일 저장

이제 전체 아키텍처를 알았으니 조금 detail하게 HDFS에 파일을 저장할 때의 동작 방식을 알아보겠습니다.

 우선 그림_c를 보도록 하겠습니다.

 

그림_c) HDFS의 파일 저장 과정

 

 

 

 1) 사용자가 개발한 프로그램인 애플리케이션이 클라이언트에게 파일 저장을 요청합니다.

 2) 클라이언트는 네임노드에게 사용자가 요청한 파일 경로를 생성할 것을 요청합니다.

 2-1) 네임노드는 해당 파일 경로가 기존에 존재할 경우 에러 처리를 합니다. 기존에 존재하지 않는 파일 경로라면 메모리에 파일 경로를 생성한 후, 다른 클라이언트가 해당 경로를 수정하지 못하게 락(lock)을 겁니다.

 3) 네임노드는 클라이언트에게 해당 파일을 저장할 데이터노드의 목록을 반환 합니다. 이러한 데이터노드의 목록은 하나의 파이프라인을 형성합니다. 파이프라인에는 HDFS의 환경설정 파일에 설정된

     블록의 복제 개수(dfs.replication)만큼 데이터노드가 들어 있습니다.

 4) 클라이언트는 첫 번째 데이터노드에게 데이터를 전송합니다.

 5) 첫번째 데이터노드는 전송받은 데이터를 로컬 디스크에 저장한 후, 두번째 데이터노드로 데이터를 전송합니다. 두번째 데이터노드도 전송받은 데이터를 로컬에 저장한 후, 세 번째 데이터노드로 데이터를 전송합니다.

     세번째 데이터도 전송받은 데이터를 로컬 디스크에 저장합니다.

 6) 첫 번째 데이터노드는 클라이언트에게 파일 저장이 완료됐음을 응답합니다.

 7) 클라이언트는 애플리케이션에게 파일 저장이 완료됐음을 응답합니다.

 

Q) 파이프라인 형성이라함은?

     How? 디자인 패턴 중 Chain of responsibility Pattern으로 구현이 되어있을라나?? 네임노드의 메타데이터(conf)를 가지고??

 

4) 파일 읽기

  이제는 HDFS에 저장된 파일을 어떠한 방식으로 읽게 되는지 알아보겠습니다. 그림_d 참조!

 

그림_d)

 

 

    1) 사용자가 개발한 프로그램인 애플리케이션이 클라이언트에게 파일 읽기를 요청 합니다.

    2) 클라이언트는 네임노드에게 애플리케이션이 요청한 파일이 어떤 블록에 저장돼 있는지 블록의 위치 정보를 요청 합니다.

    3) 네임노드는 메타데이터에서 요청된 파일의 복제 블록이 저장된 위치를 확인한 후 해당 데이터노드의 목록을 반환 합니다.

        이때 데이터노드의 목록은 요청 중인 클라이언트와 가까운 순서대로 정렬해서 반환 됩니다. 만약 클라이언트가 데이터노드라면 클라이언트는 로컬에 있는 파일을 읽게 됩니다.

        Q) 가까운 순서의 기준은???? 데이터노드에서 다른 데이터노드를 접근한다는 말??? 갑자기 클라이언트가 데이터노드라면..에서 헷깔리는 문구 임.

    4) 클라이언트는 데이터노드에게 블록을 조회할 것을 요청합니다.

    5) 데이터노드는 클라이언트에게 요청한 데이터를 전송합니다.

    6) 클라이언트는 애플리케이션에게 전송받은 데이터를 전달합니다.

 

5) 보조 네임노드(Secondary Name Node)

HDFS에서 보조 네임노드라는 친구가 있습니다.  왜 보조 네임노드가 나왔을까요? 네임노드에 무슨 문제가????

네임노드는 HDFS의 메타데이터를 관리하기 위해 에디트(EditLog)와 파일 시스템 이미지(FsImage)파일을 사용합니다.

    •  에디트 로그는 HDFS의 메타데이터에 대한 모든 변화(저장,삭제, 파일 위치 변경 등)를 기록하는 로그 파일 입니다.
      또한 에디트 로그는 용량에 제한 없이 커질 수 있으며, 네임노드의 로컬 파일 시스템에 파일로 저장 됩니다.
    • 파일 시스템 이미지 파일은 파일 시스템의 네임스페이스(디렉토리명, 파일명, 상태정보)와 파일에 대한 블록 매핑 정보를 저장하는 파일입니다.
      한마디로 표현하면 HDFS의 스냅샷 이라고 할 수 있습니다. 파일 시스템 이미지도 에디트 로그처럼 네임노드의 로컬 파일 시스템에 파일로 저장 됩니다.

그렇다면 네임노드는 메타데이터를 관리하기 위해 위의 두파일을 어떻게 사용할까요???

네임노드는 파일 시스템의 네임스페이스(디렉토리명, 파일명, 상태정보)와 블록 매핑 정보를  메모리에서 유지하며, 네임노드가 구동할 경우 다음과 같은 단계로 파일 시스템 이미지 파일과 에디트 로그를 사용 합니다.

    1. 네임노드가 구동되면 로컬에 저장된 파일 시스템 이미지 파일과 에디트 로그 파일을 조회.
    2. 에디트 로그 파일에 있는 내용을 토대로 메모리에 올라와 있는 파일 시스템 이미지를 갱신.(메모리 갱신)
    3. 메모리에 올라와 있는 파일 시스템 이미지를 로컬 파일에 있는 파일 시스템 이미지 파일에 적용.(로컬 갱신)
    4. 에디트 로그 파일을 초기화.

앞서 에디트 로그의 파일은 용량에 제한 없이 커질 수 있다고 하였습니다. 만약 에디트 로그 파일이 너~~~무 크다면 2번 단계에서 진행할 때 많은 시간이 소용될 것 입니다.

또한 파일 시스템 이미지 파일을 파일에 변경이 있을 때마다 갱신한다면 파일 시스템 이미지 파일은 기가바이트 이상으로 커지게 되며, 메모리에 로딩하지 못하는 사태가 일어날 수도 있습니다.

이러한 문제를 해결하기 위해 HDFS는 보조 네임노드를 사용 합니다.

보조 네임노드주기적으로 네임노드의 파일 시스템 이미지 파일을 갱신(메모리, 로컬 갱신)하는 역할을 하며, 이러한 작업을 체크포인트(Check Point)라고 합니다.

※ 보조 네임노드를 체크포인팅 서버라고 표현하기도 함.

 

그림_f) 보조 네임노드의 체크포인팅 단계

 

 

 

 1) 보조 네임노드는 네임노드에게 에디트 로그 파일을 롤링할 것을 요청.

    ※ 로그롤링은 현재 로그파일의 이름을 변경하고, 원래 이름으로 새 로그 파일을 만드는 것 입니다.

 2) 네임노드는 기존 에디트 로그 파일을 롤링한 후, 새로운 에디트 로그 파일을 생성.

 3) 보조 네임노드는 롤링된 에디트 로그 파일과 파일 시스템 이미지 파일을 다운로드 합니다.

 4) 보조 네임노드는 기존 파일 시스템 이미지 파일을 메모리에 올리고, 에디트 로그 파일에 있는 로그를 메모리에 올라와 있는 파일 시스템 이미지에 갱신. 

     갱신이 완료되면 새로운 파일 시스템 이미지 파일이 생성되며, 이 파일이 체크포인트용으로 사용 됩니다.(병합)

 5) 보조 네임노드는 체크포인트용 파일 시스템 이미지 파일을 네임노드에게 전송.

 6) 네임노드는 기존의 파일 시스템 이미지 파일을 체크포인트용 파일 시스템 이미지 파일로 롤링!

     또한 에디트 로그 파일도 2단계에서 생성된 에디트 로그 파일로 변경합니다.

 

 체크포인팅이 완료되면 파일 시스템 이미지 파일은 최신 내역으로 갱신되며, 에디트 로그 파일의 크기고 축소 됩니다.

 체크 포인팅은 1시간마다 한번씩 일어나며, 하둡 환경설정 파일에서 fs.checkpoint.period 속성값을 수정해서 제어할 수 있습니다.

 보조 네임노드는 네임노드의 파일 시스템 이미지를 축소 시켜주는 역할을 담당하지, 백업 서버가 아닙니다!

 

HDFS 명령어 사용

하둡은 사용자가 HDFS를 쉽게 제어할 수 있게 쉘 명령어를 제공 합니다. 이 쉘 명령어는 FileSystem Shell(이하 fs 쉘) 이라고 하며, 다음과 같은 형식으로 하둡 홈 디렉토리에서 실행할 수 있습니다.

./bin/hadoop fs -cmd [args] 

cmd는 사용자가 설정한 명령어이고, args는 해당 명령어를 실행할 때 필요한 파라미터를 의미 합니다.

fs쉘에서 어떤 명령어가 제공되는지는 "hadoop fs -help"라고 입력하면 확인할 수 있습니다.

 

명령어

명령어내용사용법비고
    파일 목록 보기 - ls, lsr
ls현재 디렉토리만을 출력./bin/hadoop fs -ls [디렉토리|파일...] 
lsr현재 디렉토리의 하위 디렉토리 정보까지 출력./bin/hadoop fs -lsr [디렉토리|파일...] 
   파일 용량 확인 - du, dus
 du 지정한 디렉토리나 파일의 사용량을 확인,
 바이트 단위로 결과를 출력!
./bin/hadoop fs -du 
 dus 전체 합계 용량만 출력./bin/hadoop fs -dus <디렉토리/파일...>경로를 지정하지 않을 경우, 사용자 계정의 홈 디렉토리에 있는
모든 디렉토리의 사용량을 합산해서 출력
 파일 내용 보기 - cat, text
cat  지정한 파일의 내용을 화면에 출력./bin/hadoop fs -cat [파일...] 텍스트 파일만 출력할 수 있습니다.
text 지정한 파일의 내용을 화면에 출력./bin/hadoop fs -text [파일...]zip파일 형태로 압축된 파일도 텍스트 형태로 화면에 출력 
 파일 복사 - put, get, getmerge, cp, copyFromLocal, copyToLocal    
 put지정한 로컬 파일 시스템의 파일 및 디렉토리를
목적지 경로로 복사합니다.
 ./bin/hadoop fs -put [로컬 디렉토리|파일...] [목적지 디렉토리|파일...] 
 copyFromLocalput 명령어와 동일한 기능을 제공.  ./bin/hadoop fs -copyFromLocal[로컬 디렉토리|파일...] [목적지 디렉토리|파일...] 
getHDFS에 저장된 데이터를
로컬 파일 시스템으로 복사
  ./bin/hadoop fs -get<ignoreCrc> <-crc> [소스 디렉토리|파일...] [로컬 디렉토리|파일...]
※ -crc 옵션을 사용하면 로컬 파일 시스템에 체크섬 파일도 복사 됨.
     -ignoreCrc 옵션을 사용하면 해당 파일의 체크섬을 확인하지 않음.
HDFS는 파일의 무결성을 확인하기 위해 체크섬(checksum) 기능을
사용하는데, 체크섬을 숨김파일로 저장하고, 해당 파일을 조회할 때
체크섬을 사용해 무결성을 확인. 
 getmerge지정한 경로에 있는 모든 파일의 내용을 합친 후,
로컬 파일 시스템에 단 하나의 파일로 복사.
./bin/hadoop fs -getmerge [소스 디렉토리|파일...] [로컬 파일명] 
 cp지정한 소스 디렉토리 및 파일을 목적지 경로로
복사하는 기능을 제공.
./bin/hadoop fs -cp [소스 디렉토리|파일...] [목적지 디렉토리|파일] 
 copyToLocal get 명령어와 동일한 기능을 제공../bin/hadoop fs -copyToLocal<ignoreCrc> <-crc> [소스 디렉토리|파일...] [로컬 디렉토리|파일...]   
 디렉토리 생성 - mkdir   
 mkdir지정한 경로에 디렉토리를 생성할 수 있음../bin/hadoop fs -mkdir [디렉토리]HDFS에 이미 존재하는 디렉토리를 생성할 경우 오류가 발생. 
 파일 이동 - mv, moveFromLocal  
 mv소스 디렉토리 및 파일을 목적지 경로로 옮김. ./bin/hadoop fs -mv [소스 디렉토리|파일...] [목적지 디렉토리|파일]여러 개의 파일을 이동시킬 경우, 반드시 목적지 경로를
디렉토리로 설정해야 함.
 moveFromLocalput 명령어와 동일하게 동작하지만
로컬 파일 시스템으로 파일이 복사된 후 소스 경로의
파일은 삭제 됨.
 ./bin/hadoop fs -moveFromLocal [소스 디렉토리|파일...] [로컬디렉토리|파일] 
 파일 삭제하기 - rm
 rm지정한 디렉토리나 파일을 삭제 함. ./bin/hadoop fs -rm [디렉토리|파일...]  디렉토리는 반드시 비어 있는 경우에만 삭제할 수 있음.
 디렉토리 삭제하기 - rmr   
 rmr지정한 파일 및 디렉토리를 삭제 함. ./bin/hadoop fs -rmr [디렉토리|파일...]  비어있지 않은 디렉토리도 정상적으로 삭제 함.
 카운트값 조회 - count   
 count기본적으로 지정한 경로에 대한 전체 디렉토리 개수,
전체 파일 개수, 전체 파일 사이즈, 지정한 경로 이름을 출력. 
./bin/hadoop fs -count <-q> [디렉토리|파일...] HDFS는 디렉토리에서 생성할 수 있는 파일 개수나 파일 용량을
제한할 수 있음. -q 옵션을 사용할 경우, 이러한 쿼터 정보를 확인. 
파일의 마지막 내용 확인 - tail    
 tail지정한 파일의 마지막 1KB의 내용을 화면에 출력 함. ./bin/hadoop fs -tail <-f> [파일]  -f 옵션 사용시 해당 파일에 내용이 추가될 때 화면에 출력된 내용도
함께 갱신. 
권한 변경 - chmod, chown, chgrp    
 chmod지정한 경로에 대한 권한을 변경. ./bin/hadoop fs -chmod <-R> [권한모드...] [디렉토리|파일...]  -R 옵션 사용 시 하위 디렉토리 설정도 모두 변경 됨. 
 chown지정한 파일과 디렉토리에 대한 소유권을 변경하는 명령어. ./bin/hadoop fs -chown <-R> [변경 사용자명:변경 그룹명] [디렉토리|파일...]   -R 옵션 사용 시 하위 디렉토리 설정도 모두 변경 됨.  
 chgrp지정한 파일과 디렉토리에 대한 소유권 급만 변경. ./bin/hadoop fs -chown <-R> [변경 그룹명] [디렉토리|파일...]    -R 옵션 사용 시 하위 디렉토리 설정도 모두 변경 됨.  
0 바이트 파일 생성 - touchz    
 touchz크기가 0바이트인 파일을 생성. ./bin/hadoop fs -touchz [파일...]   지정한 파일이 이미 0바이트 이상인 상태로 저장돼 있다면 오류 발생. 
 복제 데이터 개수 변경 - setrep   
 setrep설정한 파일의 복제 데이터 개수를 변경할 수 있음. ./bin/hadoop fs -setrep <-R> -w [복제데이터개수] [디렉토리|파일...]   -R 옵션 사용 시 하위 디렉토리에 있는 파일의 복제 데이터 개수도 변경 됨. 
 휴지통 비우기 - expunge   
 expunge주기와 상관 없이 휴지통을 비운다.  ./bin/hadoop fs -expungeHDFS에서는 삭제한 파일을 ".Trash/"라는 임시 디렉토리에 저장한 후, 
일정 시간이 지난 후에 완전히 삭제합니다. 
 파일 형식 확인 - test   
 test지정한 경로에 대해[-ezd] 옵션으로 경로가 이미 존재하는지
파일 크기가 0인지, 디렉토리인지 확인 함. 
./bin/hadoop fs -test -ezd [디렉토리|파일]     체크 결과가 맞을 경우 0을 출력 한다. 
통계 정보 조회 - stat    
 stat지정한 경로에 대한 통계 정보를 조회 ./bin/hadoop fs -stat <출력 포맷> [디렉토리|파일...]  별도의 옵션을 설정하지 않을 경우, 해당 디렉토리 혹은 파일이 
최종 수정된 날짜를 출력 함. 

 

 ※ 표 stat 명령어의 출력 포맷 옵션

옵 션내 용
%b블록 단위의 파일 크기
%F디렉토리일 경우 "directory", 일반 파일일 경우 "regular file" 출력
%n디렉토리명 혹은 파일명
%o블록 크기
%r복제 파일 개수
%y디렉토리 및 파일의 갱신일자를 yyyy-MM-dd HH:mm:ss 형식으로 출력
%Y디렉토리 및 파일의 갱신일자를 유닉스 타임스탬프 형식으로 출력

 


 

참고하면 좋을 것 같은 사이트

 http://wiki.apache.org/hadoop/FAQ

 

2014/08/27 - [BigDATA/Hadoop] - 01. 하둡 소개

 

참고 BOOK

시작하세요! 하둡프로그래밍(기초부터 실무까지 하둡의 모든 것), 정재화 저

 

    - END -


저작자 표시 비영리 변경 금지
신고

'BigDATA > Hadoop' 카테고리의 다른 글

부록. 하둡 설치  (0) 2014.09.11
03. 맵리듀스 시작하기 - 맵-리듀스 개념  (5) 2014.09.01
02. About HDFS..  (0) 2014.08.28
01. 하둡 소개  (0) 2014.08.27
[하둡교육 3일차] Pig  (0) 2013.06.05
[하둡교육 3일차] Zookeeper  (0) 2013.06.05

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

01. 하둡 소개

BigDATA/Hadoop 2014.08.27 17:39
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

목차

빅데이터 3대 요소

하둡이란?

하둡의 과제

하둡 배포판 살펴보기

정리

빅데이터 3대 요소

1) 크기(Volume) - 기존 파일 시스템에 저장하기 어려울뿐더러 데이터 분석을 위해 사용하는 기존 DW 같은 솔루션에서 소화하기 어려울 정도로 급격하게 데이터의 양이 증가 함.

2) 속도(Velocity) - 데이터가 매우 빠른 속도로 생성되기때문에 데이터의 생산, 저장, 유통, 수집, 분석이 실시간으로 처리돼야 함.

3) 다양성(Variety) - 다양한 종류의 데이터들이 빅 데이터를 구성하고 있음(정형, 반정형, 비정형 데이터)

 

하둡이란?

하둡은 2005년에 더그 커팅(Doug Cutting)이 구글이 논문으로 발표한 GFS(Google File System)와 맵리듀스(MapReduce)를 구현한 결과물 입니다.

처음에는 오픈소스 검색엔진인 너치(Nutch)에 적용하기 위해 시작됐다가 이후 독립적인 프로젝트로 만들어졌고, 2008년에는 아파치 최상위 프로젝트로 승격 됨.

하둡은 분산 파일 시스템인 HDFS(Hadoop Distributed File System)에 데이터를 저장하고, 분산 처리 시스템인 MapReduce를 이용해 데이터를 처리 합니다.

즉, 하둡을 통해 정말 큰 데이터를 저장할 수 있고, 그 데이터를 이용해서 연산을 수행할 수 있습니다. 이를 위한 2가지가 바로 HDFS와 MapReduce(2ver에서는 YARN) 입니다.

 

하둡은 비즈니스에 효율적으로 적용할 수 있게 다양한 서브 프로젝트가 제공 되어집니다. 이러한 프로젝트가 상용화되면서 하둡 에코시스템(Hadoop Ecosystem)이 구성됐습니다.

 

그림1. 하둡 에코시스템

 

 

 

하둡의 과제
    1. 고가용성 지원 X :  하둡의 가장 큰 문제는 바로 고가용성(HA: High Availability) 을 지원하지 않습니다.
                                   그래서 클라우데라, 야후, 페이스북 같은 업체에서는 자신만의 고가용성 솔루션을 만들어 공개했습니다.
                                   하둡 2.0 버전에서 네임노드의 고가용성을 지원하겠다고 발표했었다고 하니..현재 2.0버전이 나왔으니 진짜 지원을 하는지 나중에 하둡2.0스터디를할 때 집고 넘어가야겠습니다.

    2. 파일 네임스페이스 제한 : 네임노드가 관리하는 메타 정보는 메모리로 관리되기 때문에 메모리의 크기에 따라 HDFS에 저장하는 파일과 디렉터리 개수가 제한을 받음.

    3. 데이터 수정 불가 : 하둡의 또 다른 단점은 한 번 저장한 파일은 더는 수정할 수 없다는 것 입니다. HDFS에 파일을 저장하면 파일의 이동이나 이름 변경과 같은 작업은 가능하지만 저장된 파일의 내용은 수정할 수 없습니다.
                                    그래서 파일 읽기나 배치 작업만이 하둡에 적당합니다. 이러한 문제점도 조금씩 개선되고 있습니다. 하둡0.21 버전에서는 기존에 저장된 파일에 내용을 불일 수 있는 append 기능이 제공됩니다.

    4. POSIX 명령어 미지원 : 기존 파일 시스템에서 사용하던 rm, mv 같은 POSIX 형식의 파일 명령어를 이용할 수 없습니다. 하둡에서 제공하는 별도의 쉘 명령어와 API를 이용해 파일을 제어해야만 합니다.

하둡 배포판 살펴보기

주요 하둡 배포판 

    • Cloudera(클라우데라) Hortonworks(호튼웍스)
    • MapR Technologies(MapR 테크놀로지스)
    • Amazon(아마존)
    • Hstreaming

 

참고

책 : 시작하세요! 하둡 프로그래밍(기초에서 실무까지 하둡의 모든것, 정재화 지음)

 

하둡 기초 용어 설명

http://www.slideshare.net/madvirus/ss-28761748

하둡2 YARN

http://www.slideshare.net/madvirus/2-yarn

 

- 끝 -

저작자 표시 비영리 변경 금지
신고

'BigDATA > Hadoop' 카테고리의 다른 글

03. 맵리듀스 시작하기 - 맵-리듀스 개념  (5) 2014.09.01
02. About HDFS..  (0) 2014.08.28
01. 하둡 소개  (0) 2014.08.27
[하둡교육 3일차] Pig  (0) 2013.06.05
[하둡교육 3일차] Zookeeper  (0) 2013.06.05
[하둡교육 2일차] Hadoop 설치  (0) 2013.06.04

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

스터디 모임 소개^-^

Study/Study group 2012.08.21 00:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

ㅎㅎㅎ 드디어 기다리고 기다렸던 스터디!! 개설!!

KSUG 그룹에 스터디를 하고 싶어서 가입을 했는데^-^good~
스터디가 여태 없다고 자바카페(조효은 강사님이 계신ㅎㅎ)과 연합하여 스터디를 한다고 한다.
한경닷컴하고는 인연이 있어서 더욱 더 자바카페와 한다고 하니 조으다^-^good~

url ) http://onoffmix.com/event/8686

간단 내용)



많은 참여 부탁해요~~선착순이니~~빠르게+ㅁ+ speeeeed~~~~

저작자 표시 비영리 변경 금지
신고

'Study > Study group' 카테고리의 다른 글

[KSUG+Java cafe] 스프링 스터디  (0) 2012.11.10
[두번째] Spring 사내 스터디  (0) 2012.10.31
[첫번째] Spring 사내 스터디  (2) 2012.10.23
Google Developers Korea  (0) 2012.08.24
스터디 모임 소개^-^  (0) 2012.08.21
자바 마지막^^  (0) 2012.03.22

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바