검색결과 리스트
Bigdata에 해당되는 글 4건
- 2014.03.27 Coudera 5 beta 2 설치 영상
- 2013.10.11 YCSB를 이용한 NoSQL BMT
- 2013.07.24 Hadoop 데이터노드 장애와 데이터 손실
- 2013.06.26 Hadoop YARN 짧은 설명
글
Coudera 5 beta 2 설치 영상
Coudera 5 beta 2 설치 영상을 준비해봤습니다.
아무리 하둡 전문가라해도 클라우데라를 처음 설치하시는 분은 한두번은 재 설치하게되고 OS 구성이 꼬이게 되는 경험을 해보셨을 것입니다.
타르볼 수동 설치와는 달리 클라우데라는 실수를하거나 전단계로 돌아가는게 안되, 한번 잘못 진행하면 처음부터 다시 시작해야하기 때문입니다.
비록 어려운 과정은 아니지만 클라우데라 설치를 한방에 완료하기 위해 동영상을 준비했습니다.
글
YCSB를 이용한 NoSQL BMT
보통 NoSQL을 처음 접하고 서비스에 사용될 오픈소스 NoSQL을 찾다보면 가장 먼저 하는 질문이 어느 제품을 써야하나? 이다. 간단히 말하면 빅데이터 개발자는 모든 schema-less Bigdata DB 제품을 통틀어서 NoSQL이라 부르지만 사실상 모든 NoSQL 제품마다 사용되는 용도와 적합한 환경이 제각기 다르다. 그렇기 때문에 각 NoSQL의 용도와 접근 패턴별 성능, 확장성, 안정성 등을 요구사항에 맞춰 선택해야 한다.
상용 솔루션을 사용할 경우 각 제품 세일즈 대표나 컨설턴트가 각기 제품의 특성을 잘 설명해주겠지만, 오픈소스의 경우 그렇지 않다. 온라인 BMT 자료도 오래된 것이 많다. 그렇기에 본인이 직접 NoSQL 성능 테스트를 쿼리 유형 및 패턴별 성능 테스트를 할 수 있게하는 오픈소스 툴이 있는데 YCSB (Yahoo Cloud Service Benchmark: https://github.com/brianfrankcooper/YCSB)이라 한다.
NoSQL 테스트 프레임은 이미 brianfrankcooper라는 사용자가 이미 3년전에 개발하였고 정말 다양한 사용자가 각기 시스템과 NoSQL에 맞춰 참여하고 있다. 별도의 코드리뷰 및 CI 없이 진행되는 오픈소스라서 테스트 프레임과 초기에 제공된 NoSQL 모듈 (HBase, Cassandra, MongoDB, Redis)를 제외하면 코드가 약간 중구난방이다. 코드 라인 수에 비해 포킹된 수는 300개 가량이다. 각 회사와 개발자의 특화된 시스템과 NoSQL에 맞추어 테스트 하다 보니 포킹 수가 많아진 듯하다. 여러분도 신규 버전이나 특화된 NoSQL을 테스트하려면 최소한의 코드 수정 또는 모듈 개발은 필수적으로 보인다.
YCSB 내부 아키텍처를 설명하기 전에 짚고 넘어가야 할점은 온라인 커뮤니티에 올라온 대부분의 NoSQL 성능 비교 자료를 믿으면 안된다. 자료가 사실적이지 못하다는 말이 아니고 그 자료에서 결론지은 성능이 여러분이 사용할 시스템에서도 똑같이 나올 확률은 비교적 적다. 비슷하게라도 나오면 다행이다. 한명의 시스템 디자이너가 로우레벨부터 사용자 인터페이스까지 모두 동일하게 구성하지 않는 이상 작은 설정차이 하나에도 시스템 성능은 매우 크게 급변할 수 있다. YCSB는 그런점에서 NoSQL 커뮤니티에 제공할 객관적인 성능비교 툴로 사용되기 보다 현재 손앞에 놓여진 시스템 클러스터와 사용자 엑세스 패턴에 가장 적합하고 빠른 성능을 내는 NoSQL을 주관적으로 선택하고자 사용되는 Decision-making 툴에 가깝다. 그러므로 야후에서 발표한 YCSB 성능비교 자료(http://www.brianfrankcooper.net/pubs/ycsb-v4.pdf)나 앞으로 본 블로그에 올라오는 성능비교 자료는 참고자료로만 사용하면 좋겠다.
각 시스템 별로 성능 변화에 영향을 줄 수 있는 영역은 다음과 같다.
- 하드웨어 성능 - 동일 클러스터에 YCSB 테스트를 진행하여 하드웨어 성능 차를 최소화 할 수 있다.
- 네트워크 성능 및 구조 - 네트워크 의존도가 높은 NoSQL과 그렇지 않은 NoSQL을 비교할 경우 네트워크 성능은 큰 변화를 줄 수 있다.
- NoSQL 아키텍쳐 또는 소프트웨어 버전 - NoSQL 코어와 아키텍쳐에 따라 사용되는 용도가 결정되는데 이 부분이 YCSB를 사용하여 확실한 성능을 확인하고자 하는 부분이다.
- Consistency
- Read 최적화 or Write 최적화
- Availability (데이터 이중화 및 복제)
- 캐쉬 기술 적용
- B+tree, B-tree, Log-structured Merge Tree 등
- NoSQL 설정 및 튜닝 노하우 - NoSQL 시스템 운영자의 숙련도 및 튜닝 노하우 깊이에 따라 결정되는 부분이라 YCSB 결과를 크게 결정하는 부분이며 NoSQL 성능 비교에 가장 큰 논점이 되는 부분이다.
- 데이터 스키마 및 키 디자인 - 스키마 디자인에 따라 NoSQL 성능 역시 크게 변할 수 있다. 흔히 Row Key 디자인과 Column Key 디자인을 일컫는데, 데이터 쿼리 요구사항에 맞추어 Workload Generator를 적당히 구성하면 된다.
- 사용자 엑세스 패턴 - 스키마 디자인이랑은 다른 영역이다. 스키마 디자인은 어떻게 데이터를 DB상에 보관하느냐이고 엑세스 패턴은 데이터를 어떤 패턴으로 읽느냐는 것이다.
- Read와 Write 비중
- 랜덤 및 시퀀셜 쓰기
- 배치 및 실시간
- 최신 데이터 및 아카이브 데이터 쿼리
등 다양한 패턴이 있지만 이도 스키마 디자인과 마찬가지로 요구사항에 지정되어 있으므로 비교 NoSQL 양측에 동일하게 Workload 를 구성하면 된다.
YCSB
Yahoo! 에서 사용되는 PNUTS와 최근 급격히 늘어나는 타 NoSQL 솔수션을 비교하기 위해 자체 오픈소스 NoSQL 벤치마크 테스트 툴을 개발하였다
YCSB는 크게 다음과 같이 두 부분으로 나누어진다
- YCSB 클라이언트 – 워크로드를 생성하고 NoSQL DB Connector 역할을 한다
- 워크로드 패키지 (Property file 포맷) – 워크로드를 생성하는데 필요한 설정 값 리스트
Cloud DB는 테스트 대상인 NoSQL을 말하는데 현재 다음과 같은 제품을 모듈 형태로 지원한다.
- PNUTS
- BigTable
- HBase
- Hypertable
- Azure
- Cassandra
- CouchDB
- Voldemort
- MongoDb
- Infinispan
- Dynomite
- Redis
- GemFire
- GigaSpaces XAP
- DynamoDB
기본 제공되는 제품 버전은 최상위 pom 파일을 보면 알수 있는데, 대부분 조금씩 시대에 뒤떨어진 버전일 것이다. 최신 버전을 테스트 하는 경우면 pom 파일을 수정하여 버전을 바꾸고 컴파일 하면 되고 (다소의 코드 수정 필요), 신규 NoSQL 모듈을 추가하고 싶으면 https://github.com/brianfrankcooper/YCSB/wiki/Adding-a-Database 위키를 참조하면 된다. CREATE, READ, SCAN, UPDATE 등의 DB 인터페이스 레이어만 작성하면 간단히 추가할 수 있다. 다른 개발자에 의해 포킹된 버전을 찾는것도 한 방법이긴 하지만 메인프레임에 없는 코드면 새로 작성하는게 더 빠를듯 하다.
테스트
Workload
성능 테스트는 사용자 접근 패턴에 맞는 워크로드를 사용하여 YCSB 내부적으로 테스트를 진행한다. 워크로드는 다음과 같이 기본 제공되는 워크로드와 사용자 정의 워크로드를 사용할 수 있다.
(다음 워크로드는 YCSB 프로젝트 홈 아래 workloads 디렉토리에서 확인 가능)
Workload A: Update Heavy (read 50%, update 50%)
실무 예) 최근의 액션을 저장하는 세션 정보 어플리케이션
Workload B: Read Heavy (read 95%, update 5%)
실무 예) 포토 태그 – 태그는 한번만 작성하고 주로 읽기 작업이 실행된다
Workload C: Read Only (read 100%)
실무 예) 사용자 프로파일 캐시 – 외부 저장소에 저장되어 있는 사용자 정보를 조회
Workload D: Read Latest Record (read 95%, insert 5%)
레코드 선택 알고리즘: Zipfian
실무 예) SNS 사용자 상태 업데이트 – 가장 최근의 상태와 뉴스만이 중요함
Workload E: Short Range Scan (read 95%, insert 5%)
각 작업마다 100개 내외의 레코드 영역을 한번에 쿼리 한다
실무 예) 쓰레드 형식의 게시판 – 각 조회마다 포스트의 쓰레드를 스캔 한다
Workload F: read-modify-write
읽기, 수정, 쓰기의 단계를 순서대로 수행
실무 예) 사용자 데이터베이스 – 각 사용자 활동마다 사용자 레코드를 읽고 업데이트 한다
DB 접근 패턴은 매우 다양하므로 사용자 요구사항에 맞춰서 워크로드를 구성하면 된다.
아래부터는 YCSB에서 제공하는 프레임은 아니고 사용자가 위에서 설명한 YCSB 툴을 이용하여 직접 테스트 해볼 수 있는 항목이다.
Tier1 - Performance
동일한 하드웨어 구성에서 데이터 로드에 변화를 주어 성능을 측정하는 테스트이다. 사용자가 목표 쓰루풋을 지정하고 위의 워크로드를 실행하면 평균 응답시간(latency)을 받을 수 있다. 쓰루풋을 높일 수록 응답시간은 길어지는데 특정 쓰루풋에서 응답시간이 매우 높아지거나 응답이 안오는 지수가 있다. 이 지수를 해당 시스템위에서의 NoSQL 최대 쓰루풋이라 보면 된다.
Tier2 - Scaling
Scale Up - 클러스터의 워커 노드가 증가함에 따른 성능 차이 테스트이다. 테스트 방식은 데이터를 미리 클러스터에 로드 하고 10분정도 기다린다 (데이터가 클러스터에 분산되고 안정화되는 시간). 그 다음엔 원하는 워크로드와 쓰르풋 (Tier1에서 찾은 최대 쓰르)을 지정하여 성능을 테스트한다. 테스트를 종료하고 노드를 추가한다음 같은 테스트를 다시 진행하여 응답속도에 대한 변화를 찾아낸다. 노드를 증가하면서 테스트를 반복한다.
테스트 중간중간에 쓰루풋 목표치를 변경하여 노드 증가에 대한 쓰루풋 변화도 테스트 해볼 수 있다.
Elastic Speedup - 작동중인 클러스터에 워커 노드를 추가했을 경우 성능 측정을 위한 테스트이다. 위 Scale Up 테스트와 혼돈 될 수 있는데 Elastic Speedup은 응답속도 성능을 측정한다기 보다, 노드가 추가되는 순간 클러스터에 가해지는 성능 임팩트와 클러스터가 안정화되는 시간을 측정해볼 수 있다. 예를 들어 카산드라의 경우 노드가 추가되는 경우 리전 별 키 영역을 다시 계산하고 데이터 발란싱 또는 이동이 집약적으로 발생한다. 이러한 노드 추가에 대한 클러스터 성능 영향도를 측정해 볼 수 있다.
Tier3 - Availability
야후에서는 Availability라고 부르는데 사실은 Failure Test이다. 위의 Scale Up과 Elastic Speedup 과 비슷한 테스트이지만 노드를 증가 하는 대신 클러스터에 장애를 발생한 후 클러스터의 성능을 측정하는 테스트이다. 테스트 가능 장애 유형에는 호스트 셧다운, 디스크 장애, 네트워크 장애 등이 있다. 대부분의 NoSQL의 경우 CAP 정의 Partition Tolerance를 적용하므로 특정 노드 접근이 안되어도 클러스터는 정상 작동할 것이다. 대신 이러한 장애 발생시 성능에는 필시 변화가 발생하고 데이터 손실에 따른 안정성 변화가 있을 것인데 이를 측정하기 위한 테스트이다.
Tier4 - Replication
각 클러스터에 설정한 복제계수(Replication Factor) 변화에 따라 필시 성능 변화도 있을 것이다. 복제계수에 변화를 주며 테스트할 수 있는 영역은 Performance, Availability, Consistency, Locality (server, rack, cluster, datacenter..)이다. 눈으로만 외우지 말고 각 항목이 무엇을 의미하는지 생각해 보자.
야후에서 발표한 벤치마크 테스트의 경우 Tier3와 Tier4는 테스트에 따른 장애 유형과 테스트 방식이 복잡하여 향후과제로만 남겨뒀다. 내가 보기에도 왠만한 NoSQL 성능 측정은 Tier1과 Tier2로도 충분해 보인다.
참고자료
https://github.com/brianfrankcooper/YCSB
Yahoo! Cloud Serving Benchmark. Brian F. Cooper. Yahoo! Research
Benchmarking Cloud Serving Systems with YCSB. Brian F. Cooper. Yahoo! Research
글
Hadoop 데이터노드 장애와 데이터 손실
하둡을 공부하고 운영해보신 분이라면 데이터를 기본 3개의 64MB 복제본으로 나누어 분산 저장한다는 것을 잘 알고계실 겁니다. 이로인해 호스트나 디스크 장애가 발생할때도 하둡은 나머지 2개의 복제본으로 데이터 가용성을 제공하고 부족한 복제본은 다른 호스트에 복사합니다. 그렇기에 호스트나 디스크 장애 쯤이야 자동으로 극복하고 하둡을 사용할 경우 100% 서비스 가동률을 장담할 것이라 안심합니다.
여기까진 이론적인 얘기고 실제 50대 이상의 클러스터를 구성하고 TB 단위의 데이터를 보관하다보면 아주 사소한 하둡 설정 실수에도 클러스터는 예민하게 반응합니다. 운영을 하다보면 상당히 자주 볼수 있는 장애 유형은 디스크 장애입니다. 아무래도 TB단위의 데이터를 매 시간 처리하다보니 일반적인 애플리케이션 보다는 디스크 및 호스트 장애율이 높습니다. 50대 규모의 하둡 클러스터를 운영하다보니 근래엔 1주일에 한번꼴로 디스크 장애가 발생합니다. 호스트들도 점점 늙어가나 봅니다 -.- 200~300대 이상의 클러스터에선 매일같이 디스크 장애가 난다해도 무난하겠죠? 이때 hdfs-site.xml의 dfs.datanode.failed.volumes.tolerated 설정이 제대로 안되어있으면 디스크 하나가 고장나도 데이터노드가 셧다운됩니다.
본론으로 가서 하둡 운영을 하다보면 디스크 원인 말고도 한두개의 데이터노드가 죽는 경우가 많은데, 과연 이 클러스터는 몇 대의 데이터노드 장애까지 허용할 수 있는지 몇 대의 데이터노드가 디커미션 없이 죽었을때 블록이 손실되는 현상이 발생할까? 라는 호기심이 듭니다. 그래서 간단하게 각 호스트 장애 발생시 3개의 복제본을 손실할 확률을 계산하는 방법을 설명하겠습니다.
37대의 데이터노드가 있고 각 블록은 3대의 복제본을 관리한다고 가정합시다. 이중 5대의 데이터노드 장애 발생시 특정 블록이 모든 복제본을 손실할 확률은 무엇일까요?
바꿔 말하면, 50개의 구슬이 있고 그 안엔 3개의 파란구슬과 47개의 빨간구슬이 있습니다. 이중 5개의 구슬을 무작위로 뽑았을때 3개의 파란구슬이 뽑힐 확률은 무엇일까요? 확률 수업이 새록새록할 겁니다.
P(A|B) = P(5개의 장애노드가 3개의 복제본을 포함 | 37대의 노드중 3대의 복제본 노드 선택)
= (5C3)/(37C3) = 10 * (3/37 * 2/36 * 1/35) = 10 / 7770 = 0.0013
즉 0.13 % 의 확률을 가집니다.
10대의 노드가 장애가 발생한다하면 1.5%가 되고, 37대 장애가 생기면 100%겠죠?
데이터노드 장애가 늘어날 수록 확률이 높아지는걸 볼 수 있습니다. 눈으로 보기엔 블록 손실 확률이 매우 적어보입니다. 하지만 우리는 블록 한개를 운영하려고 하둡을 도입하지 않습니다. 다음 문제를 풀어봅시다.
위의 질문에서 클러스터에 100TB의 데이터가 64MB의 블록으로 쪼개어 저장되어 있었다면 모든 복제본을 손실한 블록(missing block)의 수는 몇개일까요?
100TB를 64MB블록으로 나누면 1562500개의 블록이 존재합니다. 위에서 계산한 확률을 곱하면 0.0013 * 1562500 = 2031
2031개의 블록이 손실됩니다. 손실된 블록과 연관된 파일은 접근이 불가능해진단 말이며 금융 시스템 같은 경우 매우 치명적인 현상입니다.
이러한 계산을 통해 본인의 클러스터가 몇대의 데이터노드 장애를 허용할 수 있는지 알 수 있고 미리 데이터 장애에 대비할 수 있습니다.
글
Hadoop YARN 짧은 설명
얀(Yarn)을 짧게 소개하자면, 얀은 하둡0.23.0 버전부터 맵리듀스의 차세대 기술로 새로 개발되어 하둡2.0-alpha로 승계되어진 프로젝트입니다. 물론 기존 맵리듀스의 단점을 해소하고 하둡 사용자의 니즈를 마추고자 개발됬죠.
일단 가장 큰 변화로는 얀 자체로 맵리듀스를 구동할 수 있고, 추가로 다른 분산처리 프레임워크 (Giraph, Storm, HBase 등)을 사용자의 인터페이스 개발만으로 구동 가능하게됐습니다. 참고로 얀에서 작동하는 맵리듀스를 MRv2라고 부릅니다.
기술적으로는 기존 맵리듀스의 마스터인 잡트래커가 리소스관리, 잡 스캐줄링, 잡 모니터링을 하는데 비해 얀의 마스터인 ResourceManager(RM)은 두개의 서비스로 분리되고 (클러스터 리소스를 관리하는 Scheduler와 ApplicationMaster(AM)를 관리하는 ApplicationsManager(AsM)), AM은 하나의 노드에 RM에 의해 가동되어 잡의 라이프사이클과 모니터링을 담당합니다. 이 모델은 기존 5000개 정도의 노드 제한이 있는 잡트래커 방식에 비해 발전된 확장성을 가지고 각 애플리케이션 별 독립성도 부여합니다.
참고자료:
http://blog.cloudera.com/blog/2012/10/mr2-and-yarn-briefly-explained/
http://blog.cloudera.com/blog/2012/02/mapreduce-2-0-in-hadoop-0-23/
얀이 상승세를 탈 시기가 되었습니다. 일단 하둡0.23 2011년말 출시된지도 꽤 됐고, 이제 곧 하둡 2.1 베타버전이 출시됩니다. 또한 최근 야후에서 yarn-storm 오픈소스를 공개해 얀의 배치성 작업과 스톰의 실시간성 작업을 같은 클러스터에 구성할 수 있게 되어 화두가 되고 있습니다.
http://developer.yahoo.com/blogs/ydn/storm-yarn-released-open-source-143745133.html
전망되는 얀의 최고 상승세는 물론 얀의 정식버전이 출시될때입니다. 아직 하둡2.0이 알파 버전이라 운영클러스터 적용을 꺼려하고 있는데 베타버전을 거쳐 정식버전이 출시되면 큰 인기를 얻을 전망입니다.
하둡과 맵리듀스도 배우기 바쁜 이 시점에서 아직 사용자층에서 얀에 큰 관심은 없지만 금년 말부터 빅데이타 트랜드가 될것으로 보이고 하둡2.0에서 채택한만큼 피해갈 수 없는 기술로 보입니다.