Hive와 Amazon Web Services
Hive와 Amazon Web Services (HiveAws)
배경 (Background)
이 문서는 Amazon Web Services(AWS) - 특히 S3, EC2, Elastic Map-Reduce - 에서 Hive를 활용하는 다양한 방법을 살펴봐요.
Hadoop은 EC2와 S3에서 실행되어 온 오랜 전통이 있어요. 아래 링크들은 필수로 읽어야 할 문서들입니다.
- Hadoop and S3
- Amazon and EC2
두 번째 문서에는 EC2와 S3를 시작하는 방법에 대한 안내도 있어요. S3가 처음인 사람에게는 아래 "S3 for n00bs" 섹션에 도움이 되는 메모가 몇 가지 있습니다. 아래 나머지 문서는 EC2에서 hadoop 클러스터를 시작하고, 파일을 S3로/에서 복사하고, 간단한 Hadoop 작업을 실행할 수 있다고 가정해요.
출처: 문서
본문
Hive와 AWS 소개 (Introduction to Hive and AWS)
AWS에서 Hive를 실행할 때 고려해야 할 세 가지 별개의 질문이 있어요.
- Hive CLI를 어디에서 실행하고 metastore db(테이블과 스키마 정의를 담고 있음)를 어디에 저장할 것인가
- 기존 데이터 세트(잠재적으로 이미 S3에 있는)에 대해 Hive 테이블을 어떻게 정의할 것인가
- (모두 하나 이상의 map-reduce 프로그램으로 실행되는) Hive 쿼리를 EC2에서 실행 중인 Hadoop 클러스터에 어떻게 전달할 것인가
여기서 관련된 선택지들을 안내하고, 자세한 설정·구성 지침이 포함된 실용적인 사례 연구(case studies)를 보여줄게요.
Hive CLI 실행 (Running the Hive CLI)
CLI는 Hive 쿼리를 받아서 플랜(보통이지만 항상은 아닌 map-reduce 작업)으로 컴파일한 뒤 Hadoop 클러스터에 제출해요. 이를 위해 Hadoop 라이브러리에 의존하지만, 그 외에는 Hadoop 클러스터 자체와 상대적으로 독립적입니다. 따라서 CLI는 Hive 배포판, Hadoop 배포판, Java 런타임 엔진이 있는 모든 노드에서 실행할 수 있어요. 접속 가능한 호환 Hadoop 클러스터(사용 중인 Hive가 쓰는 Hadoop 라이브러리 버전과 일치하는)에 작업을 제출할 수 있어요. Hive CLI는 또한 테이블 메타데이터에 접근해야 합니다. 기본적으로 Hive는 임베디드 Derby 데이터베이스를 통해 이를 로컬 파일 시스템의 metastore_db라는 폴더에 영속화해요 (단, 상태는 원격 mysql 인스턴스를 포함한 어떤 데이터베이스에도 저장할 수 있습니다).
Hive CLI를 실행할 위치에는 두 가지 선택지가 있어요.
- EC2 내부에서 Hive CLI 실행: Hadoop 마스터 노드가 당연한 선택지예요. 이 접근에는 몇 가지 문제가 있어요.
- 서로 다른 버전의 Hive와 Hadoop 배포판을 묶은 포괄적인 AMI가 부족해요 (그리고 그런 조합이 많아서 만들기도 어렵습니다). Cloudera가 Hadoop과 함께 Hive를 묶은 일부 AMI를 제공하지만, Hive·Hadoop 버전 선택은 제한될 수 있어요.
- 필요한 map-reduce 스크립트를 마스터/Hive 노드에 복사해야 할 수도 있어요.
- 기본 Derby 데이터베이스를 사용하면, 하나의 hadoop 클러스터 수명을 넘어서는 상태 영속화를 고려해야 해요. S3가 명백한 선택지지만, Hadoop 클러스터를 시작·종료할 때 Hive 메타데이터를 복원하고 백업해야 합니다.
- EC2 외부에서 원격으로 Hive CLI 실행: 이 경우 사용자는 개인 워크스테이션에 Hive 배포판을 설치해요. 이 선택지의 핵심은 Hadoop 클러스터에 연결하는 것 - 작업 제출과 HDFS 파일 읽기/쓰기 둘 다 - 입니다. "원격 머신에서 작업 실행" 섹션에서 이를 수행하는 방법을 자세히 설명합니다. Case Study 1이 더 자세히 다룹니다. 이 선택지는 위에서 언급한 문제들을 해결해 줘요.
- 표준 Hadoop AMI를 사용할 수 있어요. 사용자는 워크스테이션에서 어떤 버전의 Hive든 실행하고, EC2에서 원하는 Hadoop 버전의 클러스터를 시작한 뒤 쿼리를 실행할 수 있습니다.
- Map-reduce 스크립트는 작업 제출 시 Hive가 Hadoop의 분산 캐시에 자동으로 푸시하므로 Hadoop 머신에 복사할 필요가 없어요.
- Hive 메타데이터를 로컬 디스크에 편안하게 저장할 수 있어요.
단, 선택지 2의 단점 하나는 각 map-reduce 작업마다 jar 파일이 Hadoop 클러스터로 복사된다는 점이에요. 이는 작업 제출 지연을 높이고 AWS 네트워크 전송 비용도 발생시킬 수 있습니다. 선택지 1은 안정적인 Hadoop·Hive(그리고 잠재적으로 외부 라이브러리) 구성을 확립하고 그와 함께 새 AMI를 만들 수 있는 고급 사용자에게 적합해 보여요.
Hive 테이블에 데이터 적재 (Loading Data into Hive Tables)
Hadoop/EC2 환경의 주요 저장소 선택지들을 살펴보는 것이 유용해요.
- S3는 장기 데이터를 저장하기에 훌륭한 곳이에요. S3를 사용하는 데는 몇 가지 선택지가 있어요.
- S3 for n00bs 섹션에 설명된 대로
aws,s3curl같은 도구를 사용해 파일을 S3에 파일로 저장할 수 있어요. 이 방식은 S3의 파일 크기 5GB 제한이 있습니다. 하지만 이런 방식으로 S3에 데이터를 복사/복제하는 데 도움을 주는 도구가 수십 개나 있을 것이라는 게 좋은 점이에요. Hadoop은 이렇게 저장된 파일을 S3N 파일 시스템으로 읽고 쓸 수 있습니다. - 대안으로 Hadoop은 S3를 백킹 스토어로 사용하는 블록 기반 파일 시스템을 제공해요. 이 방식은 5GB 최대 파일 크기 제한이 없습니다. 다만 읽기/쓰기에 Hadoop 유틸리티와 라이브러리를 사용해야 해요.
- S3 for n00bs 섹션에 설명된 대로
- Hadoop 클러스터 머신의 로컬 드라이브에 있는 HDFS 인스턴스: 수명이 Hadoop 인스턴스의 수명으로 제한돼서 장기 데이터에는 부적합해요. 하지만 훨씬 빠르게 접근할 수 있는 데이터를 제공하므로 중간(intermediate)/tmp 데이터에 좋은 선택입니다.
이런 요소들을 고려하면 Hive 테이블 측면에서 다음이 합리적이에요.
- 장기 보관 테이블에는 S3 기반 저장 메커니즘 사용
- 중간 데이터와 tmp 테이블에는 HDFS 사용
Case Study 1은 S3N 파일 시스템을 사용해 이런 구성을 달성하는 방법을 보여줘요.
사용자가 개인 워크스테이션에서 Hive CLI를 실행한다면, load data local 명령을 dfs 명령의 편리한 대안으로 사용해 워크스테이션에서 접근 가능한 로컬 파일 시스템의 데이터를 HDFS나 S3 위에 정의된 테이블로 복사할 수도 있어요.
Hadoop 클러스터에 작업 제출 (Submitting jobs to a Hadoop cluster)
이것은 특히 Hive CLI를 원격으로 실행할 때 적용돼요. 단일 Hive CLI 세션은 (특히 클러스터가 생성·종료될 때) 서로 다른 hadoop 클러스터를 넘나들 수 있어요. CLI를 한 Hadoop 클러스터에서 다른 클러스터로 전환하려면 두 개의 구성 변수만 바꾸면 됩니다.
fs.default.namemapred.job.tracker
주의할 점은, CLI가 한 클러스터에서 다른 클러스터로 전환하면 이전 HDFS 인스턴스에 저장된 테이블에 접근할 수 없다는 거예요. 자세한 내용은 Case Study 1에서 확인할 수 있습니다.
사례 연구 (Case Studies)
- EC2, Hive, Hadoop을 사용해 S3의 파일 쿼리하기
부록 (Appendix)
S3 for n00bs
S3가 일반적으로 파일 시스템으로 어떻게 사용되는지 이해하는 것이 유용해요. 각 S3 버킷은 파일 시스템의 루트로 간주할 수 있어요. 이 파일 시스템 안의 서로 다른 파일들은 S3에 저장된 객체가 되는데, 파일의 경로명('/'로 연결된 경로 구성요소)은 버킷 안의 S3 키가 되고 파일 내용은 값이 됩니다. S3Fox 같은 여러 도구와 Hadoop의 네이티브 S3 파일 시스템(s3n)은 키에서 발견되는 공통 접두어로 암시되는 디렉터리 구조를 보여줘요. 모든 도구가 빈 디렉터리를 만들 수 있는 것은 아닙니다. 특히 S3Fox는 (디렉터리를 나타내는 빈 키를 만들어) 만들 수 있어요. aws, s3cmd, s3curl 같은 다른 인기 도구는 커맨드 라인에서 S3에 편리하게 접근하는 방법을 제공하지만, 빈 디렉터리를 만드는 기능은 없어요.
더 알아보기 (Learn more)
AWS에서 Hive를 운영할 때는 (1) Hive CLI 실행 위치와 metastore 저장 위치, (2) S3 등 기존 데이터에 대한 테이블 정의, (3) EC2 Hadoop 클러스터로의 쿼리 전달이라는 세 가지를 설계해야 해요. 장기 데이터는 S3, 중간 데이터는 HDFS가 일반적인 선택이며, 원격 CLI 실행 시 fs.default.name과 mapred.job.tracker로 클러스터를 전환할 수 있습니다.