BE <java>/hadoop + spark

hadoop study2 (+hive +sqoop +pig)

stand 2023. 12. 13. 16:43

- 개념

hadoop은 분산 체계에서 cluster 개념으로 동작하는 집합을 가지며 각각 단일 서버로 운용되는 특징이 있다 master - slave 구조로 hadoop-v1에서는 spark의 task 구조와 유사하게 jobtracker와 tasktracker로 병렬처리를 보여주며 분산처리와 slot 단위로 map과 reduce로 처리하는 구조를 가졌지만 namenode의 단일 책임을 가지게 되면서 server의 부하와 유능한 처리가 불가능 했다 hadoop-v2에서는 단일 책임을 피하면서 병목현상을 줄이기 위해 yarn이 구현된다 yarn은 cluster의 응용성을 높이기 위해 mapreduce를 수행하는 자원을 확보하고 node 증가에 따른 작업을 확장시키며 lifecycle을 증대시킨 프로그램이다 aplication 계층의 작업이 들어오면 container 단위로 clauster가 작업하며 여러 프로세스를 가져올 수 있게 되며 동적으로 resourcemanager로 관리를 받게 된다 mapreduce는 map으로 작업을 가지고 reduce로 result를 모아 구성하는 단위 모델로 분산 체계 중 병렬구조에 적용한다 데이터를 처리하는 구조에서 분산 체계 중 확장성을 확보한다는 것은 프로세스의 처리 비용을 감소시킬 수 있다

 

mapreduce의 option은 여러 기술에 유사한 특징을 보이고 있기에 정리를 해본다 mapper는 논리 key와 value로 각 값을 mapping한다 shuffle은 값이 유사한 key와 value가 정렬되는데 유사한 기술은 shubffle에 차이가 있다 reducer는 shuffle의 result를 출력하고 단일 directory로 결합을 한다 이는 요소들이 DB에 접근하는 경우 확인되기 위한 구조를 가지기 위해 directory로 변경된다 combiner는 node의 빠른 출력으로 성능을 최적화하는 것으로 중복을 검사하는 기능이다

 

hadoop의 yarn을 실행하면 application manager가 수행하며 resourcemanager 자원 관리를 받는다 실행 중인 프로그램에 영향을 주지 않고 효율적인 관리로 각 slave-node는 namenode에 active과 통신을 하는 환경을 가진다 처리 환경을 지원하는 ecosystem으로 분산환경에서 server가 service를 통해 안정성과 구별을 지원하고 수집과 실시간 처리 등 프로그램을 제어하지만 hive와 같이 hiveQL로 대용량 데이터에 분산 체계를 더해서 조회하고 데이터 구조를 정의하는 warehouse의 면모를 가지고 있다 hadoop은 namenode와 datanode로 mapreduce task를 수행하고 HDFS에 접근하기 위해 container 개념으로 standby + active 병렬구조를 가지면서 hive는 user로부터 질의를 받게 되면 R-DB로 접근하기 위해 metadata로 구분하는 metastore를 가지고 resourcemanager에 자원을 할당받는다 hadoop은 이 경우 master와 datanode 간 packet 통신으로 정보를 공유하고 log규격으로 분산된 데이터는 disk에 대기하다가 호출하는 구조를 가진다 메모리 부족이 발생하는 경우를 피하기위해 HDFS federation이 지원하며 작업을 수행한다

 

- hadoop achitecture <hive>

hadoop은 deamon 프로세스가 각 node의 역할 별로 경로를 구성하고 cashing을 처리한다 hadoop의 비동기 framework는 여러 단계의 map과 reduce에 읽히고 reduce에서 result를 hdfs에 저장하는 방향을 가진다 이 경우 지정된 column과 hash로 파일 별로 나누어서 저장하는 버켓팅을 가지는데 qurery문 한개에 table을 구조한다 따라서 query문의 개수로 이용하면 서버에 부하가 커지기 떄문에 join type을 제공하며 sql로 보내는 경우 outer join과 같은 경우 결합을 만족하지 않는 값은 null로 빠지면서 Left 혹은 Right 로 table의 일치하는 행을 return한다 full outer join이라면 조건을 만족하지 않는 행 모두를 return하면서 어느 한쪽만 있는 곳에 null로 return한다

 

hadoop은 hiveQL로 비정형 데이터를 처리하는 대규모 데이터 처리 구조에서 map과 reduce를 통해 맵핑과 그룹화를 가진다 metadata를 특정 key나 value를 result에 반환하는 구조를 가진다 그 중 join에는 shuffle, map, SMB가 있다 hadoop job으로 이동하고 작업의 결과를 HDFS에 접근하고 hadoop의 mapreduce를 실제 수행하는 driver 공간은 다시 compiler 구조에서 query를 분석하고 optimizer에 최적화를 수행하며 executor에 task 작업으로 들어간다 task는 map과 reduce로 분산하고 각 partition의 result를 합쳐 hdfs에 보내는 구조가 hive인 것이다

 

- hive activate

OS에서 process는 작업이라는 개념으로 있지만 구분하면 foreground와 background 2가지로 분별한다 user와 I/O를 이루거나 요청한 값을 장치 내에서 수행하는 개념을 가지고 있다 hive도 hadoop architecture 로서back에서 실행되는 process를로 terminal에서 server로 요청을 대기받거나 넘기는 구조를 가진다

 

daemon은 hadoop의 cluster에서 실행되는데 hdfs에 접근하는 deamon은 namenode 활성, datanode 활성과 yarn cluster를 수행하는 resourcemanager 활성, container 관리인 nodemanager 로 이뤄져 있다 이 과정은 terminal에서 각 활성을 standby와 active로 각각 전환을 가지고 namenode와 datanode가 나타내는 JPS(host ip, 위치, 환경설정)를 불러온다

 

metadata는 os의 file system처럼 block 구조로 가지고 hdfs가 host의 disk 내 file(block)을 분산시킨 것이다 논리적 위치로 변경되므로 namenode는 memory에 접근할수 있도록 권한이 부여되어야 하며 file또한 접근권한이 열려있어야 한다 또한 namenode는 datanode상태를 확인하는 editLog를 보고받는데 네트워크 통신을 위해서 namenode server가 열려있어야 하며 block들로 분산된 각 host들은 주기적으로 FSImage를 반영해서 namenode resource에 적재한다 이 경우 FSImage와 editLog를 합치고 datanode block report를 통해 disk로 올려 관리한다 metadata가 datanode와 server 간 통신을 완료했다면 논리 세계로 hdfs에 접근하고 data는 올라가게 된다

< 하둡 데몬(namenode, datanode)의 기동과정과 메커니즘 이해 (tistory.com)>

 

server의 service  down이 일어나면 namenode의 failover로 인지한다 해당 상황은 신뢰성을 제공하는 zookeeper 프로그램이 session을 받지 못하는 상태이고 ZKFC를 발생시킨다 hdfs와 namenode의 호한 가능을 알리고 session을 보내면서  실패지점 위치를 알리는 새로운 lock 상태를 가진다 editlog가 namespace에 반영되면서 standby 상태의 통신을 다시 node의 정보를 생성하고 active로 변환한다

 

FSImage가 host의 block 정보를 가지고 metadata의 log를 기록하는 In-Memory구조를 요구하는데 edit log의 daemon 활성화는 JournalNode에서 수행한다 해당 node에서 active-standbby를 관리하며 editlog를 기록한다 standby와 active는 기fhr되는 정보를 통해 zookeeper의 새로운 lock위치를 active 및 checkpoint로 지정하고 editlog를 갱신한다

 

- mapreduce tuning

mapreduce는 task로 분산되어 처리를 수행하고 split 단위로 병렬 처리 작업을 수행한다 map은 hadoop job의 설정에 따라 수행하고 동일한 node에서 block처리가 hdfs의 기본크기(128mb)라면 disk로 올리면서 빠른 수행을 이끌수 있다  map의 결과처리는 reduce에서 작업하고 partition을 생성하고 key를 가지고 분배한다

 

처리단계를 나눠보면 input -> map -> combiner -> partitioner -> shuffle -> (sort) -> reduce -> out 구조이다 파일의 문자를 세는 programe 이라 가정하자 파일을 hadoop 환경에서 옮긴다면 jar파일로 수행시키기 위해 hadoop jar Mapreduce.jar ~ 로 수행한다 수행했다면 파일은 metadata로 바꿔지기 위해 parameter로 input하며 FileInputFormat.addInputPath() 로 작업한다 작업은 map으로 넘어가고 key와 value로 분할되어 각각의 data로 개수를 확인한다 value가 되는 값은 line으로 넘어가고 매개변수로 (Object key, Text value, Contect context) 를 예외처리로 넘기면 combiner가 다음 수행을 이어간다 수행위치는 네트워크를 이용하지 않아 resource의 부하는 줄어든다

 

// cache를 이용하는 방법

 

메모리 설정은 mapred-site.xml에서 변경하며 성능의 최적화를 이끌어내기 위해 다음과 같은 옵션을 선택한다

 - yarn.app.mapreduce.am.resource.mb : mapreduce를 수행하는 master node에서 memory 자원을 설정한다

 - yarn.app.mapreduce.am.command-opts : mapreduce를 수행하는 master node의 java heap memory 옵션

 - mapreduce.map.memory.mb : mapper에 할당된 메모리 양을 지정

 - mapreduce.map.java.opts : mapper 작업의 JVM 옵션을 설정, mapper의 key-value 구성으로 효율성을 가짐

 - mapreduce.map.cpu.vcores : mapper core 수를 지정, core는 cluster 할당에 있어 동시에 실행되는 수 증가

 - mapreduce.reduce.memory.mb : reducer에 할당된 memory 양을 지정

 - mapreduce.reduce.java.opts : reducer의 JVM 옵션 설정, reducer에 정렬과 그룹화를 가지고 결과를 hdfs에 접근한다

 - mapreduce.reduce.cpu.vcores : reducer coer 수는 병렬작업에서 overhead를 관리, resource 처리속도, 정의한 함수의       최적화를 고려한다

 - mapred.child.java.opts : map과 reduce 작업은 "자식"으로 알림, heap 크기를 설정하고 map.java / reduce.java 를 오버       라이드 설정으로 한다

mapreduce의 작업은 각각 container에서 실행하며 yarn에 제어된다 key-value 값이 병렬로 입출력을 가지고 병렬로 result를 가지는 reduce는 master node에 할당된 datanode의 크기에서 분산 처리를 수행하는 것이다

 

- *mapreduce 메모리 설정

map tuning은 파일의 개수만 줄어들어도 효율성이 증가한다 map으로 변경되는 buffer의 제한이나 reducer의 정렬 선택 등 amap 작업에서 최적화를 가지며 map task의 성능을 높인다 cluster의 resource는 local의 resource 가용성을 고려하고 map 정렬이나 reduce 정렬 구조를 고려하는데 sort는 병합하여 출력하는데 buffer stream이 낮으면 최적으로 끝낼수 있으며 이런 경우 높은 sort 정책을 가지는 것이다 mapreduce.task.io.sort.mb의 적정 수치는 200으로 알려져 있다

 

 combiner가 작동하면 map과 reduce의 작업에서 network 전송량을 효율적인 처리를 위해 묶어서 보내는 작업을 가진다 각 출력은 mapreduce.map.output.compress과 mapreduce.map.output.compress.codec를 통해 출력 속도를 높인다

 

- sqoop // hdfs 관리

hdfs를 설정하기 위해서는 $HADOOP_HOME/etc 에서 hdfs-site.xml에 들어간다 xml파일의 특성상 editor를 이용해 접근권한을 파악하게 된다 editor는 nano, gediit, vim 등이 있으며 본인은 gedit을 주로 이용했다 nano는 일반적인 키보드로 이동하지 못하고 정해진 명령에 따라 움직이는 특징으로 개발자 입장에선 매우 번거로운 작업을 가진다 경우에 따라서는 nano를 요구하지 않아 제거하고 linux 를 운영하는 곳도 존재한다

 

sqoop은 hdfs의 table data에 접근하는 tool로서 hadoop 관리와 같이 이용한다 sqoop은 table을 가져오는 import와 table을 넣는 export 기능으로 hadoop에서 이용되며 관계형DB로 table을 생성하기 떄문에 JDBC driver로 metadata를 이용한다 관계형 DB에 접속하기 위해 sqoop은 DB query로 접근하고 map task가 hdfs에 접근한다 sqoop의 체계도 분산구조로 cllient -server로 구성하고 client에서 CLI를 통해 server에 요청을 보내면 sqoop은 cluster 전체에게 요청을 보내는 api를 이용한다 map task의 작업은 그대로 query에 이용하고 reduce task에 보내지 않으므로 JDBC에 query를 통해 조회해야 한다 sqoop은 추가적으로 connector를 설치해서 병행작업을 해야하고 특정 테이블을 수집하기 위해 쿼리문에서 조건문이 매우 길어지는 경우가 다반수이다

 

'BE <java> > hadoop + spark' 카테고리의 다른 글

pyspark 입문 + 정리  (0) 2023.12.11
hadoop(ubuntu) study  (0) 2023.12.09