Apache Kafka 시작하기


참조 사이트

http://kafka.apache.org
http://epicdevs.com/20

다행이 예전에 Hbase를 설치할 때 zookeeper를 설치해놓은 덕에 kafka를 설치하고 구동하는 과정은 

그리 어렵지 않았다.아다시피 요즘 OS가 Windows만 아니면 binary 패키지를 다운로드 받고 적절한 위치에 

압축 풀고 하면반은 된 것이나 다름 없다.


kafka의 경우 $KAFKA_HOME/config/server.properties에 몇가지 설정만 한 후 기동시키면 된다.
다음은 내 PC 환경에서의 설정 및 구동 과정이다.


PC 환경

현재 맥미니 5대를 내부망으로 연결시킨 상태로 각각의 PC에 대한 정보는
/etc/hosts 파일에 설정이 되어있다. 대략 다음과 같다.

172.30.1.33     NAMENODE.local
172.30.1.56     SECONDARY-NAMENODE.local
172.30.1.59     DATANODE1.local
172.30.1.39     DATANODE2.local
172.30.1.11     DATANODE3.local

때문에 대부분의 설정에서는 host name인 NAMENODE.local 등을 이용한다. 이후
설정 사항에 이점 참고하길 바란다.


zookeeper 설정

zookeeper는 5대의 노드 모두 설치가 되어있으며 대략 다음과 같이 
설정이 되어있다. 설정 파일은 $ZOOKEEPER_HOME/cont/zoo.cfg이다. 
물론 5대의 노드 모두 동일한 설정이다.

dataDir=/zookeeper
clientPort=2181

#Zookeeper Servers
server.0=NAMENODE.local:2888:3888
server.1=SECONDARY-NAMENODE.local:2888:3888
server.2=DATANODE1.local:2888:3888
server.3=DATANODE2.local:2888:3888
server.4=DATANODE3.local:2888:3888

zookeeper의 실행 명령은 다음과 같다. 
(zookeeper 설치 위치는 zookeeper-3.4.5다

NAMENODE1:bin mazdah$ /zookeeper-3.4.5/bin/zkServer.sh start

kafka 설치, 설정, 구동

  • 설정

앞서 말했듯이 다운로드 압축해제 적절한 위치 복사면 모든 설치는 끝이다. 내가 받은 버전은 

kafka_2.11-0.9.0.1이며 /kafka에 설치했다.


우선 설정파일을 열고 다음과 같이 설정을 하였다. 설정 파일은 /kafka/config/server.properties다.
가장 먼저 설정해주어야 할 부분은 broker.id이다. 

나는 총 5대의 노드가 있기 때문에 각각의 PC(node)에 0부터 4까지 아이디를 부여해주었다.
예를들어 NAMENODE.local의 설정은 다음과 같다.

broker.id=0

다음으로는 zookeeper에 대한 설정으로 zookeeper.connect라는 항목에 
앞서말한 5개의 노드를 모두 적어주었다.

zookeeper.connect=NAMENODE.local:2181,SECONDARY-NAMENODE.local:2181,DATANODE1.local:2181,DATANODE2.local:2181,DATANODE3.local:2181

나는 처음에 이 부분에 적는 2181 포트가 도대체 어떤 포트인가 고민하다가 나중에 zookeeper의 cleintPort 

설정을 보고는 이해했다…-.- 그밖의 나머지 설정은 그냥 default로 두었다.


나중에 추가한 설정이 있는데 이 것은 나중에 상황을 설명하면서 함께 이야기 하겠다.

  • kafka 서버 기동

이제 kafka 서버를 기동해보자. 각각의 노드에서 /kafka/bin으로 이동한 후 다음과 같이 입력하여 기동한다.

NAMENODE:bin mazdah$ ./kafka-server-start.sh ../config/server.properties

아래와 같이 kafka 설정 정보들이 죽 나오고 이후 서버 start 메시지가 출력되면서 기동된다.

[2016-03-20 11:38:57,142] INFO KafkaConfig values: 
advertised.host.name = null
metric.reporters = []
quota.producer.default = 9223372036854775807
offsets.topic.num.partitions = 50
.
.
.

이후 테스트는 http://epicdevs.com/20의 내용을 그대로 진행해보았다.
물론 서버 정보 등은 나의 환경에 맞춰서..

  • topic 생성

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --create --zookeeper SECONDARY-NAMENODE.local:2181 --replication-factor 5 --partition 20 --topic test

그런데 처음부터 문제가 생겼다. 위와같이 시작을 했는데 아래와 같은 오류가 발생을 했다.

Exception in thread "main" org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 30000
at org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:1223)
at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:155)
at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:129)
at kafka.utils.ZkUtils$.createZkClientAndConnection(ZkUtils.scala:89)
at kafka.utils.ZkUtils$.apply(ZkUtils.scala:71)
at kafka.admin.TopicCommand$.main(TopicCommand.scala:53)
at kafka.admin.TopicCommand.main(TopicCommand.scala)

ps 명령어로 각 노드에서 확인을 해보아도 모든 zookeeper 인스턴스들이 정상적으로 떠있는 상태였는데 

zookeeper 연결시 타임아웃으로 연결할 수 없다니…ㅠ.ㅠ


일단 퍼뜩 떠오르는 생각은 zookeeper의 leader가 NAMENODE.local에 설정되어 있다는 것이다. 

아마도 topic 생성 등의 중요 작업은 zookeeper leader 노드에서 해야 하는 것 같다. 

다음과 같이 NAMENODE.local에서 topic이 생성되도록 하니 정상적으로 topic이 생성되었다.
(실제로 zookeeper의 leader node에서 실행하지 않아도 —zookeeper 옵션만leader node로 해주어도 된다). 
다음과 같이 성공하였다.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --create --zookeeper NAMENODE.local:2181 --replication-factor 5 --partition 20 --topic test

Created topic "test".
  • topic 리스트 보기

자 그러면 이제 topic 리스트를 한 번 보도록 하자.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --list --zookeeper NAMENODE.local:2181

test

아직은 만들어진 topic이 test 하나밖에 없기 때문에 test만 출력된다.

  • topic 상세 보기

그리고 다음과 같이 test topic의 상세 내용을 확인해보자.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --describe --zookeeper NAMENODE.local:2181 --topic test

Topic:test	PartitionCount:20	ReplicationFactor:5	Configs:
Topic: test	Partition: 0	Leader: 0	Replicas: 0,1,2,3,4	Isr: 0,1,2,3,4
Topic: test	Partition: 1	Leader: 1	Replicas: 1,2,3,4,0	Isr: 1,2,3,4,0
Topic: test	Partition: 2	Leader: 2	Replicas: 2,3,4,0,1	Isr: 2,3,4,0,1
Topic: test	Partition: 3	Leader: 3	Replicas: 3,4,0,1,2	Isr: 3,4,0,1,2
Topic: test	Partition: 4	Leader: 4	Replicas: 4,0,1,2,3	Isr: 4,0,1,2,3
Topic: test	Partition: 5	Leader: 0	Replicas: 0,2,3,4,1	Isr: 0,2,3,4,1
Topic: test	Partition: 6	Leader: 1	Replicas: 1,3,4,0,2	Isr: 1,3,4,0,2
Topic: test	Partition: 7	Leader: 2	Replicas: 2,4,0,1,3	Isr: 2,4,0,1,3
Topic: test	Partition: 8	Leader: 3	Replicas: 3,0,1,2,4	Isr: 3,0,1,2,4
Topic: test	Partition: 9	Leader: 4	Replicas: 4,1,2,3,0	Isr: 4,1,2,3,0
Topic: test	Partition: 10	Leader: 0	Replicas: 0,3,4,1,2	Isr: 0,3,4,1,2
Topic: test	Partition: 11	Leader: 1	Replicas: 1,4,0,2,3	Isr: 1,4,0,2,3
Topic: test	Partition: 12	Leader: 2	Replicas: 2,0,1,3,4	Isr: 2,0,1,3,4
Topic: test	Partition: 13	Leader: 3	Replicas: 3,1,2,4,0	Isr: 3,1,2,4,0
Topic: test	Partition: 14	Leader: 4	Replicas: 4,2,3,0,1	Isr: 4,2,3,0,1
Topic: test	Partition: 15	Leader: 0	Replicas: 0,4,1,2,3	Isr: 0,4,1,2,3
Topic: test	Partition: 16	Leader: 1	Replicas: 1,0,2,3,4	Isr: 1,0,2,3,4
Topic: test	Partition: 17	Leader: 2	Replicas: 2,1,3,4,0	Isr: 2,1,3,4,0
Topic: test	Partition: 18	Leader: 3	Replicas: 3,2,4,0,1	Isr: 3,2,4,0,1
Topic: test	Partition: 19	Leader: 4	Replicas: 4,3,0,1,2	Isr: 4,3,0,1,2

topic 생성시 partition을 20으로 지정했기 때문에 Partition: 0부터  Partition: 19까지 20개의 목록이 보이게 된다. 

각 항목에 대해서는 추후에 설명하기로 하고 대략 이런 모습이란 것만 확인하고 넘어가자.

  • producer를 이용한 메시지 생성

다음과 같이 입력하여 message룰 생성해보자.
이 명령에서 보여지는 9092포트는 kafka 설정 파일인 server.properties에 “listeners=PLAINTEXT://:9092”로 

설정이 되어있다. 실행하면 빈 프롬프트가 생기고 적절한 메시지를 입력하면 된다. 


입력한 후 엔터를 치면 다음 메시지를 입력할 수 있다. message1에서 message6까지 메시지를 생성해보았다.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-console-producer.sh --broker-list NAMENODE.local:9092 --topic test

message1
message2
message3
message4
message5
message6
  • cunsumer를 이용한 message 확인

다음과 같이 consumer를 실행하여 producer에서 생성한 메시지를 확인한다. 입력한 순서대로 출력되지 않는 것이 

아마도 Map 형식의 처리인 것으로 보인다. (가운데 빈 라인은 message 입력 제일 마지막에 엔터를 한 번 입력해서 

그렇다)

SECONDARY-NAMENODE:bin mazdah$ ./kafka-console-consumer.sh --zookeeper NAMENODE.local:2181 --topic test -rom-beginning

message5
message3

message1
message2
message4
message6
  • topic의 삭제

그냥 테스트로 만든 topic이니 미련 없이 삭제해보자. test이후에 test2라는 topic을 하나 더 만든 상태이다.
topic의 삭제는 생성과 동일한 구문으로 수행을 하며 —create 대신 —delete를 사용하면 된다.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --delete --zookeeper NAMENODE.local:2181 --replication-factor 5 --partition 20 --topic test2

Topic test2 is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

그런데 여기서도 이상한 부분이 발견되었다. 마지막 줄에 보면 다음과 같은 내용이 있다.
Note: This will have no impact if delete.topic.enable is not set to true.

혹시나 해서 topic 리스트를 확인해보았다.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --list --zookeeper NAMENODE.local:2181

test
test2 - marked for deletion

역시나 삭제한 test2 토픽에 marked for deletion라는 내용이 붙어있다. 어찌된 일일까? 

짐작했겠지만 답은 삭제시 보여진 NOTE의 내용에 있다. 설정 파일에 delete.topic.enable항목을 추가하고 

값을 true로 설정하면 된다.

delete.topic.enable=true

이후 다시 목록을 확인해보면 다음과 같이 말끔히 지워진 것을 확인할 수 있다.

SECONDARY-NAMENODE:bin mazdah$ ./kafka-topics.sh --list --zookeeper NAMENODE.local:2181

test

일단 오늘은 여기까지 기본적인 내용을 확인할 수 있었다.
다음 주에는 본격적으로 kafka에 대해 하나 하나 정리를 해보아야겠다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

하둡 설치 후 꽤 오랜 시간이 흘렀다.

그간 회사 업무가 바쁜 것도 있었지만 엄청나게 간단하다면 간단한 zookeeper와 HBase의 설치와 설정에서

생각 외로 많은 시간을 잡아먹었다.


그사이 Streaming API를 통해 축적한 트위터 데이터는 53Gb에 이르고 있다.

얼른 HBase를 설치하여 담아야 하는데…


사실 zookeeper와 HBase의 경우 너무서 설치와 설정이 간단해서 오히려 많은 자료들을 참조한 것이 

더 혼란을 가져왔다. 디테일한 차이가 얼마나 영향을 끼치는지 모르는 상황에서는 이것저것 다 해볼 수밖에

없기에 시간도 그만큼 많이 걸리고…


암튼 시행착오의 역사를 적는다…-.-


1. zookeeper를 설치하지 않다!


우선 HBase 완벽가이드를 참조해서 설치를 시작했는데…이 책이 완벽하지 않은 것인지 내가 띄엄띄엄 읽은 것인지

이 책의 설치 관련 챕터에는 zookeeper 설치에 대한 이야기가 없다.


띄엄띄엄 읽은(이편이 신빙성 있겠지…-.-) 나는 덜렁 HBase만을 설치한 후 설정과 실행단계에까지 진행을 했다.

물론 정상 실행될리가 없다.


jps를 이용해 실행되고 있는 프로세스들을 확인해본 결과 정상 상태라면 QuorumPeerMain이 떠있어야 하는데

나는 MasterQuorumPeer던가 하는 이상한 놈이 떠있었고 나는 그저 속편하게 내 주키퍼의 버전이 최신이어서

그런가보다 하고 엉뚱한 곳에서 원인을 찾고 있었다.


2. zookeeper를 설치하였으나 zookeeper가 실행이 안된다!


결국 우여곡절 끝에 zookeeper를 별도로 설치해야 한다는 것을 알았다.

그래서 설치를 하고 zoo.cfg도 잘 설정을하고 실행을 시켰으나…

역시나 실행이 안된다.


로그를 봐도 뭔가 접속 거부를 당했다거나, 타임아웃에 걸렸다거나…

어쨌든 뭔가 노드간에 통신이 안되고 있다는 짐작을 할 수는 있는 내용들이었으나

정확한 원인을 찾기가 쉽지 않았다. 언제나 그렇듯이 '간단한' 설정임에도 안되는 것이 생기면

무척 당황하기 마련이다.


그리고 이럴 땐…

그저 처음부터 차근차근 다시 해보는 것이 상책이다.


결국 밝혀낸 원인은 hbase.zookeeper.property.dataDir에 설정해놓은 주키퍼의 데이터 디렉토리에

생성되는 myID 파일의 값과 zoo.cfg에 설정한 주키퍼 서버 정보가 맞지 않아서 발생한 문제들이었다.


아무 생각 없이 실행시킨 주키퍼는 master 노드의 myID값을 0으로 설정하였다.

그런데 인터넷에 있는 대다수 설치 방법 안내에 보면 zoo.cfg에 다음과 같이 설정하고 있다.


#Zookeeper Servers
server.1=NAMENODE.local:2888:3888
server.2=SECONDARY-NAMENODE.local:2888:3888
server.3=DATANODE1.local:2888:3888

server.4=DATANODE2.local:2888:3888 

server.5=DATANODE3.local:2888:3888 


그리고 server.x의 x 값이 myID 파일의 값과 일치해야 한다고 설명하고 있다.

그래서 master 노드의 myID 값을 1로 바꾸고 나머지 노드들에 대해서도 순서대로 myID 파일의 값을

변경을 해주었다.


하지만 변한게 없었다.

또 몇칠을 허비한 끝에 우연히 master 노드의 myID 값은 내가 정해준 그대로 1로 되어있는데

슬레이브 노드들에서 myID 값들이 master가 0인것으로 인식되어 1, 2, 3, 4의 값들이 들어가있는 것이었다.


결국 시스템의 고집에 굴복하여 xoo.cfg의 설정을 다음과 같이 바꾸고 master의 myID도 0으로 바꾸었다.


#Zookeeper Servers
server.0=NAMENODE.local:2888:3888
server.1=SECONDARY-NAMENODE.local:2888:3888
server.2=DATANODE1.local:2888:3888

server.3=DATANODE2.local:2888:3888 

server.4=DATANODE3.local:2888:3888


그리고 드디어 zookeeper가 정상적으로 로드되었다.

zkCli.sh를 통한 테스트도 정상적으로 이루어졌다.



 3. 마지막 관문! HBase!


사실 HBase는 주키퍼 설치 이전에 상당부분 설정을 해 놓았기에 별 생각없이 실행을 시켜보았는데

역시나 정상적으로 실행이 안된다.


몇번의 시도 끝에 주키퍼가 제대로 로드되지 않아서 그런 경우를 몇번 확인하고

마지막으로 주키퍼가 정상적으로 로드된 상태에서 마지막 시도를 했는데 드디어 HBase도 정상적으로 올라왔다.

그런데 60010포트의 웹 관리 화면도 뜨지를 않고 또 hbase shell로 들어가 status 명령을 내려보니 다음과 같은

오류 메시지가 뜬다.


ERROR: org.apache.hadoop.hbase.masternotrunningexception retried 7 times


요건 뭘까…하고 또 한참을 고민하다가 hbase의 로그를 보니 다음 내용이 자꾸 올라간다.


Wating for dfs to exit safe mode…


역시 짐작대로 hadoop이 safe mode로 들어가있어서 발생한 문제였다.


hadoop dfsadmin -safemode leave로 safe mode를 빠져나가자…

드디어 HBase가 정상 작동하기 시작했다.


4. 로그 보기의 어려움


HBase와 zookeeper를 설치하다보니 로그를 많이 참조해야 했는데 어쩐 이유에서인지 ERROR 처리에

매우 인색하다는 느낌을 받았다. 대부분의 로그가 내용상은 Exception이 출력되더라도 level은 INFO나

WARN 수준이 대부분이고 가뭄에 콩나듯 ERROR가 보였다.


그러다보니 분명 Exception인데…이걸 해결하고 가야 하는 것인지 그냥 무시하고 넘어가도 되는 것인지

판단이 쉽지 않았다.


아마도 네트워크를 통해 멀티 노드를 관리하는 시스템이다보니 일시적으로 통신 장애등이 발생했다고 해서

그것을 error로 처리하기에는 무리가 있어서 그런 것이 아닐까 추측해본다.


그리고 그에 걸맞게 대부분의 문제는 노드간의 통신이 안되는 것, 특히 특정 노드에 프로세스가 로드되지 않아

발생하는 문제가 거의 대부분이었다는 것이다.


특히나 jps나 ps를 통해 프로세스를 확인하는 경우에도 분명 해당 프로세스가 보이는데 실제로는

서버가 구동되지 않는 상태인 경우가 많아 더욱 판단을 어렵게 하였다.


이런 부분만 조심한다면 사실 설치와 설정, 실행은 어렵지 않는 시스템인 것은 분명하다.


5. 다음 단계로


맥미니 5대 모으고 처음 Hadoop을 설치하여 구동시켜보고는 좋아라 하던 때가 엊그제 같은데…

벌써 해를 넘기려고 하고있다.


앞서 언급했듯이 샘플 데이터로 모으고있는 트위터 데이터도 53Gb 정도 모였고(물론 너무나 부족한 양이지만)

이제는 Map/Reduce와 HBase관련 실전 프로그래밍에 들어가야 할 시점에 이르렀다.


두 권의 완벽 가이드(Hadoop 완벽 가이드, HBase 완벽 가이드)를 통해 마지막 단계로 진입을 해야 할

시점이 된 것이다.


또 얼마나 헤매게 될지 걱정이 앞서지만 부딪쳐봐야 아는 것이고

현재 개발 중인 아이폰 앱 개발과 중복해서 하려면 시간이 만만치 않게 들게 될 것이

걱정이라면 걱정이다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/06/10 13:13 


역시 PPT 정리는 어렵군요...ㅠ.ㅠ

아래 이미지들은 한빛미디어의 Hadoop 완벽 가이드에 실린 내용을 재정리 한 것입니다.
=======================================================












블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/06/05 13:02 


HDFS (하둡 분산 파일 시스템)은 다음의 사항을 고려하여 설계되었다.


1. 대용량의 파일 : 수백 Mb에서 수백 Tb 혹은 Pb급 이상을 대상으로 함

2. WORM (Write Once Read Many) : 커다란 원본으로부터 데이터 셋을 만들어 그
              데이터 셋을 분석한다. 그러기 위해서는 전체 파일을 읽어야 한다.

3. 범용 하드웨어 : 고성능의 신뢰도 높은 서버가 아닌 다수의 범용 머신으로 구성된
              클러스터에서의 실행을 고려하였다.


========================================================
위 내용에 대해서는 여러 번 반복되었기에 간단하게 적고 넘어간다.

그러나 간혹 'Big'이라는 용어의 함정에 빠져 잊기 쉬운 부분들이 있다.
나 역시 BigData 관련 공부를 시작하면서 문서는 물론이거니와 이미지나 음악 및 동여상 등
개인이 소유하게되는 파일 역시 수적으로나 양적으로 점점 더 커지고 있는 상황에서
이러한 분산 파일 시스템을 개인용으로 만들어보면 어떨까 하는 생각을 해봤다.
기존의 RAID 시스템에 비해 오히려 하드웨어적으로 더 저렴하게 구현을 할 수 있을 것
같았다.

그러나 다음의 내용을 확인하고서는 조용히 생각을 접었다.
(하지만 아직 가능성은 모색 중이다.)
========================================================

HDFS가 적당하지 않은 분야

1. 빠른 데이터 액세스 / 빠른 응답 시간이 필요한 경우
 - 앞서도 나왔지만 HDFS는 대용량의 파일을 처리하기 위한 시스템이고 대체로 배치성
   작업에 적합하다.

2. 많은 수의 작은 파일들에 대한 처리
 - 네임노드는 파일들의 메타 데이터를 관리하며 이를 디스크가 아닌 메모리에 저장하여 처리한다.
   따라서 파일의 수가 많아질수록 메모리에 대한 부하가 가중되며 아직도 디스크에 비해
   가격이 비싼 메모리 관리에 문제가 발생할 수 있으며 파일의 수가 비약적으로 많아질
   경우 하드웨어에서 지원 가능한 메모리 용량을 넘어설 수도 있는 문제이다.

3. 다중 writer나 임의의 파일 수정
 - 역시 앞서 나왔듯이 HDFS는 WORM 상태를 고려하여 설계되었다.
   예를 들어 HDFS는 파일을 블럭으로 나눈 후 서로 다른 노드에 저장을 한다.
   뿐만 아니라 필요한 수 만큼의 복제본을 생성한다. 만일 이 파일에 대한 수정을
   허용한다면 파일의 수정이 생길 때마다 각 노드이 해당 블럭을 찾고 수정된 위치에
   변경 사항을 반영해야 하며 이러한 작업을 복제본에까지 적용해야 한다(혹은 변경된
   블럭들을 다시 복제해야 한다).
   얼마나 비효울적인가...

***
즉, 수십Gb에 달하는 대용량의 파일의 존재할지라도 아직도 개인의 디스크에는
많은 수의 작은 파일들이 대부분의 저장공간을 차지하고 있을 것이다.
또한 파일 성격에 따라 수시로 변경되는 파일도 많을뿐더러 이러한 파일들을
빨리 읽혀야 한다.

하지만 동영상을 중심으로하는 대용량 파일들만을 고래해보았을 때는HDFS의
기본 설계에 얼추 들어맞는 것 같다. 대용량이면서 디스크에 저장된 이후 수정이 일어날
일도 없다. 다만 빠른 접근만이 문제가 될 것이다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/30 15:24 


맵 리듀스 개요

맵 : 
- 원시 데이터를 key-value 쌍의 중간 파일로 만든다.
- 입력데이터가 있는 노드에서 맵 함수가 수행되는 것이 가장 좋다 (지역성 최적화)
- 맵 함수에 전달되는 입력 데이터는 라인 offset을 키로, 해당 라인 내용을 value로 하는 형태로 구성된다.
- 맵 함수는 이 입력값들로부터 필요로 하는 key와 value를 추출한다.
- 이 과정에서 잘못된 레코드를 제거하는 기능도 수행한다.
- 맵 task의 실행 결과는 HDFS가 아닌 로컬 디스크에 저장된다. (HDFS와 로컬 디스크의 개념을 명확히 구분하자)
  이유는 맵의 결과물은 단지 리듀스 함수로 전달하기 위한 중간 결과물일 뿐이며 모든 잡이 완료되면
  버려도 되는 데이터이기 때문이다.

리듀스 : 
- 각 맵 task들의 결과물들을 입력으로 받아 최종 결과물을 생성한다.
- 각 노드에 있는 맵 task의 결과물들을 입력으로 받으므로 지역성 최적화의 영향이 없다.
- 리듀스의 결과물은 안정성을 위하여 HDFS에 저장된다.


셔플 : 
- 맵 task의 결과물을 리듀스 task로 보내기 전의 중간 가공 단계
- key에 대한 정렬이나 그룹화 및 파티셔닝 작업이 이루어진다.
- 정렬은 말 그대로 정렬이며 그룹화는 같은 key로 묶는 것, 그리고 파티셔닝은 리듀스 task가 2개 이상인 경우
  결과물을 각각의 리듀스 task에 분배하기 위해 특정 기준으로 쪼개는 작업이다.
- 때때로 셔플 작업이 없을 수도 있으며 이런 경우에는 리듀스 task도 없는 맵 task만으로 이루어진
  job이 수행된다. 또한 이 상태에서는 맵 task의 결과가 HDFS에 저장된다.

컴바이너 : 
- 맵 task의 결과물을 네트워크를 통해 리듀스 task로 이동시키는 과정을 최적화하기 위한 방법 중 하나
- 같은 key를 가진 value들을 리스트로 묶어 새로운 key-value쌍을 만든다.
  즉 {key1, value1}, {key1, value2}를 {key1, list(value1, value2)}의 형태로 만드는 것이다.
- 주로 연합 연산(합계, 카운팅, 최대값 등)에 사용된다.
- 컴바이너를 사용하게 되면 맵 task 결과물의 사이즈를 줄일 수 있다. 즉 네트워크의 트래픽량을 줄일 수
  있게 되는 것이다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/21 13:01 


이 글에 적는 내용은 2013년 1월 3일 길벗사에서 간행한

'대용량 데이터 분석 및 처리를 위한 hadoop nosql' (서상원김재홍박윤성이준섭명재석 저)의
전자책 버전에서 발췌한 내용입니다.
중요한 내용이 있을 때마다 이러한 정보들을 정리해 올리도록 하겠습니다.

==========================================================

1. 하둡은 크게 HDFS와 MapReduce의 두 부분으로 구성되어있으며
   HDFS는 네임노드, 세컨더리 네임노드, 데이터노드를 동작시키고
   MapReduce는 잡 트래커와 태스크 트래커를 동작시킨다.

   네임노드와 잡 트래커는 마스터 노드(네임노드)에서, 데이터노드와 태스크 트래커는
   슬레이브 노드(데이터노드)에서 동작한다.

   동작하는 프로세스는 jps 명령으로 확인할 수 있다.

2. 하둡 분산 파일 시스템(HDFS)는 다수의 작은 파일보다는 소수의 대용량 파일을 다루는데
   적합하도록 설계된 파일 시스템이다.

3. 하둡에서 각 노드들의 프로세스를 기동하기 위해 SSH를 사용한다. 수 백, 수 천대로
   구성된 클러스터의 경우 일일히 각각의 서버에서 프로세스를 기동할 수 없기 때문에
   네임노드에서 기동을 시키면 클러스터 내의 모든 슬레이브 노드에서 프로세스가 기동이
   되는 데, 이 때 SSH를 사용하여 명령을 전달하게 된다.

4. 하둡이 파일을 블록으로 나누어 저장하는 이유
   - 파일 시스템에 따라 한 개의 파일이 가질 수 있는 최대 크기에는 제약이 있다.
      블록으로 나누어 저장하면 이러한 제약을 피해서 대용량 파일을 저장할 수 있다.
   - 대용량 파일을 하나로 저장할 경우 파일을 읽기 위해 메모리로 로드하는데 부하가
      걸린다. (Gb급 로그 파일을 편집기로 열지 못하는 경우를 생각해보자) 블록으로
      나루면 이러한 문제가 해소된다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/20 13:15 


일단 설치와 설정을 끝마쳤다고 생각하고 샘플 job을 수행해보기로 했다.
하지만 아래의 명령을 실행시켜도 map:0% reduce:0%에서 더이상 진행이 없었다.

예제 실행 코드

./hadoop jar ../hadoop-examples-1.0.4.jar wordcount input output

input : 원본 문서가 있는 곳
output : 결과 문서가 저장될 곳

아직도 분산이라는 환경에 익숙하지 않은 탓에 계속 네임노드쪽 로그만 뒤적거리면서 원인을 찾으려고 했다.
하지만 네임노드쪽 로그에는 딱히 이렇다할 에러도 기록된 것이 없어 원인을 찾은데 시간만 잡아먹고 있었다.

그러다가 데이터노드 쪽으로 관심을 돌려 데이터노드의 로그를 살피기 시작했고 여기서 문제의 실마리가
잡히기 시작했다.

우선 데이터노드에서 jps 명령을 통해 TaskTracker가 로드되지 않았다는 사실을 확인했다.
그리고 바로 hadoop-mazdah-tasktracker-macmini-server.com.log 파일에서 다음과 같은 로그를
발견했다

이 로그의 ERROR 항목 바로 직전에 나오는 WARN 내용으로부터 디렉토리 설정에 뭔가 문제가 있다는 것을
짐작하고 처음 글에서 잠시 언급한 것 처럼 이 디렉토리도 모든 노드들 간에 경로를 일치시키기로 했다.


처음 디렉토리 설정이 맞지 않았을 때의 오류 로그

************************************************************/
2013-05-20 11:27:20,495 INFO org.apache.hadoop.mapred.TaskTracker: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting TaskTracker
STARTUP_MSG:   host = macmini-server.com/134.102.35.58
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 1.0.4
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct  3 05:13:58 UTC 2012
************************************************************/
2013-05-20 11:27:20,657 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2013-05-20 11:27:20,710 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2013-05-20 11:27:20,711 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2013-05-20 11:27:20,711 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: TaskTracker metrics system started
2013-05-20 11:27:20,979 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2013-05-20 11:27:25,144 INFO org.mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
2013-05-20 11:27:25,190 INFO org.apache.hadoop.http.HttpServer: Added global filtersafety (class=org.apache.hadoop.http.HttpServer$QuotingInputFilter)
2013-05-20 11:27:25,220 WARN org.apache.hadoop.mapred.TaskTracker: TaskTracker local dir /Volumes/Data2/hadoop-data/mapred/local error can not create directory: /Volumes/Data2/hadoop-data/mapred/local, removing from local dirs
2013-05-20 11:27:25,221 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at org.apache.hadoop.mapred.TaskTracker$LocalStorage.checkDirs(TaskTracker.java:211)
at org.apache.hadoop.mapred.TaskTracker.<init>(TaskTracker.java:1449)
at org.apache.hadoop.mapred.TaskTracker.main(TaskTracker.java:3742)

2013-05-20 11:27:25,222 INFO org.apache.hadoop.mapred.TaskTracker: SHUTDOWN_MSG:


각각의 설정 파일에서 다음과 같이 value를 통일시켰다.
몰론 네임노드와 데이터노드의 실제 물리적 공간도 /hadoop-data로 맞추었다.

core-site.xml

<property>
        <name>hadoop.tmp.dir</name>
        <value>/hadoop-data/tmp</value>
    </property>
   
hdfs-site.xml

<property>
     <name>dfs.name.dir</name>
        <value>/hadoop-data</value>
    </property>

    <property>
        <name>dfs.data.dir</name>
        <value>/hadoop-data</value>
    </property>
   
mapred-site.xml

<property>
         <name>mapred.system.dir</name>
         <value>/hadoop-data/mapred/system</value>
    </property>
    <property>
     <name>mapred.local.dir</name>
        <value>/hadoop-data/mapred/local</value>
    </property>
   

그리고 각 노드간 변경된 설정들을 sync 시킨 후 다시 start-all.sh를 실행시켰다.
그러나 여전히 문제가 발생을 하였다. 이번엔 jps 명령어를 통해 확인하니 데이터노드쪽에서 DataNode 프로세스가
로드되지 않았고 hadoop-mazdah-datanode-macmini-server.com.log 파일을 확인하니 다음고 같은 로그가
찍혔다.

************************************************************/
2013-05-20 12:28:44,171 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting DataNode
STARTUP_MSG:   host = macmini-server.com/134.102.35.58
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 1.0.4
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct  3 05:13:58 UTC 2012
************************************************************/
2013-05-20 12:28:44,307 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2013-05-20 12:28:44,317 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2013-05-20 12:28:44,317 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2013-05-20 12:28:44,317 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: DataNode metrics system started
2013-05-20 12:28:44,403 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2013-05-20 12:28:52,800 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /hadoop-data: namenode namespaceID = 1440344326; datanode namespaceID = 1690373933
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:385)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:299)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1582)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1521)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1539)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1665)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1682)

2013-05-20 12:28:52,802 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:


이 내용은 구글링을 통해 쉽게 해결하였다.
위에서 디렉토리 경로를 바꾸면서 기존 생성했던 디렉토리를 새 위치로 그냥 카피를 했던 것이다.
즉 /hadoop-data라는 디렉토리 안에 기존에 생성된 설정들이 그대 담겨있었다. 이로 인해 문제가 발생을 한 것이었고
/hadoop-data를 싹 비우고 새로 실행하니 드디어 wordcount 예제가 실행이 되었다.

역시 아직은 분산이라는 환경에 익숙하지 않은 탓에 사소하면서도 쉽게 해결하지 못하는
문제들이 많이 발생을 한다. 이 부분은 이론적인 학습을 통해 보충을 하는 수 밖에 없을 것 같다.

그리고 이번 글에 같이 적으려던 놀고먹게된 맥미니에 대한 이야기는 별도로
작성하려 한다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/16 13:37


미리 말씀드리지만 이 글은 설치 안내가 아니라 설치 중에 실수할 수 있을만한 부분에 대해

적은 글입니다. 설치 전반에 대해 참고한 글은 본문 중에 링크를 하였으니 참고하세요...^^


=========================================================


원래는 교재와 함께 천천히 실습을 진행할 계획이었는데…

지난 한 달 간 되지도 않는 영어실력으로 문서 번역한다고 삽질을 해놨더니 조급증이 생겨서

우선 하둡부터 설치를 하고 봤다.


애초 예정대로 대상 머신들은 모두 애플의 맥 기종으로 맥북 프로1대 맥미니 서버 1대 맥미니 1대이며

이 중 맥북프로와 맥미니 서버는 같은 네트워크 대역에 있으나 맥미니 1대는 다른 네트워크 대역에 있다.

다음 글에 언급하겠지만 역시나…맥미니는 클러스터로 묶일 수가 없다…ㅠ.ㅠ

(이거 해볼라구 따로 구입한 놈인데…제 역할을 못하게 됐다…ㅠ.ㅠ)


우선 설치는 무진장 쉽다.

개나 소나 할 수 있다.

개나 소가 컴퓨터를 이용할 수 있다는 가정하에…-.-


암튼 다운로드 받고 압축 풀고 java home 잡아주고 설정 xml파일 3개정도 만져주면 끝이다.

우선 도움을 받은 사이트를 링크한다.

많지도 않다.

요기만 잘 보고 진행하면 만사 땡이다.


http://blrunner.com/29

http://develop.sunshiny.co.kr/868

http://develop.sunshiny.co.kr/893


하지만…

중요한 함정이 도사리고 있었다.

앞서 구글의 논문을 번역하는 가운데 구글 애들이 매우 자주 강조한 내용이 있었다.

'MapReduce 라이브러리는 병렬이나 분산 시스템에 대한 경험이 없는 개발자들도

쉽게 접근할 수 있다'는 것이다.


그러나 이 쉽게 접근할 수 있다는 의미는 좀 더 구체적으로 말하면

'(얼마간의 혹은 꽤 오랜 시간 삽질을 거치게 되면) 쉽게 접근할 수 있다'라는 것이다.


대체로 분산 시스템이라는 것이 물리적으로 다른 공간에 위치한 머신들 사이에 동일한 프로세스를

마치 동일하 머신상에서 수행하는 것 처럼 처리할 수 있다는 의미일 것이다.

하지만 이러한 분산 시스템을 위해 먼저 알아 두어야 할 것이 바로 '물리적으로 분리된 공간'이라는 점이다.

이 것은 시스템의 환경을 설정할 때 뜻하지 않은 실수를 하게 만든다.

바로 호스트명 또는 서버 주소를 설정하는 부분에서 발생을 하게 되는 것이다.


오늘의 실수를 통해 이야기 해보자.


우선 Hadoop은 Standalone모드와 Pseudo-distributed모드 그리고 Fully-distributed모드로

실행할 수 있다. 각각의 모드는 특별이 데몬을 띄울 때 옵션이 있거나 한 것이 아니라 위 링크에

설명되어있는 설정파일을 어떻게 설정을 하느냐에 따라 달라진다.


Standalone : 모든 설정파일을 초기 상태로 비워둔채로 하둡을 실행한다. map/reduce 프로그램을

                       신속하게 개발/디버깅하기 위해 사용된다.

Pseudo-distributed : 모든 설정 파일에 각 노드의 주소를 모두 localhost로 입력한다. 단일한

                       머신 내에서 가상으로 분산 환경을 만들 때 사용된다.

Fully-distributed : 모든 설정 파일에서 각 노드의 주소는 실제 부여된 IP나 도메인 또는 hosts 파일에

                       등록된 이름을 사용해야 하며 각각의 머신들은 실제로 분산되어있어야 한다.


내가 처음 참조한 설치 방법에 대한 블로그는 http://blrunner.com/29였다.

그런데 이 블로거는 Pseudo-distributed로 실행할 것을 전제로 하여 설명을 하고 있다.

그런데 나는 Fully-distributed를 목표로 진행을 하고 있었다. (그래서 피같은 돈 들여 맥미니까지 추가

구매를 하였다. 근데 그놈은 현재 놀고있다…ㅠ.ㅠ)


아무 생각 없이 따라하다보니 하둡 설정이 모두 Pseudo-distributed에 맞춰진 것이다.

여기서 첫 번째 실수가 있었다.


다음으로는 원래 분산 시스템이란 것이 그런가 모르겠는데

각 머신들간의 동기화를 위해서인지 하둡 자체가 동일한 경로에 설치가 되어야한다는 것을

나중에 알았다.(혹은 위치가 달라도 설정만 별도로 해주면 되는지도 모르겠다. 아직 모르는게

더 많아서…^^;;;)


즉 A 머신의 하둡 설치 경로가 /home/mazdah/hadoop-1.0.4였다면

B 머신의 하둡 설치 경로도 /home/mazdah/hadoop-1.0.4여야 한다는 것이다.


꼭 이렇게 하지 않아도 될지 모르지만 개인적인 생각에 시스템을 아예 처음 설치하는 것이라면

디스크 볼륨 등을 통일해서 이렇게 같은 경로에 설치하는 것이 관리적인 차원에서 좋을 것 같다.


이미 다른 시스템들이  잔뜩 설치된 곳에서는 디스크 볼륨명을 함부로 바꾸기도 쉽지 않고

여러모로 헷갈릴 듯싶다.


아래는 머신간에 하둡 설치 위치가 달랐을 때와 설치 위치가 같았을 때 start-all.sh를 실행한

콘솔 메시지 내용이다.


xxx와 yyy 머신은 데이터 노드이고 localhost는 네임노드이다.

현재 /Volumes/Data2/hadoop-1.0.4로 표시되는 것은 처음 설치한 네임노드에서의 하둡 설치

위치(HADOOP_HOME)이다.


이 중 xxx 시스템의 설치 위치를 네임노드와 일치시켰더니 이후 실행 시 xxx 머신에서는

No such file or directory 메시지가 나오지 않게 되었다.


하지만 yyy노드이 경우 이미 다른 웹 시스템 및 SVN과 CI용으로 젠킨스 등이 설치된 상태라 함부로

디스크 볼륨명을 수정하기가 어려웠다. 그래서 3대의 시스템 모두 설치 위치를 /hadoop-1.0.4로

옮겨버렸다. 참으로 심플한 결정이었다…-.-


네임노드와 데이터 노드의 하둡 설치 위치가 달랐을 때


Mazdah-ui-MacBook-Pro:bin mazdah$ ./start-all.sh

starting namenode, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-namenode-Mazdah-ui-MacBook-Pro.local.out

xxx.xxxxx.xxx: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

localhost: starting secondarynamenode, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-secondarynamenode-Mazdah-ui-MacBook-Pro.local.out

starting jobtracker, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-jobtracker-Mazdah-ui-MacBook-Pro.local.out

xxx.xxxxx.xxx: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory


Mazdah-ui-MacBook-Pro:bin mazdah$ ./stop-all.sh

stopping jobtracker

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

xxx.xxxx.xxx: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

stopping namenode

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

xxx.xxxx.xxx bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

localhost: stopping secondarynamenode


네임노드와 데이터 노드의 하둡 설치 위치가 같아진 후


Mazdah-ui-MacBook-Pro:bin mazdah$ ./start-all.sh

starting namenode, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-namenode-Mazdah-ui-MacBook-Pro.local.out

xxx.xxxx.xxx: starting datanode, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-datanode-localhost.out

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory

localhost: starting secondarynamenode, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-secondarynamenode-Mazdah-ui-MacBook-Pro.local.out

starting jobtracker, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-jobtracker-Mazdah-ui-MacBook-Pro.local.out

xxx.xxxx.xxx: starting tasktracker, logging to /Volumes/Data2/hadoop-1.0.4/libexec/../logs/hadoop-mazdah-tasktracker-localhost.out

yyy.yyyy.yyy: bash: line 0: cd: /Volumes/Data2/hadoop-1.0.4/libexec/..: No such file or directory

yyy.yyyy.yyy: bash: /Volumes/Data2/hadoop/bin/hadoop-daemon.sh: No such file or directory


첫 날부터 너무 긴 내용을 적으면 이후 진행에 애로 사항이 꽃피는데…

암튼 처음 설치다보니 삽질이 적지 않았다. 하지만 반나절 정도 삽질하고 네임노드와 데이터 노드가 정상적으로

연결된 것을 볼 수 있었으니 그리 나쁘진 않은 성적인 것 같다.

구글 아자씨들 말대로 쉽긴 쉬운가보다.

(컴퓨터를 할 줄 아는) 개나 소나 할 수 있으니…^^;;;


암튼 오늘인 여기까지

다음에는 아직 못돌려본 샘플 프로그램을 좀 돌려보고 부가적으로다가

혼자 놀게된 맥미니가 왜 혼자 놀게 되었는지(당근 네트워크 대역이 다르니…-.-)

또 거금을 들여 구입한 맥미니를 그냥 놀게 둘 수는 없으니 어떻게 활용할지에 대해 다뤄보자.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/15 13:28 


앞서 용어 정리도 해보았고

또 없는 실력에 구글의 MapReduce에 대한 논문도 한 편 번역을 해 보았다.
이제 실습을 진행할 단계인데...여전히 지식은 부족하다.
해서 교재가 한 권 필요한데...우선 현재 보유하고 있는 Hadoop 관련 서적이 한 권
있어서 이 책을 기반으로 실습을 진행하려고 한다.

교재

제목 : Hadoop 완벽 가이드
저자 : 톰 화이트
역자 : 심탁길, 김우현
출판사:O'REILLY, YAHOO RESS, 한빛미디어
초판 발행일 : 2010년 5월 30일

일단 발행일이 2010년이라 좀 오래된 감은 있지만 기본 적인 내용에 대한 변화는
없으리라 믿고 일단 진행한다. 우선 이 책을 진행 하다가 현재의 버전과 차이가
많이 난다면 그 때 새 교재를 고려해 볼 것이다.

하드웨어

다음은 하드웨어적인 준비인데 현재 내가 개인적으로 전용할 수 있는 시스템은
애플의 MAC 3대이다. 맥북프로 1대 맥미니 서버 1대 맥미니 1대
MAC으로 시스템을 구성한 이유는 일단 현재는 내가 아이폰 개발을 주력으로
하고 있기 때문이다...^^;;; 또 한편으로는 MAC OS가 윈도우즈 시스템보다는
유닉스 계열에 가까운 특성도 있어서 진행이 수월할 것 같아서이다.

어쨌든 이 중 맥북프로와 맥미니 서버는 회사에 있고 맥미니는 집에 있는데
일단 방화벽으로 인해 회사 시스템에서는 집 시스템이 연결이 되지만 집 시스템에서는
회사 시스템이 연결이 되지 않는다. 이 부분이 어떻게 해결될 수 있을지가 고민이다.

만약 전혀 쌍방향 통신의 가능성이 없다면 우선은 회사에 있는 2대로 진행을 해야겠다.

다음 가상(학습용 샘플) 서비스를 위해 필요한 데이터를 저장할 스토리지로는
그냥 2Tb 하드 2개를 USB 3.0 외장 케이스에 담아 집 시스템에 연결을 해두었다.
이 것도 역시 방화벽 문제 해결 여하에 따라 변동이 생길 것 같다.

간략한 시스템 사양은 다음과 같다.

맥북프로(Early 2011) : i7 쿼드코어 / 16Gb 램 / 256Gb SSD / 500Gb HDD
맥미니 서버 : i7 쿼드코어/ 4Gb 램 / 500Gb * 2 HDD
---------------------------------------------------------------------------------------------
맥미니 : i5 듀얼코어(4thread) / 16Gb 램 / 500Gb HDD / 2Tb * 2 USB 3.0 외장하드

서비스

현재 내가 가장 손쉽게 대량의 데이터를 얻을 수 있는 소스는 바로 트위터이다.
팔로워들의 tweet데이터를 API를 이용하여 수집을 할 예정이며 이 데이터들을 이용하여
단어 분석을 진행할 예정이다. 구체적으로 어떤 내용을 분석할 것인지에 대해서는
조금 더 학습을 진행한 후 정리하도록 하겠다.



아직은 쥐뿔도 모르지만 이렇게 준비를 하고보니 엄청 설레인다...^^;;;
열심히 준비해서 뭔가 한 번 해내야겠다~

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/05/15 13:05 


드디어 마지막 결론입니다~~~!

그동안 발번역을 열심히 보아주신(분이 계시다면) 경의를 표합니다...^^;;;
이제 다음 주부터는 실무 연습으로 들어가야겠네요.
자세한 계획은 다음 글에...^^;;;

감사합니다.
=============================================

결론

MapReduce 프로그래밍 모델은 구글에서 여러가지 서로 다른 목적을 위해 성공적으로 사용되고 있다.
우리는 몇가지 이유로부터 이러한 성공의 결과를 찾고 있다.

첫 번째로 MapReduce의 프로그래밍 모델은 병렬화, 고장 방지, 지역 최적화, 로드 밸런싱 등의 세부적인
부분을 모두 라이브러리 내부에 감추고 있기 때문에 사용하기 쉽고 심지어 병렬이나 분산 시스템에 대한 경험이 없는
프로그래머도 사용 가능하다.

두 번째로 매우 다양한 문제들을 MapReduce 연산으로 쉽게 표현할 수 있다.
예를 들면 MapReduce는 구글의 검색 서비스, 정렬이나 데이터 마이닝, *machine learning(기계 학습),
그리고 많은 다른 시스템들을 위한 데이터를 생산해내고 있다.

세 번째로 우리는 수천대의 머신으로 구성된 대규모 클러스터를 대상으로 MapReduce 구현을 개발했다.
이러한 구현은 이러한 머신 리소스들을 보다 효과적으로 사용 가능하도록 해주며 그래서 구글에 닥친
컴퓨터와 관련된 다수의 커다란 문제점들을 다루는데 적합하다.

우리는 이 작업으로부터 몇가지를 배웠다.
첫 번째로 프로그래밍 모델을 제한하는 것이 연산을 병렬화 분산화 시키는데 쉽고
이러한 연산의 고장 관리를 하는데 쉽다는 것이다.

두 번째로 네트워크 대역폭은 부족한 자원이라는 것이다. 우리 시스템의 다수의 최적화는
데이터를 네트워크를 통해 전송하는 전송량의 감소에 초점이 맞춰져있다:로컬 최적화는 로컬 디스크로부터
데이터를 읽을 수 있도록 해주고 단일 복사본의 중간 형태의 데이터를 로컬 디스크에 기록함으로써
네트워크 대역폭을 절약하게 해준다.

세 번째로 남아도는 실행은 느린 머신들, 머신의 고장 관리, 데이터 손실 등에 의한 악영향을 감소시키는데
이용 가능하다.





machine learning
(1) 새로운 정보를 학습하고, 습득한 정보를 효율적으로 사용할 수 있는 능력과 결부시키는 지식 습득.
(2) 작업을 반복적으로 수행함으로써 결과를 얻어내는 기술의 개선 과정.
컴퓨터인터넷IT용어대사전

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^