Apache Impala 빌드
Apache 버전의 Impala를 구축하면서 고생을 정말 많이 했다.
스크립트 하나로 빌드가 완성되는 오픈소스들과 달리, 고려해야 할 것이 많은데다
무엇보다도 정보가 많이 없는 편이기 때문이다.
공식 도큐먼트도 그다지 친절하지는 않은 편이다
따라서 빌드해서 클러스터에 올려서 실행하기 까지의 과정을 적어보려고 한다.
설치는 docker를 통하여 수행할 것이며
본 빌드는 4.2.0 버전으로 수행하였다. (2023/12/01 기준 최신 버전은 4.3.0)
사전 지식
서버 사양
최소 16GB 이상은 되는 서버에서 수행하기를 권장한다. 그 이하의 서버에서는 빌드 도중 서버가 뻗는 현상이 있었다.
OS
4.2.0 기준으로 Github 문서에는 다음 버전을 지원한다고 명시되어 있다.
- Ubuntu 16.04/18.04
- CentOS/RHEL 7/8
필자의 경우에는 Rocky 8 에서 수행하였고, 빌드 스크립트에는 Ubuntu 20.04가 명시되어 있었고, 직접 Ubuntu 20.04에서 빌드해본 결과 빌드가 수행되는 것을 볼 수 있었다.
Build type
Impala 를 개발하기 위하여 테스트가 포함된 빌드와, 테스트가 빠진 빌드가 존재한다.
전자의 경우에는 테스트를 위한 툴체인이 모두 설치되니 후자로 진행하는 것을 추천한다.
빌드 환경 준비
yum update -y
docker 세팅
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo systemctl start docker
docker run -it -d --name impala-build -p 10022:22 --privileged rockylinux:8.7
다음 명령어로 컨테이너에 진입한다
docker attach impala-build
빌드 수행
yum update -y
yum install sudo git wget -y
mkdir -p /opt/impala-build
cd /opt/impala-build
git clone https://gitbox.apache.org/repos/asf/impala.git /opt/impala-build/impala
cd /opt/impala-build/impala
git checkout remotes/origin/branch-4.2.0
다음 스크립트는 빌드를 수행할 환경을 만드는 스크립트이다.
예를 들어 종속성 패키지 설치 등
bin/bootstrap_system.sh
Impala 빌드에는 기본적으로 Cloudera 버전의 Hive가 사용되며, 기본적으로 Apache Hive와 호환되지 않는다.
Apache Hive를 사용하고 싶으면 impala-config-local.sh 파일 내에 다음 내용을 추가해야 한다.
echo 'export USE_APACHE_HIVE=true' >> bin/impala-config-local.sh
다음 명령을 수행하면 빌드가 시작된다.
source bin/impala-config.sh
nohup ./buildall.sh -noclean -notests 2>&1 | tee buildall.log &
빌드가 끝나면 be/build, fe 등 디렉토리 하위에 결과물들이 생성된다.
패키징
impala build 결과물이 /opt/impala-build/impala 에 존재한다고 가정한다
cd ~
mkdir impala-4.2.0-RELEASE
mkdir impala-4.2.0-RELEASE/lib64
mkdir impala-4.2.0-RELEASE/lib
mkdir impala-4.2.0-RELEASE/sbin
mkdir impala-4.2.0-RELEASE/bin
# native libraries
cp -r /opt/impala-build/impala/www impala-4.2.0-RELEASE
cp /opt/impala-build/impala/toolchain/toolchain-packages-gcc10.4.0/gcc-10.4.0/lib64/libgcc_s.so.1 impala-4.2.0-RELEASE/lib64
cp /opt/impala-build/impala/toolchain/toolchain-packages-gcc10.4.0/gcc-10.4.0/lib64/libstdc++.so.6 impala-4.2.0-RELEASE/lib64
cp /opt/impala-build/impala/toolchain/toolchain-packages-gcc10.4.0/kudu-956093dd9d/debug/lib64/libkudu_client.so.0 impala-4.2.0-RELEASE/lib64
# backend
cp -P /opt/impala-build/impala/be/build/debug/service/* impala-4.2.0-RELEASE/sbin
# frontend
cp /opt/impala-build/impala/fe/target/impala-frontend-4.2.0-RELEASE.jar impala-4.2.0-RELEASE/lib
cp /opt/impala-build/impala/fe/target/dependency/*.jar impala-4.2.0-RELEASE/lib
# impala shell
cp -r /opt/impala-build/impala/shell/build/impala-shell-4.2.0-RELEASE impala-4.2.0-RELEASE/bin/shell
# archiving
tar cvzf impala-4.2.0-RELEASE.tar.gz impala-4.2.0-RELEASE
hive도 챙겨가도록 한다
# patched hive
cp -r /opt/impala-build/impala/toolchain/apache_components/apache-hive-3.1.3-bin apache-hive-3.1.3-bin-patched
# archiving
tar zcvf apache-hive-3.1.3-bin-patched.tar.gz apache-hive-3.1.3-bin-patched
<Ctrl_Press> + p + q 를 통해 빠져나온다
docker cp impala-build:/opt/impala-4.2.0-RELEASE.tar.gz .
docker cp impala-build:/opt/apache-~~hive-3.~~1.3-bin-patched.tar.gz .
설치
클러스터에는 다음과 같이 데몬이 올라간다.
- 마스터 서버: statestored, catalogd, admissiond
- 워커 서버: impalad
테스트를 위하여 모든 데몬을 단일 노드에 띄울 수도 있다.
지금부터 작업을 <모든 노드>, <마스터 노드>, <워커 노드> 로 분리하여 설명하겠다.
※ 하둡 설치는 생략한다
모든 노드
※ 작업에 앞서 패키징한 impala와 hive를 모든 노드의 /opt 하위로 옮겨 준다
Master Node에만 Hive를 올리고 시도하였으나, impala에서 의존성 문제가 발생하여서
워커 노드에도 Hive를 올리고 경로를 잡아주기로 하였다
또한 일관성을 위해서 worker 노드에도 hive 계정 생성해 주었다.
의존성 패키지 설치
sudo yum install -y tar java-1.8.0-openjdk-devel
yum install -y python3
Hive 유저 생성
adduser -r hive
impala 유저 생성
sudo adduser -r impala
impala 및 hive 압축 해제
cd /opt
tar zxvf impala-4.2.0-RELEASE.tar.gz
ln -s /opt/impala-4.2.0-RELEASE /opt/impala
chown -R impala: /opt/impala/
tar zxvf apache-hive-3.1.3-bin-patched.tar.gz
ln -s /opt/apache-hive-3.1.3-bin-patched.tar.gz /opt/hive
chown -R hive: /opt/hive/
impala 설정 생성
install -d -o impala -g impala /opt/impala/conf
cat << EOF | sudo tee /opt/impala/conf/statestore.gflagfile
--log_dir=/var/log/impala
--enable_legacy_avx_support=true
EOF
sudo chown impala: /opt/impala/conf/statestore.gflagfile
cat << EOF | sudo tee /opt/impala/conf/catalog.gflagfile
--log_dir=/var/log/impala
--enable_legacy_avx_support=true
--disable_kudu=true
EOF
sudo chown impala: /opt/impala/conf/catalog.gflagfile
cat << EOF | sudo tee /opt/impala/conf/admission.gflagfile
--log_dir=/var/log/impala
--enable_legacy_avx_support=true
EOF
sudo chown impala: /opt/impala/conf/admission.gflagfile
cat << EOF | sudo tee /opt/impala/conf/impala.gflagfile
--abort_on_config_error=false
--log_dir=/var/log/impala
--state_store_host=<HOSTNAME>
--catalog_service_host=<HOSTNAME>
--admission_service_host=<HOSTNAME>
--enable_legacy_avx_support=true
--load_auth_to_local_rule=false
EOF
sudo chown impala: /opt/impala/conf/impala.gflagfile
Env file 생성 (HADOOP_HOME은 채워 넣는다)
cat << EOF | sudo tee /opt/impala/conf/impala.env
IMPALA_HOME=/opt/impala
JAVA_HOME=/usr/lib/jvm/java
CLASSPATH=/opt/impala/lib/*:/opt/hive/lib/*:/opt/impala/conf
HADOOP_HOME=/opt/hadoop
HIVE_HOME=/opt/hive
HIVE_CONF=/opt/hive/conf
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:<HADOOP_HOME>/bin
LD_LIBRARY_PATH=/opt/impala/lib64:/opt/impala/lib64/lib
EOF
sudo chown impala: /opt/impala/conf/impala.env
디렉토리 생성
install -d -o impala -g impala /var/log/impala
마스터 노드
bash에서 다음 명령 실행
postgresql 설치
yum install -y postgresql postgresql-server postgresql-contrib postgresql-jdbc
postgresql-setup initdb
sed -i "s/\\#listen_addresses =.*/listen_addresses = \\'*\\'/g" /var/lib/pgsql/data/postgresql.conf
echo 'host all all 0.0.0.0/0 md5' | sudo tee -a /var/lib/pgsql/data/pg_hba.conf
systemctl start postgresql
systemctl enable postgresql
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
sudo -u postgres psql -c "CREATE DATABASE metastore;"
postgresql 라이브러리 추가
ln -s /usr/share/java/postgresql-jdbc.jar /opt/hive/lib/
hive-site.xml 생성
cat << EOF | sudo tee /opt/hive/conf/hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://<HOSTNAME>:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>metastore.task.threads.always</name>
<value>org.apache.hadoop.hive.metastore.events.EventCleanerTask</value>
</property>
<property>
<name>metastore.expression.proxy</name>
<value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.postgresql.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:postgresql://<HOSTNAME>:5432/metastore</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>postgres</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>postgres</value>
</property>
<property>
<name>hive.metastore.transactional.event.listeners</name>
<value>
org.apache.hive.hcatalog.listener.DbNotificationListener
</value>
</property>
<property>
<name>hive.metastore.disallow.incompatible.col.type.changes</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>
EOF
HMS 초기화
/opt/hive/bin/schematool -initSchema -dbType postgres
HMS 서비스 등록
cat << EOF | sudo tee /etc/systemd/system/metastore.service
[Unit]
Description=Apache Hive Metastore - HSM
Documentation=http://hive.apache.org
[Service]
Type=simple
Environment=JAVA_HOME=/usr/lib/jvm/java/
Environment=HADOOP_HOME=/opt/hadoop
ExecStart=/opt/hive/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
TimeoutStopSec=5
Restart=on-failure
User=hive
[Install]
WantedBy=multi-user.target
EOF
HMS 실행
systemctl start metastore
sudo systemctl enable metastore
impala 서비스 등록
cat << EOF | sudo tee /etc/systemd/system/impala-catalog.service
[Unit]
Description=Apache Impala Catalog Daemon
Documentation=http://impala.apache.org
[Service]
EnvironmentFile=/opt/impala/conf/impala.env
ExecStart=/opt/impala/sbin/catalogd --flagfile=/opt/impala/conf/catalog.gflagfile
TimeoutStopSec=5
Restart=on-failure
User=impala
[Install]
WantedBy=multi-user.target
EOF
cat << EOF | sudo tee /etc/systemd/system/impala-statestore.service
[Unit]
Description=Apache Impala StateStore Daemon
Documentation=http://impala.apache.org
[Service]
EnvironmentFile=/opt/impala/conf/impala.env
ExecStart=/opt/impala/sbin/statestored --flagfile=/opt/impala/conf/statestore.gflagfile
TimeoutStopSec=5
Restart=on-failure
User=impala
[Install]
WantedBy=multi-user.target
EOF
cat << EOF | sudo tee /etc/systemd/system/impala-admission.service
[Unit]
Description=Apache Impala Admission Control Daemon
Documentation=http://impala.apache.org
[Service]
EnvironmentFile=/opt/impala/conf/impala.env
ExecStart=/opt/impala/sbin/admissiond --flagfile=/opt/impala/conf/admission.gflagfile
TimeoutStopSec=5
Restart=on-failure
User=impala
[Install]
WantedBy=multi-user.target
EOF
impala master 데몬 실행
systemctl start impala-statestore
systemctl start impala-catalog
systemctl start impala-admission
systemctl enable impala-statestore
systemctl enable impala-catalog
systemctl enable impala-admission
워커 노드
impala 데이터 디렉토리 생성
install -d -o impala -g impala /data/impala
impalad 서비스 등록
cat << EOF | sudo tee /etc/systemd/system/impala.service
[Unit]
Description=Apache Impala Daemon
Documentation=http://impala.apache.org
[Service]
EnvironmentFile=/opt/impala/conf/impala.env
ExecStart=/opt/impala/sbin/impalad --flagfile=/opt/impala/conf/impala.gflagfile
TimeoutStopSec=5
Restart=on-failure
User=impala
[Install]
WantedBy=multi-user.target
EOF
impalad 실행
systemctl start impala
systemctl enable impala
비고
- 주로 네이티브 라이브러리, 클래스패스 관련하여 에러가 발생하는데, 로그가 불친절하여 추적하기가 쉽지 않다.
- kudu를 사용하지 않더라도 해당 라이브러리를 포함해주지 않으면 실행되지 않는다.
Troubleshooting
bootstrap_system.sh 실행시 에러
다음 파일에는 현재 환경이 도커 컨테이너 환경인지 체크하는 로직이 있다.
cat /proc/1/cgroup
만약 'docker' 항목이 잡히지 않는다면 다음 명령을 수행해 준다
sed -i 's/^IN_DOCKER=/&true/' bin/bootstrap_system.sh
metastore 초기화시 에러 발생
$ /opt/hive/bin/schematool -initSchema -dbType postgres
[org.apache.logging.slf4j.Log4jLoggerFactory] Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357) at
...
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
찾지 못한 메소드는 google.common 하위의 메소드로, guava 의 메소드이다.
하둡과 guava 버전이 맞지 않아서 발생한 에러인데,
$HADOOP_HOME/share 내의 guava 라이브러리를 hive 쪽으로 복사하여 해결
Admission heartbeat rpc failed: Invalid argument
E1005 01:04:22.979858 223417 impala-server.cc:2847] Admission heartbeat rpc failed: Invalid argument: Client connection negotiation failed: client connection to <hostname>:29500: unable to find SASL plugin: PLAIN
다음 패키지 설치
yum install cyrus-sasl*
CAUSED BY: ClassNotFoundException: org.apache.thrift.transport.TFramedTransport
hive patch를 적용하여 빌드했음해도 불구하고 해당 라이브러리 에러 발생
$HIVE_HOME/lib 경로를 클래스패스에 추가
참고한 사이트
https://www.dataintensive.info/how-to-deploy-apache-kudu-impala-from-sources/
틀리거나 추가했으면 좋을 사항이 있다면 댓글 달아주시면 추가하겠습니다