관리 메뉴

A seeker after truth

매우 끔찍했던 mac 하둡 hadoop 설치, hive 설치 3.x 버전 with 상세 설명 본문

Data/hadoop ecosystem

매우 끔찍했던 mac 하둡 hadoop 설치, hive 설치 3.x 버전 with 상세 설명

dr.meteor 2022. 4. 21. 21:09

하도 힘이 들었어서 서문(aka 구구절절) 조금만 추가하겠습니다... (저만 이렇게 힘이 들었나요? 다른 분들 포스트 보면 꼭 smooth 하게 성공한 것처럼 보이기도 해서...ㅠ)

(*설치를 성공하기까지 총 3일(1일당 7시간)이 투입되었습니다)

 

제가 졸업한 학교 학과의 창시자이자 전설같은 구 학과장님께서 수업 중 이런 말씀을 해주신 적이 있습니다...

 

여러분께서 회사에 가면 가장 먼저 맡게될 일은 (아마) 뭔가를 설치해오는 일이 될겁니다.
그때 겪을 고통을 (과제를 통해) 미리 경험해보는게 좋겠죠?^_^

아직 회사에 가보지 않아서 이게 진실인줄로는 모르겠습니다만,..

적어도 하나는 아마도,,, 확신할 수 있을 것 같습니다. 그 대상이 hive 가 될 경우엔 만만치 않은 일이 되리란 것을...ㅠㅁㅠ

 

그리고 교수님의 말씀에서 핵심적인 포인트가, "고통"입니다.

즉 설치 해보는 일은 고통이다...

(mac 환경서) 제게 쉬웠던 설치도 있던 반면(ex: 도커) 아닌 것도 많았는데요(ex: mysql 5.x 버전, virtualBox ...)

이번 일은 가히 탑이었다고 생각합니다.. 그만큼 배운 것도 많긴 하지만,

다른 분들은 결코 이 고통을 겪지 않았음 하는 마음이 매우 커, 포스트를 제가 아는 지식 & 찾아본 자료 선에서 최대한 친절하게 작성해보자는 취지로 이 글을 쓰게 됐습니다.

 

가장 먼저 말씀드리고자 하는 이 고통의 근원은 무엇인가, 하면

하둡은 설치 방법도 다양하고, 버전별로 조금씩 디렉토리 구조가 다릅니다.

(출처: https://beyondj2ee.wordpress.com/2013/05/08/hadoop%EC%9D%98-%EB%A1%9C%EA%B7%B8%ED%8C%8C%EC%9D%BC%EC%9D%80-%EC%96%B4%EB%94%94%EC%97%90-%EC%9E%88%EB%8A%94%EA%B0%80/​)

 

'때문에' 하둡이 됐든 하이브가 됐든, 그 어떤 것을 설치할 때든 검색해보면 자료마다 내용이 조금씩 다르고요, 버전 및 os 차이에 따라 그를 맹목적으로 따를 경우 아무 에러도 일으키지 않고 성공하진 못하는 경우가 왕왕 있을 겁니다.

그래서 설치, 설정 관련 검색어도 다양하게 할 수 있는 와중에 검색어에 버전 관련 내용(검색어 ex: hadoop 3.3.2) 을 섞으면 그냥 "mac hadoop 설치(또는 설정)" 과 같은 식으로 검색했을 때와 또 다른 자료들을 만날 수가 있고 그게 도움이 되는 경우가 좀 있을 수 있습니다. 여기서 팁처럼 말씀을 드립니다. 혹은 그 버전에 해당하는 공식 문서가 있다면 그 역시 괜찮은 자료가 될 수 있는데요, 공식문서 내용이 그닥 섬세하지 못한 경우도 많습니다(하둡은 나쁘지 않았는데, 하이브의 경우는 3버전에서 도움되진 않았던 것 같습니다).

 

또한, 하이브와 하둡이 서로 버전이 맞지 않으면 아무리 설정을 잘해도 에러메시지를 만나게 됩니다. 저의 경우 하둡 3.3.2 버전과 하이브 3.1.2 버전을 사용했는데, 계속 다음과 같은 에러메시지를 만났습니다.

ERROR: Unable to determine Hadoop version information

하이브 버전이 3.1.3 으로 바꾸고 나니 하둡, 하이브 양쪽 모두에서 에러가 해결됐습니다.

 

 

OS는 MAC의 Big Sur 11.6.5 입니다.

먼저 하둡 설치입니다.

1. 하둡 hadoop 설치

hive는 하둡이 없으면 돌아가지 않습니다 아니, brew를 통해 hive를 설치할 경우엔 아예 같이 설치되기까지 합니다.

현재 모든 과정을 일일이 상세하게 적을 시간적 여건은 부족한 관계로 + 그런 자료는 넷상에 매우매우 많으므로, 여기선 이 글을 베이스로 해서 몇몇 설명을 덧붙여 검색으로 찾기 번거로운/잘 안나오는 내용 위주로 적어보겠습니다. 작성 시 아래 링크의 글을 기반으로 작성하도록 하겠습니다.

https://deep-jin.tistory.com/57

이 자료에 없는 내용 중 하나가 ssh 설정 관련 내용입니다. 터미널에 'ssh localhost'라고 입력했을 때 시스템 비밀번호를 입력하라고 뜨면 관련 설정을 해주셔야 합니다. 이에 대한 내용은 다른 자료 및 공식 문서에도 나와있습니다. 여기서는 공식 문서 내용을 링크해드리겠습니다.

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Setup_passphraseless_ssh

다른 하나는 namenode format 내용입니다. sbin/start-dfs.sh를 하기 전에 먼저 namenode 설정이 필요합니다. 안하면 나중에 또 에러 메시지를 만나게 됩니다~

  $ bin/hdfs namenode -format

이 명령어를 먼저 입력한 뒤에 sbin 폴더 밑 파일을 실행해주세요.(참고: https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Execution)

 

저는 brew 로 설치했습니다. 먼저 터미널에서 brew install hadoop 을 입력합니다. 그럼 최신 버전 중 stable한 버전이 설치될 것입니다. 저의 경우 3.3.2 버전이 설치됐습니다.

그리고 나선 cd /usr/local/Celler/hadoop/3.x.x/libexec/etc/hadoop 명령어를 통해 해당 경로로 이동해서 hadoop-env.sh 을 먼저 세팅하는데요, 여기서 JAVA_HOME 을 설정하죠? 이 부분 관련해 몇가지 말씀을 드리려 합니다.

(1) java 버전 문제

위 링크의 글에서 /usr/libexec/java_home 을 입력해보라고 하는데요, 그럼 맥이 현재 사용 중인 자바가 나옵니다. 저의 경우 그게

~/Library/Java/JavaVirtualMachines/azul-15.0.4/Contents/Home

였습니다. 15라니... 엄청나게 높은 버전입니다. 이렇게 높은 버전을 사용하면

class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader

라는 에러가 뜨더군요. 찾아보니, 9 이상의 버전에선 클래스 동적 로딩이 안돼서 생긴 문제라고 합니다. 따라서 낮은 자바 버전(8버전)을 따로 설치해서 사용해야 합니다.

더 정확한 내용은 공식 문서에서 확인하실 수 있습니다.

hadoop 공식 문서

3.0.x~3.2.x 는 자바 8만 지원하는군요.

https://hadoop.apache.org/docs/stable/ 링크에서 3.3.2 에 대한 멘트를 확인할 수 있는데 3.3.2는 자바 11 런타임을 지원한다고 합니다.

hive 공식 문서

하이브 공식문서는 하둡보다 설명이 부족하더라고요. 이 이상의 설명은 없었습니다.

 

어쩄든 결론은 자바 8을 사용하는게 좋단 것으로 수렴할 수 있습니다.

(2) openjdk8 설치 및 사용 문제

자바 8을 사용하는 방법도 다양합니다. 오라클 사이트에 가서 직접 다운 받아서 여러가지 경로를 설정해서 하는 방법, adoptopenjdk 를 사용하는 방법 등입니다.

공식 문서에서 하둡 커뮤니티 버전은 openjdk 를 사용하고 있다고 되어있는데요, 저의 경우 평소 brew 를 통해 이것저것 설치하다보니 의존성 있는 패키지들이 함께 설치되면서 설치된 것들 중 openjdk 관련한게 있을 것 같아 찾아보니 있더라구요, 그래서 먼저 이걸 이용해 보기로 했습니다. /usr/local/cellar 밑 파일을 뒤져보면 됩니다.

/usr/local/cellar/openjdk@8/1.8.0+322/libexec/openjdk.jdk/contents/home

위 경로를 .zshrc, hadoop-env의 JAVA_HOME 경로로 설정해서 해봤는데, 계속 경로 인식을 못하더라고요.

할 수 없이 adoptopenjdk 를 통해 jdk8을 따로 다시 설치해서 시도해보기로 했습니다. 이때는 아래 글을 참고했습니다.

https://kimdevel.tistory.com/32

글에 나온 대로 명령어를 입력하고 나면 password 를 입력하라고 나오죠? 그때부터 왜그러나 싶더니...

~/Library/Java/JavaVirtualMachines 밑에 들어가서 ls -al 입력해도 나오지도 않고...

홈에서 cd Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk  로 입력해서 가도 안나오고...

이렇게 가야지만 이동이 되더라고요..? 그리고 상위폴더로 하나씩 옮겨가며 ~/Library/Java/JavaVirtualMachines 밑에 다시 가서  ls -al 입력하면

azul 친구들은 하나도 나오지 않고 이것만 나오는데, 소유자권한도 root 로 azul과 다르고, 소유 그룹도 다르게 되어있는 것을 볼 수 있습니다. 그래서인지는 몰라도 Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 경로로 JAVA_HOME 설정을 해도 .zshrc, hadoop-env.sh 모두 없는 경로라고 나오며 인식을 못하더라고요.

 

그래서 저의 경우 평소 알고있던 방법을 하나 택했습니다. JetBrains 의 IntelliJ 가 설치돼있으면 원하는 jdk 설치하기가 매우 용이한데요, 

인텔리제이를 켠 뒤 Preference 메뉴로 이동해

Build, Execution, Deployment 메뉴 하단의 Build Tools 하단의 Gradle 로 들어갑니다.

그럼 'Gradle projects' 밑의 Gradle JVM을 살펴보면

'download JDK' 메뉴가 있습니다.

여기서 'version' 탭을 눌러보면

1.8버전도 있습니다.

그럼 다양한 종류의 jdk가 나오는데요, 저는 공식 문서의 이야기와 별개로 그냥 azul zulu를 선택해서 다운받았습니다. 그렇게해서 받은게 아까 'Gradle JVM' 탭에서 볼 수 있었던 설치된 jdk 목록 속 1.8 버전이고요. 그러면 앞으로  ~/Library/Java/JavaVirtualMachines/azul-1.8.0_322/Contents/Home 를 JAVA_HOME 으로 설정하면 됩니다. .zshrc, hadoop-env.sh 에서 이대로 하면 java 문제는 더이상 일으키지 않습니다.

여담으로 JAVA_HOME을 저렇게 설정했어도 터미널에 '/usr/libexec/java_home' 을 입력하면 여전히 처음 나오던 값인 ~/Library/Java/JavaVirtualMachines/azul-15.0.4/Contents/Home 가 나왔는데요, 찾아보니 이 부분은 신경쓰지 않아도 되는 부분 같았습니다. 위 명령어를 입력했을 때 나오는 값은 설치되어있는 자바 목록 중 최상단에 나오는 값을 반환한 것 뿐이라고 하네요. 이를 바꿀 수 있는 방법도 있긴 있습니다. 자세한 내용은 아래 링크에서 확인해주세요.

http://daplus.net/java-usr-libexec-java_home%EC%97%90%EC%84%9C-%EB%B0%98%ED%99%98-%EB%90%9C-mac-os%EC%9D%98-%EA%B8%B0%EB%B3%B8-java-vm%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%80%EA%B2%BD%ED%95%A0-%EC%88%98/

(3) core-site.xml 에서의 문제

앞서 말한 링크의 하둡 설치 자료에서는 core-site.xml을 다음과 같이 설정하라고 되어있습니다.

출처: https://deep-jin.tistory.com/57

그런데 여러 자료를 찾아보다보면 어떤 자료는 'fs.default.name'으로 되어있고 어떤 자료는 'fs.defaultFS' 라고 설정하라고 나옵니다.

저의 경우 'fs.default.name' 로 설정하고 나면 나아아중에 hive 가동 시에 다음과 같은 에러가 발생했습니다.

FAILED: RuntimeException java.net.ConnectException: Call to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused

fs.defaultFS 로 바꿔서 실행하면 위 에러는 다시 생기지 않았습니다.

(4) "ERROR: Invalid HADOOP_COMMON_HOME" 문제

저의 경우 위와 같은 설정을 다 하고나서 하둡을 실행해보면 자꾸 이 에러가 뜨더라고요. hadoop-env.sh 에 HADOOP_COMMON_HOME  변수가 설정되어 있지 않은 상태에서도 이 에러가 생겼고 설정하고 난 뒤에도 생겼습니다.

이 문제는 해당 경로가 올바르게 설정되어 있지 않아서 발생하는 문제입니다. 기존에 저는 스택오버플로우의 한 검색 결과를 보고 HADOOP_HOME 경로를 /usr/local/Cellar/hadoop/(하둡 버전 - 저의 경우 3.3.2) 로 설정했고 HADOOP_COMMON_HOME=$HADOOP_HOME 으로 설정했었는데요, 이건 저와 다른 환경(다른 하둡 버전, 다른 OS 등)에 해당하는 내용인 것 같더라고요. 반드시 뒤에 '/libexec' 가 하나 더 있어야 합니다. 즉 올바른 경로는 '/usr/local/Cellar/hadoop/3.3.2/libexec' 입니다. 이를 해결하고 나면 다른 환경 변수들도 설정하라는 에러 메시지가 뜹니다. 따라서 저는 hadoop-env.sh 내용을 아래와 같이 설정했습니다 (export JAVA_HOME 은 여기서 생략되었습니다).

export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="
export HADOOP_HOME=/usr/local/cellar/hadoop/3.3.2/libexec
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=/usr/local/cellar/hadoop/3.3.2/libexec/etc/hadoop
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HDFS_HOME

나중에 hive-env.sh에 HADOOP_HOME 변수를 작성할 때도 여기서 설정한 HADOOP_HOME 값과 동일하게 설정해야 합니다.

 

2. 하이브 hive 설치

하이브 설치 시 가장 도움이 되었던 자료들은 아래와 같습니다.

https://velog.io/@jodawooooon/BigData-UbuntuEC2%EC%97%90-Hive-3.1.2%EB%A5%BC-%EC%84%A4%EC%B9%98%ED%95%B4%EB%B3%B4%EC%9E%90

 

http://sanghun.xyz/2017/12/maxos-hive-%EC%84%A4%EC%B9%98/

 

이 자료도 괜찮습니다(전문 영어입니다)

https://medium.com/@hannahstrakna/installing-hadoop-with-hive-on-macos-catalina-using-homebrew-b4d384d455e4

 

첫번째와 두번째 자료를 바탕으로, 이번엔 하둡 설명과 달리 간략하게 해야할 일 순서로 간단하게 적어보겠습니다.

1) 우선 brew install hive 명령어를 통해 hive를 설치합니다. 물론 brew로 하지 않고 위 자료에 나온 다른 방법처럼 링크를 통해 직접 다운받아도 되고 어떤 방법이든 상관 없습니다.

2) .bashrc 나 .zshrc 에 HIVE_HOME, HADOOP_HOME 환경변수를 설정하는 건 필수는 아닙니다. 단지 어느 폴더 위치에서든 편하게 하둡과 하이브를 실행하고자 한다면 설정하는 것이죠. 저는 설정하지 않았는데 이상하게 다른 경로해서 해도 실행이 되더라고요. 이건 저도 이유를 잘 모르겠습니다.

3) 위 자료 중 첫번째 자료를 보면 hive-config.sh에 들어가 HADOOP_HOME 경로를 설정하도록 되어있는데요, 전 불필요한 설정일수도 있다고 생각해서 단계를 생략해봤는데 실행엔 문제 없더라고요. 저의 경우 usr/local/cellar/hive/(hive 버전)/libexec/bin 밑에 해당 파일이 있었습니다.

4) 첫번째 링크의 자료에 나온 것처럼 하둡이 실행된 상태에서 tmp, warehouse 폴더를 만들었습니다.

5) (mysql DB를 사용하려고) mysql connector J를 다운받았습니다.

- 첫번째 자료엔 해당 내용이 없고 두번째 자료엔 있는데요, 하는게 맞습니다. 첫번째 자료에 나온 것처럼 derby를 사용할게 아니고 mysql 등 다른 DB를 사용할 거라면 처음 hive가 설치될 때 해당 커넥터 jar 파일은 없기 때문에 따로 다운받아줘야 합니다.

- 자료에서는 curl을 통해 다운 받은 뒤 copy 명령을 사용했는데, 전 그렇게 하지 않고 처음부터 /usr/local/Cellar/hive/hive.version.no/libexec/lib/ 링크로 이동한 다음에 여기서 바로 다운받아 copy 과정을 거치지 않도록 했습니다. 버전은 지금 시점에서 더 최신 버전인 8.0.28 버전을 다운받았습니다.

- 하이브를 실행하기 전까지 어느 단계에서 하든 상관이 없는 부분입니다.

6) 이 단계는 7번 단계랑 세트인 단계입니다. 두번째 자료에 나온 것처럼 mysql에 접속해 metastore(꼭 metastore란 명칭을 사용하지 않아도 괜찮습니다) 라는 이름을 가진 db를 만들어줘야 합니다. 저의 경우 이때는 아래 명령어를 그대로 사용했습니다. 아, 대신 MariaDB를 사용했습니다

(*MariaDB와 MySQL은 동일한 문법을 지원하며 매우 깊은 연관이 있는 DB기 때문에 mariadb를 쓰고 mysql 커넥터를 사용해도 통한다는거... 자세한 설명은 분량상 생략합니다)

mysql -u root -p
mysql > create database metastore;
mysql > use metastore;
mysql > create user 'hiveuser'@'localhost' identified by '1234'; 
[ identified by ' '에는 password를 입력해줘야 하는데 여기선 1234를 입력해준다]
mysql > grant all on metastore.* to 'hiveuser'@'localhost' identified by '1234';
mysql > flush privileges;

출처: https://wannabe-gosu.tistory.com/54

여기서 유저 이름(hiveuser) 및 비밀번호(1234)는 당연히 다른걸로 바꿔 사용해도 되겠죠~

7) 양 자료에 모두 나와있는 것처럼 conf 폴더 밑의 hive-default.xml.template 을 복사해 hive-site.xml을 만들었습니다.

이 단계가 정말 문제입니다. 왜냐면 시중에 나온 자료 모두 서로 설정 파일 내용이 조금씩 다르거든요. 그래서 저는 일단 자료에 가장 많이 등장하는 공통 내용을 먼저 설정하고, hive를 실제로 실행한 뒤 에러 메시지를 봐가면서 하나씩 추가, 생략, 변경해가면서 실행이 되는 내용을 찾아갔습니다.

아래는 공통 내용으로 가장 많이 등장하는 설정이었습니다. 아, 설정할 때 vim 에디터로 들어가면 shift+G 키 누르면 파일 맨 뒤로 이동합니다. gg 누르면 맨앞으로 오고요. 파일이 매우매우 길기 때문에 이용하면 편할 거예요. 그리고 맨 뒤로 가면

    </property>

</configuration>

이렇게 되어있을 텐데 이 두 단어 사이부터 새로운 내용 적기 시작해야하는 것도 주의해주세요 (xml 지식이 아예 없긴 한데 지금까지 경험으로는 주의해야 한다고 알고 있습니다)

  <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost/metastore</value>
  </property>
  <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>hive</value>
  </property>
  <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>hive</value>
  </property>

앞에서 metastore 데베를 만들고 connector를 다운받은걸 생각하면 당연히 필수적이겠죠? 여기서 'metastore' 부분은 각자 설정한 데이터베이스 이름이 들어가면 되고요, 앞의 명령어를 그대로 따랐다면 connectionusername엔 hiveuser, 패스워드엔 1234가 들어가면 되겠습니다. 저건 제가 저렇게 설정한 것뿐이고요.

더 낮은 버전을 사용하게 될 경우엔 com.mysql.cj.jdbc.Driver 가 아니고 com.mysql.jdbc.Driver 라 입력해야 할거예요. 어느 버전부터인지는 모르지만, 통하지 않을 경우 나중에 hive를 실행했을 때 에러 메시지를 통해 안내받을 수 있으니 걱정 마세요!

 

에러메시지를 만나면서 추가로 설정한 내용은 아래와 같습니다.

  <property>
        <name>system:java.io.tmpdir</name>
        <value>/tmp/hive/java</value>
  </property>
  <property>
        <name>system:user.name</name>
        <value>${user.name}</value>
  </property>
  <property>
        <name>datanucleus.fixedDatastore</name>
        <value>false</value>
  </property>

첫번째, 두번째 설정은 링크했던 자료 중 첫번째 자료(velog)에 나온 설정 그대로고, 세번째 설정은 두번째 자료에 나온 그대로입니다.

 

저의 경우 여기까지 설정했을 때 에러 없이 hive가 실행됐습니다.

 

한가지 더 하실 게 있습니다. vim 에디터에서 사용할 경우 내용 삽입이 끝나고 esc로 나온 뒤

:3215 를 입력해주세요. 그럼 3215번째줄로 이동합니다. 다만 조사한 것에 따르면 하이브 버전 따라 줄 번호가 다르게 나오는 경우가 있는 것 같더라고요. 그래도 이 번호 근처에 있을 겁니다. 근처에서

<description>
  Ensures commands with OVERWRITE (such as INSERT OVERWRITE) acquire Exclusive locks for&#8;transactional tables.  This ensures that inserts (w/o overwrite) running concurrently
  are not hidden by the INSERT OVERWRITE.
</description>

라고 적힌 부분을 찾아주세요. 여기서 'for&#8;transactional' 라는 부분을 찾아 for과 transactional 단어 사이에 적힌 &#8; 라는 특수문자들을 없애고 올바르게 고쳐주세요. 안그러면 다음과 같은 에러를 만나게 됩니다.

WstxParsingException: Illegal character entity: expansion character (code 0x8) ...

8) 첫번째 자료에 나온 것처럼 스키마 초기화를 해야 합니다. hive/(버전)/bin 폴더로 가서

hive --service schemaTool -dbType mysql -initSchema 를 입력해주세요.

다른 버전을 깔아서 업그레이드가 필요한 경우엔

hive --service schemaTool -dbType mysql -upgradeSchema 

명령을 사용하면 된다고 합니다.
(출처: https://118k.tistory.com/883 [개발자로 살아남기])

9) 설정은 끝났습니다. 여기부터는 제가 기반 지식 없이 우연히 어떻게 해서 실행에 성공했다 하는 걸 말씀 드리게 될 것 같습니다. 워낙 실행이 잘 안되길래 자료들을 봐가면서 여러 방법으로 시행착오를 했거든요. 저는 먼저

hive --service metastore

를 먼저 입력했습니다. 그러면

여기까지 뜨고 더이상 다른 메시지는 뜨지 않습니다. 그래서 다른 창을 하나 더 띄우고 bin 폴더 아래에서 'hive' 를 입력했습니다. 그러면

마침내 실행이 됐습니다.!