Apache HBase 빌드하기
Apache HBase 빌드하기 (Building Apache HBase)
Maven으로 HBase 소스를 컴파일하는 기본 방법을 살펴볼게요. JDK 요구사항, Maven 빌드 명령, 다양한 Hadoop 버전 빌드, protobuf/thrift 생성, tarball 빌드, Apple Silicon 및 Linux Aarch64 빌드 방법을 다뤄요.
출처: 문서
본문
기본 컴파일 (Basic Compile)
HBase는 Maven으로 컴파일돼요. 최소 Maven 3.0.4를 사용해야 해요. Maven 버전을 확인하려면 mvn -version 명령을 실행해 주세요.
JDK 버전 요구사항 (JDK Version Requirements)
HBase는 릴리스 브랜치에 따라 다른 Java 버전 컴파일러 요구사항을 가져요. 컴파일 시점에 HBase는 런타임과 같은 버전 요구사항을 가져요. HBase 버전별 Java 버전의 완전한 지원 매트릭스는 Java를 참고해 주세요.
Maven 빌드 명령 (Maven Build Commands)
모든 명령은 로컬 HBase 프로젝트 디렉터리에서 실행돼요.
Package
HBase를 java 소스에서 컴파일하는 가장 간단한 명령은 package 타깃을 사용하는 것이며, 컴파일된 파일로 JAR을 빌드해요.
mvn package -DskipTests
또는 컴파일하기 전에 정리하려면:
mvn clean package -DskipTests
위 Eclipse 섹션에서 설명한 대로 Eclipse가 설정되어 있으면 Eclipse의 Build 명령도 사용할 수 있어요. 완전한 설치 가능한 HBase 패키지를 만드는 것은 조금 더 작업이 필요하므로 계속 읽어 보세요.
Compile
compile 타깃은 컴파일된 파일로 JAR을 만들지 않아요.
mvn compile
mvn clean compile
Install
JAR을 ~/.m2/ 디렉터리에 설치하려면 install 타깃을 사용해 주세요.
mvn install
mvn clean install
mvn clean install -DskipTests
Apple Silicon에서 HBase 2.x 빌드
비-master 브랜치를 빌드하려면 Apple Silicon에서 사용할 수 없는 protoc 2.5.0 바이너리가 필요해요. HBASE-27741은 apple-silicon-workaround Maven profile로 build가 자동으로 osx-x86_64 버전의 protoc으로 폴백하도록 하는 해결 방법을 추가했어요. 의도는 x86 버전의 protoc으로 빌드를 진행하게 해, OS에 내장된 Rosetta 명령 번역 서비스를 활용하도록 하는 것이에요. 직접 aarch_64 protoc을 제공해 사용하고 싶다면 커맨드라인에 -P'!apple-silicon-workaround'를 추가하거나 settings.xml의 구성을 통해 이 profile을 비활성화할 수 있어요.
Apple Silicon 머신에서 protoc을 빌드하려면 다음 명령을 사용할 수 있어요.
curl -sSL https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz | tar zx -
cd protobuf-2.5.0
curl -L -O https://gist.githubusercontent.com/liusheng/64aee1b27de037f8b9ccf1873b82c413/raw/118c2fce733a9a62a03281753572a45b6efb8639/protobuf-2.5.0-arm64.patch
patch -p1 < protobuf-2.5.0-arm64.patch
./configure --disable-shared
make
mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=2.5.0 -Dclassifier=osx-aarch_64 -Dpackaging=exe -Dfile=src/protoc
모든 또는 개별 단위 테스트 실행 (Running all or individual Unit Tests)
Unit Tests의 Running tests 섹션을 참고해 주세요.
다양한 Hadoop 버전에 대해 빌드 (Building against various Hadoop versions)
HBase는 Apache Hadoop 버전 2.y와 3.y(초기 릴리스 아티팩트)에 대해 빌드를 지원해요. 기본적으로 사용되는 정확한 Hadoop 버전은 릴리스 브랜치에 따라 달라져요. HBase 릴리스별 지원 Hadoop 버전의 완전한 내역은 Hadoop 섹션을 참고해 주세요.
빌드 시점에 Hadoop 버전을 선택하는 메커니즘은 모든 릴리스에서 동일해요. 어떤 Hadoop 버전이 기본인지는 다르지만, Hadoop 메이저 버전 선택은 Maven profile로 관리해요. Maven profile 상호 배타성의 특수성 때문에 특정 Hadoop 버전에 대해 빌드하는 profile은 일반적인 profile 활성화가 아니라 속성을 설정함으로써 활성화돼요. Hadoop 버전 profile 활성화는 다음 표로 요약돼요.
HBase 릴리스별 Hadoop Profile 활성화
| Hadoop2 Activation | Hadoop3 Activation | |
|---|---|---|
| HBase 1.3+ | active by default | -Dhadoop.profile=3.0 |
| HBase 3.0+ | not supported | active by default |
profile이 기본적으로 활성화된 경우 hadoop.profile을 제공해서는 안 된다는 점에 주의해 주세요.
Hadoop 메이저 버전 profile이 활성화되면 해당 속성 값을 재정의해 정확한 Hadoop 버전을 지정할 수 있어요. Hadoop2 버전의 경우 속성 이름은 hadoop-two.version이에요. Hadoop3 버전의 경우 속성 이름은 hadoop-three.version이에요.
예시 1: Hadoop 2.10.0에 대해 HBase 1.7 빌드
예를 들어 Hadoop 2.10.0에 대해 HBase 1.7을 빌드하려면 Hadoop2용 profile이 기본으로 설정되므로 hadoop-two.version만 지정하면 돼요.
git checkout branch-1
mvn -Dhadoop-two.version=2.10.0 ...
예시 2: Hadoop 3.4.0-SNAPSHOT에 대해 HBase 2.3 또는 2.4 빌드
이것은 개발자가 HBase 2.3 또는 2.4의 미발표 Hadoop 버전(현재 3.4)과의 호환성을 확인하는 방법이에요. Hadoop3 profile과 버전을 모두 지정해야 해요.
git checkout branch-2.4
mvn -Dhadoop.profile=3.0 -Dhadoop-three.version=3.4.0-SNAPSHOT ...
예시 3: Hadoop 3.4.0-SNAPSHOT에 대해 HBase 3.0 빌드
같은 개발자가 개발 버전의 HBase(현재 3.0)를 개발 버전의 Hadoop(현재 3.4)으로 확인하고 싶을 수도 있어요. 이 경우 Hadoop3 profile이 기본으로 활성화되므로 hadoop-three.version만 지정하면 돼요.
git checkout master
mvn -Dhadoop-three.version=3.4.0-SNAPSHOT ...
JDK11과 Hadoop3로 빌드 (Building with JDK11 and Hadoop3)
HBase는 Maven profile을 사용해 JDK 특정 빌드 설정을 관리해요. 사용 중인 JDK에 적절한 profile이 자동으로 활성화돼요. JDK8에서 빌드하고 실행하는 것은 Hadoop2와 Hadoop3을 모두 지원해요. JDK11에서는 Hadoop3만 지원돼요. 따라서 JDK11에서 빌드할 때는 Hadoop3 profile이 활성화되어야 하고, JDK11에서 HBase를 실행할 때 사용되는 아티팩트는 Hadoop3에 대해 컴파일되어야 해요. 또한 JDK11 profile은 최소 Hadoop 버전 3.2.0을 요구해요. 이 값은 JDK11 profile이 지정하지만 평소처럼 hadoop-three.version 속성을 사용해 재정의할 수 있어요. HBase 브랜치별 Hadoop profile 활성화에 대한 자세한 내용은 다양한 Hadoop 버전에 대해 빌드를 참고해 주세요. HBase 버전별 Java 버전의 완전한 지원 매트릭스는 Java를 참고해 주세요.
예시 1: JDK11로 HBase 2.3 또는 2.4 빌드
JDK11로 HBase 2.3 또는 2.4를 빌드하려면 Hadoop3 profile을 명시적으로 활성화해야 해요.
git checkout branch-2.4
JAVA_HOME=/usr/lib/jvm/java-11 mvn -Dhadoop.profile=3.0 ...
예시 2: JDK11로 HBase 3.0 빌드
HBase 3.0의 경우 Hadoop3 profile이 기본으로 활성화되므로 추가 속성을 지정할 필요가 없어요.
git checkout master
JAVA_HOME=/usr/lib/jvm/java-11 mvn ...
IDE에서 JDK11과 Hadoop3로 빌드 및 테스트 (Building and testing in an IDE with JDK11 and Hadoop3)
앞 섹션의 논의를 이어서, IDE 안에서 JDK11과 Hadoop3로 빌드하고 테스트하려면 추가 구성이 필요할 수 있어요. 구체적으로 IDE가 사용하는 JVM 버전이 JDK11인지, 활성 JDK Maven profile이 JDK11용인지, JDK8용 Maven profile이 활성화되지 않았는지 확인해 주세요. 마찬가지로 Hadoop3 Maven profile이 활성화되어 있고 Hadoop2 Maven profile이 활성화되지 않았는지 확인해 주세요.
Protobuf 빌드 (Build Protobuf)
hbase-protocol 모듈 또는 다른 모듈에 있는 protobuf 정의를 변경해야 할 수 있어요.
hbase-2.0.0 이전에는 protobuf 정의 파일이 모든 hbase 모듈에 흩어져 있었지만, 이제 protobuf와 관련된 모든 것은 hbase-protocol 모듈에 있어야 해요. 우리는 하류 프로젝트의 protobuf 사용을 방해하지 않으면서 버전을 자유롭게 변경할 수 있도록 protobuf 사용을 담으려고 노력하고 있어요.
protobuf 파일은 hbase-protocol/src/main/protobuf에 있어요. 변경이 효과를 내려면 클래스를 다시 생성해야 해요.
mvn package -pl hbase-protocol -am
이와 유사하게 내부 사용용 protobuf 정의는 hbase-protocol-shaded 모듈에 있어요.
mvn package -pl hbase-protocol-shaded -am
일반적으로 protobuf 코드 생성은 네이티브 protoc 바이너리를 사용해 수행돼요. 빌드에서는 편의를 위해 maven plugin을 사용하지만, 플러그인이 모든 플랫폼에 적절한 바이너리를 검색하지 못할 수 있어요. protoc이 실패하는 플랫폼에 있다면 protoc을 소스에서 컴파일하고 maven 빌드와 독립적으로 실행해야 해요. maven 인자에 -Dprotoc.skip을 지정해 인라인 코드 생성을 비활성화해 빌드를 더 진행할 수 있어요.
protobuf 파일을 수동으로 생성해야 한다면, 이후 maven 호출에서 clean을 사용하지 말아 주세요. 새로 생성된 파일이 삭제되기 때문이에요.
자세한 내용은 hbase-protocol/README.txt를 읽어 주세요.
Thrift 빌드 (Build Thrift)
hbase-thrift 모듈 또는 다른 모듈에 있는 thrift 정의를 변경해야 할 수 있어요.
thrift 파일은 hbase-thrift/src/main/resources에 있어요. 변경이 효과를 내려면 클래스를 다시 생성해야 해요. 이를 위해 maven profile compile-thrift를 사용할 수 있어요.
mvn compile -Pcompile-thrift
thrift 바이너리에 대해 thrift.path를 정의하고 싶을 수도 있는데, 다음 명령을 사용해요.
mvn compile -Pcompile-thrift -Dthrift.path=/opt/local/bin/thrift
Tarball 빌드 (Build a Tarball)
Releasing Apache HBase에 설명된 릴리스 과정을 거치지 않고 tarball을 빌드할 수 있어요. 다음 명령을 실행해 주세요.
mvn -DskipTests clean install && mvn -DskipTests package assembly:single
배포 tarball은 hbase-assembly/target/hbase-
maven 명령에서 install 또는 deploy 전에 assembly:single 목표를 두어 tarball을 설치하거나 배포할 수 있어요.
mvn -DskipTests package assembly:single install
mvn -DskipTests package assembly:single deploy
빌드 함정 (Build Gotchas)
Maven Site 실패
Unable to find resource 'VM_global_library.vm'이 보이면 무시해 주세요. 오류가 아니에요. 공식적으로는 못생기긴 했지만요.
Linux Aarch64에서 빌드 (Build On Linux Aarch64)
HBase는 Windows와 UNIX 계열 시스템 모두에서 실행되며, 지원되는 Java 버전을 실행하는 어떤 플랫폼에서도 실행되어야 해요. 여기에는 x86_64와 aarch64의 JVM이 포함되어야 해요. 아래 문서는 aarch64 플랫폼에서 hbase를 빌드하는 방법을 설명해요.
환경 변수 설정 (Set Environment Variables)
aarch64 서버에 Java와 Maven을 수동으로 설치하고(없다면) 환경 변수를 설정해 주세요. 예를 들어:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-arm64
export MAVEN_HOME=/opt/maven
export PATH=${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${PATH}
Aarch64에서 지원되는 Protobuf 사용 (Use Protobuf Supported On Aarch64)
이제 HBase는 두 버전의 protobuf를 사용해요. hbase가 내부적으로 사용하는 '3.11.4' 버전과 외부 사용용 '2.5.0' 버전이에요. protoc-2.5.0 패키지는 aarch64 플랫폼에서 작동하지 않으므로, 빌드할 때 maven profile '-Paarch64'를 추가해야 해요. 이는 aarch64 플랫폼에서 로컬로 만든 maven 저장소에서 protoc-2.5.0 패키지를 다운로드해요.
mvn clean install -Paarch64 -DskipTests
Protobuf는 '3.5.0' 버전부터 aarch64 protoc과 함께 릴리스되며, 우리는 protobuf를 나중에 업그레이드할 계획이라 '-Paarch64' profile을 더 이상 추가하지 않아도 될 거예요.
더 알아보기 (Learn more)
릴리스 준비, 테스트, 개발자 지침 등 HBase 개발 관련 문서를 이어서 보시길 권해요.