이전에 start-all.sh를 실행하지 않고, /bin/hdfs를 통해 각 노드 실행하는 걸로 만들었었다.
흠....... 다시 처음부터 갈아 엎었다.
이유는...
1. HA를 구성하려고 하다보니 각 노드를 실행시키는 것보다는 마스터 노드에서 일괄적으로 실행시키는게 편리했고,
2. NN, DN 폴더구조를 가지고 각 hdfs-site.xml을 관리 하려고 했는데, RM, HIVE 등등 늘어나면서, 만드는 내가 햇갈렸다.
그래서 기존 온프렘형태의 HDFS 설치 방법처럼,
하나의 HDFS 설정파일을 만들고, 전체 노드가 공유해서 가져가는 구성으로 바꿨다. (+ ssh를 활용)
(대신 각 노드의 구분은 entrypoint.sh에서 인자를 통해 실행 명령어를 달리하도록 했다.)
그렇게 현재 완료된 버전은 v3.1.4 이다.
v3.1.4는 아래와 같이 구성되어있다.
HDFS + YARN + HIVE + TEZ + MYSQL + Beeline
hadoop 버전 2.9.2
Hive 버전 2.0.0
TEZ 버전 0.8.5
MYSQL 버전 5.7
이번 글에서는 위 구성을 구축하면서 만났던 에러들 총 3개를 설명하고, 해결법을 설명하려한다.
1. 먼저 HDFS를 구축하면서 만났던 에러다.
Name Node를 HA 구성을 마치고, 이제 active-standby를 확인하기 위해서 webUI로 접근을 했다.
그런데...
Name Node 둘 다 standby 상태였다.
보통 위 처럼 오류가 나는 경우는
1. 설정파일이 잘못되었거나.
2. zkfc, zookeeper, journal 실행에 문제가 있는 경우이다.
내가 맞닥드린 문제는 2번이였다.
zkServer.sh start 커맨드를 zookeeper node를 사용할 3개의 도커 컨테이너(서버)에서 실행시키려 했는데.
처음에 entrypoint.sh를 작성안하고, 천천히 하나하나 컨테이너에 접근하여 수동 커맨드로 실행시키다 보니, 정상적으로 실행되지 않았다.
이유를 찾아보니 아래와 같았다.
3개의 컨테이너에서 zkServer.sh start를 빠르게(동시에) 실행시켰고, 그 결과 정상적으로 동작했다.
동작 확인방법
1. jps 커맨드 수행 시, 확인
2. zkServer.sh status
3. zkServer 실행 로그를 확인
Name Node HA 구성을 다하고,
2. 그 다음으로 만난 문제는 Resource Manager(RM) HA 구성에서 오류? 착각? 이였다.
RM HA 구성 시, start-yarn.sh를 통해 마스터 컨테이너(?)에서 실행하는데,
yarn-site.xml을 통해 standby RM도 같이 실행시켜주는 줄 알았다.
하지만 standby RM 같은 경우, 실행되야할 컨테이너에서 resourcemanager를 수동적으로 실행시켜줘야 했다.
start-yarn.sh 외, $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager 커맨드 실행이 필요했다.
이렇게 HDFS + YARN HA 구성은 완료했다.
그 다음으로 Hadoop EchoSystem 중 Hive를 설치해보기로 했다.
Metastore는 처음에는 임베디드 형태(apache derby)로 구성해봤지만, 외부 DB로도 연동해보고자 Mysql을 사용했다.
설치방법은 뭐 검색하면 엄청나오니 작성은 안하다만,
그 중 참고한 블로그는 아래와 같다
Hive 2.0.0 버전을 설치했고, 실행시켜보니 2.0.0 버전부터는 MR engine이 아닌, TEZ, Spark Engine을 권장한다고 한다.
그래서 TEZ를 설치했다. 설치방법 또한 위 블로그에서 설명해주니 따라하면 쉬울 것이다.
TEZ 설치 다하고, hiveql 접근해서 engine을 tez로 설정해주고, 실행해봤다.
3. 쿼리 실행에서 에러 발생했다.
hive를 처음 다뤄보니 디버깅을 어떻게 해야하는지도 감이 안잡혔다.
찍히는 로그는 INFO level만 찍히고... 에러로 보이는 문구는 Execute Error에 return code 1.. 그 이상 힌트도 없다.
일단 에러 로그 복붙해서 구글검색하고..
찾아보니 디버깅 방법으로 아래 방법이 있었다.
hive 실행 시, loglevel debug로 설정하고 실행
(hive --hiveconf hive.root.loglevel=DEBUG,console)
로그레벨을 DEBUG 레벨로 바꾸고 실행하니, 에러 이유가 보였다.
이유는 쿼리를 수행하기 위해 RM으로부터 할당받은 Container Resource 중 Virtual Memory가 작업에 필요한 자원보다 적게 할당되어 있었다.
# 에러 상세 내용 중 일부
Container [pid=352,containerID=container_1647588320530_0001_02_000001] is running beyond virtual memory limits. Current usage: 165.8 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.
해결방법은 메모리량을 늘려주거나, 제한을 없애는 것이였다.
늘리는 방법은 아래 블로그 참고
제한을 없애는 방법은 yarn-site.xml에 아래 속성을 추가하는거라고 한다.
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers.</description>
</property>
위 해결법으로 메모리 관련 오류는 해결하고,
다시 쿼리를 실행시켰는데.. 이번에는 다른 오류를 만났다.
Execution Error, return code -101이다..
이거 에러 해결법 찾는데 1~2일 걸린거같다.
해결법은 아래 블로그를 참고하면 된다.
cp /usr/local/apache-tez-0.5.4/tez-dist/target/tez-0.5.4/lib/commons-collections4-4.0.jar $HIVE_HOME/lib
commons-collections4-4.0.jar에서 버전부분은 설치한 TEZ 버전에 따라 다를 수 있으니, 확인 후 알맞은 버전으로 복사가 필요하다.
위 과정을 다 하고나면 Tez engine을 사용하여 Hiveql이 동작 하는 것을 확인 할 수 있다!.
확인방법은 아래와 같다.
yarn webUI를 통해 작업상태를 확인
NN webUI를 통해 Datanode에 저장된 블록개수의 변화를 확인
hiveql에서 select 문을 통해 확인(insert query 등. 수행시)
추가로, hive에 외부에서 접근가능하도록 beeline test client도 docker-compose에 추가해놨다.
hiveserver2로 접근하는 명령어는 README.md에 있으나,
한번더 작성하자면
!connect jdbc:hive2://hs01:10000 root 123456이다.
접근 시, hiveql과 동일하게 쿼리를 수행할 수 있다.
'Tech > Hadoop' 카테고리의 다른 글
naver deview 영상 목록 (0) | 2022.11.06 |
---|---|
[Hadoop] hadoop 3.3.3 버전 docker로 설치하기 (0) | 2022.06.22 |
[Hadoop] Docker Data Node 추가, 삭제 (0) | 2022.03.11 |
[Hadoop]core-site.xml, hdfs-site.xml (0) | 2022.03.11 |
[Hadoop]Docker Base 하둡 설치기 (1) (1) | 2022.03.10 |