하둡 2버전은 잘모르겠지만.


1버전을 이용할때는 리눅스에서 HDFS에 직접 마운트를 해서 사용하고 싶을때가 있었습니다.


그떄 fuse-dfs를 이용해서 마운트 했는데, 2버전때 없어졌나 했는데.. 제가 HDP(Hortonworks Data Platform)을 이용해서 그런지 잘 안보였던것 같더군요.. cloudera에는 fuse-dfs가 그대로 있던것 같았습니다. 홈페이지에서 보기에는 


http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.4/bk_hdfs_nfs_gateway/content/hdfs-nfs-gateway-user-guide.html



다른 배포판은 모르겠지만.. 아파치 하둡1을 이용할때는,, fuse-dfs를 사용하기 위해 관련 라이브러리 설치하고 하둡 컴파일 하고 귀찮은 절차가 필요했었는데.. HDP는 이런것은 확실히 편하네요 



사용방법은 간답합니다. 


mount -t nfs -o vers=3,proto=tcp,nolock (NDFS게이트웨이가 있는 노드):/ (마운트 하려는 폴더)




그리고 마운트된 폴더를 접속하면 다음과 같이 마운트가 잘되신것을 확인 할 수 있습니다 


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

오늘 심각한 고민을 했습니다  ... 자바는 그냥 갔다 버려야되나..


Parallel Python 이거 써보고 할말을 잃었습니다. 생각보다 너무 쉽고.


Parallel Python을 사용하기 위해서는 대략 다음 절차를 수행하시면 됩니다.



연산을 하려는 노드, Master노드에 Parallel Python 설치(http://www.parallelpython.com/) [현재 저같은경우 Python 2.7을 사용하고 있습니다.]


그다음 연산하려는 모든 노드에서 네트웍 대역이 같다면, ppserver.py -a (이 의미는 실제 코드 설명할때 설명0


그리고 마스터 노드에서 병렬처리할 코드를 작업하시면 됩니다.


큰틀은 다음과 같습니다. 


가장 중요한 부분은 ppserver= ppservers=("*",) 입니다. 앞에서 ppserver.py -a  한이유와 같은데, 만약 같은 네트워크 대역폭에 있으면 알아서 감지합니다. 


 job_server.submit(mysum,(100,),callback=sum.result) 


실행할 함수?, 그리고 Parameter, 콜백 함수 입니다. 


만약 이럴경우, 병렬로 돌릴때 그 모듈이 돌아가기 위해 필요한 모듈이 있다고 가정할대, 예를들명 mysum을 연산할때 파이선의 math 모듈이 반드시 필요하다 그럴경우에는 modules = ("math","sys")와 같이 파라메터를 넣어주시면 됩니다.


파이썬이 이렇게 강력할줄이야.. 




import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()


저작자 표시 비영리 변경 금지
신고
  1. Favicon of http://navisphere.net BlogIcon 룬룬 2016.01.03 15:19 신고

    오늘은 드디어 아는 뭔가가 나와서 반가운 마음이 드네요.
    먼저 복 많이 받으시고요. :) 늘 은은히 이어가는 인연이 즐겁습니다.

    저는 전공이 컴퓨터비전, 패턴인식, 머신러닝에 가까운 사람입니다.
    파이썬도 많이들 쓰더라구요. 아마 MATLAB이 유료이기에 그 대안으로 사용되는 분위기가 아니었나 싶습니다.

    저 또한 처음에는 고가의 MATLAB에서 벗어나보고자 배우기 시작한 것이 Python이고 말씀하신 부분, 그 명쾌하게 한줄로 해결되는 듯한 그 부분에 인상이 깊은 언어로 남아있습니다. 배우기 쉽고 수천의 이미 준비된 라이브러리들.. 그렇지 않을 수가 없었죠. :)

    병렬처리라고 하면 제 머릿속에서는 GPU를 이용한 것들이 먼저 떠오르는데 써주신 Parallel Python은 MPI 같은 환경을 말하는 것인가봅니다.
    어쨌든 Python의 편리함은 부정할 수 없는 것 같고요.

    개인적으로 조금 배우고 써보면서 느낀 점을 단 점 위주로 말씀드려보고자 합니다. 사용하실 때 감안을 해보면 좋을 것 같습니다.
    분야 때문에 환경이 좀 다를 수도 있을 것 같기도 해요.

    1. 빠른 결과를 보기 위한 실험용으로는 최적입니다.
    말씀드렸듯 이미 준비된 모듈들이 너무나도 많습니다. 단순 wrapper들도 많고요.

    2. 짜임새 있는 구조로 아름다운 코드를 만들기는 힘든 것 같습니다.
    제가 실력이 모자라 그런 느낌을 받았을 수도 있는데, 스크립트 언어 특성상 그 부분에 이르러서야 오류가 나기 때문에 아까운 시간들을 놓칠 때가 많습니다.
    단순 문법이나 사용상 오류들을 잡는데 시간을 많이 보냈던 것 같습니다. C/C++에서는 빌드조차 안될 것 같은 그런 오류들 말이에요.
    모듈간 연동시에도 크게 검사 과정이 없기 때문에 코드의 크기가 커질 수록 다루기가 힘든 물건이 되어버리는 것 같습니다.

    3. Type 문제
    제게는 이것이 가장 큰 문제로 다가왔습니다.
    사용하다보면 Numpy 등에서 새로 정의된 Type들을 사용하게 되는데, 이것과 기존 Type 혹은 다른 모듈의 Type들이 혼용되기 시작하면 사람이 이를 다루지 못하는 시기가 오게 됩니다.
    C/C++에서는 강력한 Type 검사를 통해 막아주고 있는 부분인데요, MATLAB등은 Matrix, Cell, Dictionary 정도로 제한이 되고 있는 부분이고요.


    아마 지금은 첫줄 같은 고민을 하시긴 해도, 결국 Java를 선택하는 날이 오시리라 믿습니다.


    그럼에도 매력적인 언어임에는 틀림이 없는 것 같습니다.
    어차피 도구니까요. 적절한 목적에 잘 사용하면 되겠죠. :D

    어제 동생과 이야기하다가 나온 것인데,
    Perl 같은 스크립트가 커지면 Python정도로 확장했다가 더 큰 규모가 필요해지면 기존 언어로 가는게 적절한 순서가 아닐까 싶네요.


    오늘은 살짝 넘어서 이야기한 것 같나요? 아는게 나오니 신이 나서... 넓은 마음으로 봐주시고요. :)
    휴일에도 공부하시는 모습에 박수를 보냅니다. 짝짝짝.


    • Favicon of http://redeyesofangel.tistory.com BlogIcon Yuika eizt 2016.01.03 15:43 신고

      새해 복 많이 받으세요 :)

      생각해보면 가벼운 MPI 같은 느김이 맞을것 같습니다. 저 같은 경우는 MPI같은 것과는 거리가 멀고(아마..) (대강들어본적은 있습니다... 학교 다닐대 배울기회가 있었지만,, 수업이 빡세다고해서.. 선택을 안했지만요..)

      요즘에는 학교에서 나와서 빅데이터를 처리하는데 사용하는 Hadoop(MapReduce,Hbase, Hive ...) 안에 있는것들과 Storm 이런 위주로 사용하고 있네요..

      그러다 보니, 가끔식 어떤 데이터들을 처리할대 한개 컴퓨터에서 돌릴때 약간쫌 꼼수로 MapReduce로 나누어서 돌리거나 그러는데... 약간 사이비이네요. 너무 불편했는데,, 어제 파이선이 보이는것입니다..

      사실 어제는 신기했는데,, 전 이걸 그대로 쓰려는게 아니라 제가 하고 싶은 작업에 응용을 해보고 싶은데.. 별로 재밌게 진행되지는 않는것 같네요..

      어디선가 잘 안돌아가는것 같은데..사실 중간중간 검증하면서 하고 든요.. 에러를 내보내는 상황도 아니라서 약간은 애매하네요

      편리하지만 말씀해주신 것들은 염두해 두고 ,, 사용해 봐야겠네요 ㅎㅎ

      감사합니다. :)

잠깐동안 예제를 따라해보면서 해본 느낌은.. 


잘 모르겠지만 엄청 간단합니다. 


먼저 Parallel Python에서 http://www.parallelpython.com/content/view/18/32/ 에서 다운 받아서, pp를 다운받아서, 돌아갈 머신과 마스터 노드에 python setup.py install 하면 끝..


그리고 사용방법은 계산노드(slave)에서 ppserver.py -a(auto discovery) 하면 끝.. 물론 포트를 지정해 준다면 -p 옵션을 사용하면됩니다. 


그런다음 마스터 노드에서 다음과 같은 방법으로 하면됩니다.  (지금 같은경우는 1master node, 1slave node로 구성된 케이스)



import sys,thread
import pp
class myTest:
def __init__(self):
self.value=0
self.lock = thread.allocate_lock()

def result(self, value):
self.lock.acquire()
self.value += value
self.lock.release()


def mysum(n):
result=0
for i in range(1,1000):
result+=i
return result



sum = myTest()

ppserver= ppservers=("*",)

job_server = pp.Server(ppservers=ppservers)
job1 = job_server.submit(mysum,(100,),callback=sum.result)

job_server.print_stats()

job_server.wait()

print "result is "+str(sum.value)

job_server.print_stats()

#ppservers = ("10.0.0.1",)


slave서버를 입력 하는 방법인데 ppserver("*",) 이 방법은 Master노드와 같은 대역에 있을대 저렇게 하면, 자동으로 인식이됨 저 코드의 경우 1master node에서 1 slave노드에게 계산하라고 해서 callback 한 결과를 보여주고 있습니다. 


Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0000 |     0.000000 | local

Time elapsed since server creation 0.00300002098083

1 active tasks, 8 cores


result is 499500

Job execution statistics:

 job count | % of all jobs | job time sum | time per job | job server

         1 |        100.00 |       0.0010 |     0.001000 | local

Time elapsed since server creation 0.00399994850159

0 active tasks, 8 cores



몇가지 궁금한게 생겼는데,, 결국에는 RabiitMq같은 Queue는 필요없을것 같은데,, 다중 노드는 어떻게 명령을 내려야되는거며, 어떻게 중간에 합치는게 따로 있나.  그리고 어짜피 쓰레드는 길(GIL)이 걸릴테니, 멀티프로세싱으로 하고 싶은데,, 이것도 되려나.. (답은 간단하더군요)

결론은 파이썬 신기합니다. . 

추가:: 방금전에 해본결과로는 결국에는 작동하는 로컬밖에 나오지 않았습니다. 
사실 몇가지 실험을 해보았는데, 결론은 다음과 같았다  이번에는 모든 10노드를 전부 기동시키고 
연산작업을... 한 1000개를 걸어보았습니다. 

Job execution statistics:
 job count | % of all jobs | job time sum | time per job | job server
        26 |         16.15 |      28.5401 |     1.097695 | 192.168.1.203:60000
        28 |         17.39 |      26.5884 |     0.949585 | 192.168.1.206:60000
         8 |          4.97 |       5.8869 |     0.735865 | 192.168.1.204:60000
         8 |          4.97 |       4.0038 |     0.500477 | 192.168.1.100:60000
         6 |          3.73 |       4.7484 |     0.791398 | 192.168.1.201:60000
        13 |          8.07 |      13.5061 |     1.038933 | 192.168.1.207:60000
        10 |          6.21 |      10.0583 |     1.005829 | 192.168.1.209:60000
        26 |         16.15 |      77.0360 |     2.962923 | local
        36 |         22.36 |      35.4551 |     0.984865 | 192.168.1.208:60000


결과는 다음과 같은데 10노드가 전부 활동하지는 않습니다... 예상에는 알아서 스케쥴링을 하거나, 현재의 상황을 찍었을때 찰나에는 다른 노드에서 일을하지 않고 있거나 그런것 같습니다. 

이 결과를 찾기 위해 이짓 저짓을 많이 해봤는데, 

어쩌면 이 당연한 사실을 찾기위해 몇시간을 순간 날렸네요.

결국은 파이썬이 신기하네요. 하지만 전 그래도 Java가 좋아요,,

스칼라도 공부해야되는데..





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

몇가지 처리해야할 작업이 있습니다. 


몇 가지 케이스에 대해 계속 테스트를 해보고 있지만. 이걸 Hadoop MapReduce로 처리하는것은 정말 성능이 안나오더군요. 흔히 말한는 반복적인 작업... 이걸 Storm, 또는 Spark를 통해 해결해 보고 싶지만. 현재 사정상 신규아키텍처를 도입하는데 문제가 있어서... 


물론,,, 현재 환경은 HDP(Hortonworks Data Platform)2.3 이기 때문에, 설치하거나 실행하는데, 문제는 아닙니다. Storm 같은경우 Topology를 만들면 되겠지만.. 약간 제가 생각하는 작업에는 불리할것 같고.. Spark쪽은 아직 제가 지식이 부족해서 시간대비 성과가 부족할것 같은 생각 때문입니다.


물론, 전 아직까지는 언어중에 Java가 좋지만, 요즘 왠만한 귀찮은 작업들은 Python으로 하고 있었는데(사실 과거에는 Perl도 배워보고 싶엇지만..) 너무 강력해서 계속 쓰게 되네요. 솔찍히 Java로 10줄 만들걸 파이선으로 3줄이면 표현이 되거든요..


사실 이렇게 하다가 고민이 생겼습니다. 다중 노드(현재 저 같은 경우는 10노드 + 추가 2노드) Produce Consumer 패턴?으로 로 작업을 병렬로 처리해보고 싶었는데, 이걸 프로그램으로 하나하나 만들기도 모하고,, 이러저런 고민이 많았는데,,


파이선이 해결해 주었네요 http://www.parallelpython.com/ 몇가지 고민은 Master Node에서 Slave 노드로 작업을 어떻게 넘겨주느냐 여부인데,, 자체적인 Queue가 있는것인지, 아님 외부 Queue를 이용해야하는지 봐봐야겠네요..


지금 RabbitMQ와 Kafaka를 동시에 보고 있는데,,, 제가 제대로 알고 있다면 Kafakfa는 Consumer에게 전달된 메세지가 어떤것인지에 대한 보장??꼭 UDP같은 성격이라... 의 문제가 있어서... 텍스트들을 보다 보면,, 케이스에 따라서는 RabbitMQ를 추천하시더군요 


일단은 이번포스팅의 목적은 파이선에서 병렬 처리를 쉽게 해주는 방법이 있는데,, 그것은 parallel python 입니다.


파이썬 짱짱,, 

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



환경은 Cetnos 64bit 30GBRAM, MySQL 5.7 버전을 사용하고 있습니다. 

많은 텍스트들을 보면 Hadoop MapReduce에서 반복적인 작업은 지양하라고 되어있는데,


현재, 싱글 머신에서 돌리기에는 양이 너무 많아서(쓰레드를 붙이더라도)... MapReduce에 약간의 꼼수를 써서 포팅해서 사용하고 있습니다. 


현재 10개의 Hadoop Node에서 총 40개의 Task(MapReduce) 걸었습니다.


Map 작업 한번에 총 약 12개 정도의 쿼리를 날립니다.


사실 이 쿼리가 단일 머신에서 할때는 0.55ms 정도 나오는데 10Node로 동시에 Query를 날리니 9s 넘게 걸리더군요.. 물론 제가 쿼리를 엉망으로 만든것은 있습니다.


이러한 문제점을 해결하기 위해, 쿼리에 사용되는 Table 들을 MemoryDB로 전환해서 올려논 상태입니다.

예를들면 create table Memory_1 like Orginal 1, 후 insert into Memory_1 select * from Original 이런식으로요


그런데 중간에 MySQl Memory DB Table is FuLL 에러가 나는것입니다. 옮기는 절차는 Python 으로 스크립트를 만든 상태입니다. 


이때 구글링을 해보니 max_heap_table_size 변경해주라고 하더군요, 저 같은경우는 결론적으로 15GB 정도로 했는데, 중간중간 값을 변경해 가면서, 값을 올린 케이스 입니다. 


SET max_heap_table_size =16106127360 //Bytes





현재 당장은, Workbench 에 나온데로 처리는 하고 있습니다...


아무래도 이번에 바쁜일이 끝나면, NoSQL쪽이나 MySQL, MariaDB 쪽도 좀더 파봐야될것 같습니다. 






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

일단 현재 상황은 MySQL 안에  366996 로우가 들어있는 상황이고, 여기안에 데이터가 있는 상황입니다

여기에 데이터가 있는데, 랭킹을 매겨야 하는 상황입니다. 


select B,T,(select count(*)+1 from 9_Spending_blk where T>t.T) as rank from a_blk as t order by rank asc;


SELECT a.B,
      a.T,
        count(b.T)+1 as rank
FROM  9 a left join 9 b on a.T>b.T and a.B=b.B
group by  a.B,

      a.T

통해서 RANK를 구하려고 했는데, 생각보다 느리게 되더군요.... 
MySQL로 구하는거 포기하고HIVE로 옮긴다음 해봤더니 금방 구할수 있었습니다.

절차는 다음과 같습니다. 

sqoop import --connect jdbc:mysql://127.0.0.1:3306/my --username root --password xer --table ttt  --hive-import –m 1


그다음 Hive에서 


select s.d, s.t, rank() over(ORDER by t asc) as rank from ttt as s


했더니, 14초만에 답을 얻을수 있었습니다.


자동으로 맵리듀스 작업이 걸리는게, 직접만들지 않아도 되서, Hive는 역시 좋네요..

이제 이걸 mysql로 돌려보내야하는데.. 

어떻게 했더라.. sqoop으로 될텐데.. 


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




몇일간 R에 대해서 수업 들으면서 느낀것..


빅데이터 분석으로 R은 만능은 아님(R자체가 데이터를 메모리에 로드해서 사용하기 때문에 만약 컴퓨터가 가진 메모리보다 데이터가 크다면..?) --> 이래서 데이터를 읽어올때 한줄씩 읽어오는 방법도 사용

    --> 때에 따라서는 전처리 단계 필요, 또 R이 오픈소스 이다보니까, R에서 전처리 단계에서 속도가 느려서 

          이를 개선한 Revolution R(현재 7버전) 이라는게 있음,,(유료인가..?..)

    또는 하둡을 이용해서 해결, Rhive, Rhadoop, 등등 

    ++ Java에서 R호출가능, R에서 자바호출가능(?)



그런데 어느정도 전처리된 단계가 있고 R로 처리를 하면 자동적으로 환상적인 Visualization 대박인듯..

(할게 많구나..)


R관련 재미있는 사이트 : http://www.rdatamining.com/







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

'Study > R programming' 카테고리의 다른 글

R 프로그래밍  (0) 2014.08.11
R 프로그래밍  (0) 2014.07.27



사실, 졸업전에 어떻게 기회가 되어서 R프로그래밍을 배우고 있습니다. 전,, 여태까지 R 프로그래밍이 Hadoop MapReduce를 쉽게 하기 위한 방법론? 또는 그런 제품, 관련된거라고 생각했는데, 정말로 잘못알고 있었던거네요. 물론 외국쪽에 자료가 많겠지만. 


국내쪽 커뮤티니 주소 첨부합니다. 

http://r-project.kr/ R 한국 사용자모임

https://www.facebook.com/groups/krstudy/ 페이스북 R 사용자 그룹



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

'Study > R programming' 카테고리의 다른 글

R 프로그래밍  (0) 2014.08.11
R 프로그래밍  (0) 2014.07.27

현재 MapReduce관련 작업을 하고 있습니다.


기본적으로 MapReudce는 Map작업과 Reduce작업으로 이루어져있습니다.


만약 Map 이 1개 , Reduce가 1개 일때는 문제가 안되지만, Map 작업이 2개 이상이 되거나 Reduce작업이 2개 이상되어야 할경우가 문제가 됩니다.


지금 책을 보면서, 여러가지를 공부하고 있는데, 인터넷검색결과 이럴경우, 3가지 해결방법이 제시가 됩니다.


첫번째는 jobconf를 여러개 생성해서, jobclient를 실행해서 하는 방법입니다.

두번째는 책에 가장 많이 나와있는 케이스인데, ChainMapper를 사용해서 여러개의 Map과 Reduce 작업을 하는 방법입니다.


지금 현재 MapRedue를 이용해서 만들고 있는데 저한테는 아직 적합한것 같지 않네요. 제가 잘못찾을수도 있고.. .

마지막 방법은 JobControl 을 이용해서 작업하는 방법입니다 ..


레파토리는 다음과 같습니다. 


               JobConf jobconf = new JobConf(conf);

 ... 해당하는 JOB의 설정

JobConf jobconf2 = new JobConf(conf);

... 해당하는 JOB의 설정


            JobControl jobControl = new JobControl("TestModule");

Job wrapperJob =  new Job(jobconf);

Job wraaperJob2 = new Job(jobconf2);

wraaperJob2.addDependingJob(wrapperJob);

jobControl.addJob(wrapperJob);

jobControl.addJob(wraaperJob2);

   jobControl.run();


먼저 할려는 작업을 jobconf를 통해서 정의 합니다. 저는 여러번의 map작업이 있어야 하기 때문에 2개를 정의한다고 가정합니다. 아직 Reduce나 그이후작업에 대한 정의는 안된상태입니다. 일단 여러개 작업을 이어붙이는 것이 목적이기 때문에


JobControl 을 만들고, Job 클래스를 이용해서 위에서 만든 jobconf를 만든다음 생성합니다.

그다음 저는 첫번째 잡을 wraapperJob으로 만들고 두번째 잡을 wrapperJob2로 만들었습니다.

여기서 WrapperJob2.AddDependingJob 이라는 메소드가 있는데, 의존한다는 의미로 job2가 실행되기 위해서 Job1의 결과값을 받아오겠다? 이정도로 이해하시면 됩니다.

그리고 만든 JobControl.addJob 메소드를 이용해서 잡을 추가하고

JobControl.run을 하시면 됩니다. 


그다음이 문제인데 이렇게 해서 하둡에서 MapReduce작업을 합니다. 웹 모니터링 창에는 작업이 끝났다고 하는데, 계속 제 작업은 돌아갔습니다. (책에도 안나오고 난감...)


역시 구글과 스택오버플로 신께서 도움을 주시네요. 몇몇 인터넷을 찾아보니 , 쓰레드를 생성해서 저 잡이 끝났는지 안끝났는지를 체크해야합니다. 


http://grokbase.com/t/hadoop/common-user/097hs9h2rz/using-jobcontrol-in-hadoop

http://wangzejie.iteye.com/blog/2035640


제가 참고한 페이지는 두 페이지 입니다. 그래서 드라이버 클래스에 쓰레드를 별도로 만들어서 잡의 진행상황을 확인해서 작업을 Jobcontrol을 종료하도록 했습니다. 


                Thread jcThread = new Thread(jobControl);

jcThread.start();

while(true){

if(jobControl.allFinished()){

jobControl.stop();

break;

}

if(jobControl.getFailedJobs().size()>0){

jobControl.stop();

break;

}

}


인터넷을 보시다 보면 return 할때 0,1 하시는건 보실수 있는데, 저는 잘모르겠지만 맵리듀스 드라이버 클래스를 만들때 libtool인가 하는 클래스를 상속받아서 만드시는 분들이 있습니다. 그런 예제들을 보면 0 ,1 리턴 받은 값을 이용해서 제대로 작업이 실행되었는지 확인한것 같습니다. 


아직 학생신분이다보니.. 하다가 생긴 짤막한 지식을 적었습니다.. 혹시 저하고 같은 고민을 하시는 분에게 도움이 되길..


또는 맵리듀스를 하시는 실무자께서 보고계신다면, 제가 잘못알고 있거나, 혹은 도움되는내용이 있으시면 코멘트 해주시면 감사합니다 !!






저작자 표시 비영리 변경 금지
신고
FileSystem fs = FileSystem.get(conf);
Path pt = new Path("/path");
ContentSummary cs = fs.getContentSummary(pt);
long fileCount = cs.getFileCount();

https://stackoverflow.com/questions/20381422/file-count-in-an-hdfs-directory


MapReduce 프로그래밍 중간에, 생성되는 파일의 갯수를 알아야 했는데, 생각보다 쉬운방법이 있네요.


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

http://www.jaso.co.kr/265


일딴 김형준님의 블로그 요걸 보시면 편하게 이해하실수 있습니다. 

일종의 사전지식이랄까.


일단 이글을 보시는 분들은 아마 저보다는 잘하시는 분들이실겁니다. 전 요즘 이것때문에 죽겠거든요

전,, 도저히 저걸 봐도, 하둡 돌아가는게 안보인느것입니다.


일단 제가 필요한 로그은 getsplit 하고 recodereader 이거 맞나요 직접 구현하는 부분이.

일단 메인클레스 내부에서는 sysout 찍어버리면 보이는데, 재내들은 그 안에 있으니 보이지도 않고

그래서 제가 선택한 방법은 log4j 입니다.


http://blog.naver.com/PostView.nhn?blogId=airguy76&logNo=150087115029&categoryNo=3&viewDate=&currentPage=1&listtype=0

산소소년님의 블로그


여기를 참고했습니다.


저는 이번에 log4j 를 처음사용했거든요, 물론 제 블로그의 특성상 제가 이해하고 있지 못한 관점에서 즉 나말고 다른분도 계실꺼라는걸 가정하고,


일단 저는 맵리듀스 프로그래밍을 공부할때 이클립스를 사용하거든요 log4j 설정 파일properties 이걸 어디에 넣냐 이것이 문제였습니다.


웹상에서 보면 src 에 넣어라 bin에 넣어라..


그런데 맵리듀스 프로그래밍을 하면 넣을 필요가 없다가 정답인것 같습니다 일단 제 관점에서는요.


$hadoop_HOME 하둡 폴더 안에 보시면 conf 폴더가 있고 그안에 properties 파일이 있는걸 보실수 있는데 맵리듀스 프로그래밍을 하기위해서 만드는 jar도 여기서 영향을 받네요.


그런데 하둡 특성상 여러 클러스터 안에서 돌아가니까. 로그가 그안에 생길꺼고 로그생성위치가. 아 적어놓는다는걸 이부분은 다음에 적어놓겠는데, 어디냐면 제 기억에, hdfs 폴더 지정하지 않나요 거기 보면 잡관련 로그들 남는부분 아마 뒤져보셨다면 syserr sysout 막 파일들 생기는곳 그 sysout 파일안에 생겼던걸로 기억합니다. 이건 다시한번 확인해봐야겠네요 


그래서 저는 산소소년님의 블로그 따라서 log4j에서 소켓으로 한곳으로 모을수가 있더근요 하둡 conf 안에 properties 설정에서


log4j.rootLogger=${hadoop.root.logger}, EventCounter,socket

log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Threshold=FATAL
log4j.appender.socket.RemoteHost=192.168.0.1
log4j.appender.socket.Port=8081
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} [%p] %t %c{2}: %m%n
설정하고

받는 소켓은 FATAL로 했습니다.(저는 맵리듀스가 어덯게 돌아가고싶은지 보고싶어서요.) 안그러면 잡스러운것이 다 날라노더군요 .

그리고 이걸 받는 서버에서는

log4j.rootLogger=FATAL, stdout

#delete filewrite


#stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} [%p] %t %c{2}: %m%n


이렇게해서 socket_log.properties 라는 설정파일 하나 만들고요 위치는 상관없습니다.
 java -classpath ./log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 8081 socket_log.properties

실행할때는 log4j로 실행하여서 서버를 열고 맵리듀를 돌리면, 소켓으로 로그들이 날라오시는걸 볼수 있습니다.


그런데 아직 제가 이해가 안가는건 getsplit부분은 왜 로그가 안날라오는지 이해가 안가네요 . 제가 하둡구조를 잘못이해하는걸수도 있는데,,, 

혹시 하둡사용하시는 분들중에서 어떻게 하면 맵리듀스로그를 쉽게 볼수 있는지 공유해주신다면 감사하겠습니다.





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

+ Recent posts