맥북 M1 스파크 설치기
Spark 설치 & Hadoop 삽질기 2탄
이전 글에서 하둡과 스파크에 관한 특강을 들을 수 있는 좋은 기회가 생겨 참여하게 되었다고 언급했다. 첫 글은 하둡 설치기, 그리고 다음 글인 이번 글은 스파크 설치기이다. 하둡에 비해서는 아주 수월하게 설치되었다! 그래서 저번 포스팅에서 다 담지 못했던 하둡 삽질기(?)를 조금 추가해 글을 써보려고 한다.
Hadoop 삽질기 2탄
저번 포스팅에서 하둡을 모두 설치하고 나서, mapper를 사용하고자 이런 저런 일들을 벌렸다. 역시나 mapper 사용도 한 번에 쉽사리 되진 않았고(😂) 중간에 씅이 난 나는
hdfs namenode -format
이렇게 포맷을 해버리고 말았다… (오류만 났다 하면 원인 파악도 전에 먼저 껐다 켜보는 본능) 그러고 나니 ㅠㅠ 제대로 실행되던 하둡이 실행이 안됐다. 분명 총 5개의 항목이 돌아가고 있어야 하는데,
위처럼 데이터 노드가 돌아가지 않고 있는 대참사
구글링했더니 처음에는 env.sh의 HADOOP_OPTS 환경변수를
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_PREFIX/lib"
이렇게 변경하라고 해서 바꿨는데 똑같이 실행되지 않았다. 그래서 원래대로 다시 바꾸고 한번 더 하둡 포맷(??? 포맷때문에 이 참사가 일어났는데..)을 해줬다. 그러고 재실행했는데 역시나 될리가 없었다.
다시 구글링해보니 env.sh 파일에 아래 문구를 추가하면 된다고 해서 해봤는데 역시 안됐다.
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
export HADOOP_OPTS="${HADOOP_OPTS} -Djava.library.path=$HADOOP_PREFIX/lib"
출처: https://abc2080.tistory.com/entry/경고-Unable-to-load-nativehadoop-library-for-your-platform [Another Windows]
되다가 갑자기 안되니까 멘붕이 왔다… 근데 다시 자세히 살펴보니 종료할 때는 stopping datanode라고 뜨고, 구글링 했을 때 저 에러는 경고문일 뿐 데이터노드가 실행되긴 하므로 신경 안써도 된다는 글을 본 기억이 났다. 추론 결과 datanode 자체는 실행되는데 뭔가 매핑이 안되는 것 같아 하둡 데이터노드 오류로 구글링해보니 드디어 원인을 찾았다.
바로 하둡 구동중에 (종료하지 않고) namenode format을 하면 주로 발생하는 오류라는 것 ㅠㅠ
namenode namespaceID와 datanode namespaceID가 일치하지 않을 경우 발생한다고 한다. 초기 설치가 아닌 하둡 사용 중 format을 해야한다면 hdfs의 data폴더를 지우고 다시 생성한 후 포맷해야 정상작동 한다고… 또 하나 배웠다. ㅠㅠ
그래서 데이터를 지우기 위해 hdfs폴더를 들어가보니,,
이렇게 두 개 밖에 없었다. 뭘 지워야 하는거지 고민하다가 dfs안에 data폴더가 있길래 그냥 지워봤다.
근데 삭제 후 다시 실행하려 했더니 먼저 stop 하라는 경고 문구가 뜸……. 그렇다… 또 하둡 종료 전 데이터를 삭제해버림…….🤯 아니 종료 안하고 포맷해서 이 사달이 났는데 또 이런다고…🤬 좌절을 느끼면서 제발 별문제 없길 바란다는 주문을 외며 종료하고 재실행했다.
신도 불쌍하셨는지 다행히 제대로 잘 돌아갔다. 이 날의 교훈.. 하둡 구동중 포맷은 절대로 하지 맙시다. 그리고 종료 명령을 생활화 합시다😂
Spark 설치 시작
- mac OS Big Sur 11.1에서 진행했습니다.
- Homebrew가 설치되어 있어야 합니다.
이제 스파크 설치로 돌아왔다. 홈브루로 설치할지, 직접 파일을 다운받을 지 고민하다가 하둡도 홈브루로 설치했기 때문에 혹시 모를 충돌을 대비하여 그냥 홈브루로 설치하기로 했다.
혹시 파일을 직접 다운받으실 분들은 아래의 주소에서 하둡 버전과 맞는 스파크 버전을 받아주면 된다.
http://spark.apache.org/downloads.html
이런식으로 각자 맞는 버전을 찾아 설치해주시면 됩니다!
설치 과정
1. 스파크 설치
우선 터미널을 열고 스파크 인스톨 명령을 내렸다. arm 기반 맥은 하둡과 동일하게 설치 명령이 조금 다르다.
arch -arm64 brew install apache-spark
이 명령어로 설치를 시도했다.
설치가 완료되면 아래 명령어로 info를 확인할 수 있다.
arch -arm64 brew install apache-spark
/opt/homebrew/Cellar/apache-core/blob/HEAD/Formula/apache-spark.rb
위 경로에 서치가 되었음을 확인할 수 있다.
2. 환경변수 설정
이제 환경변수를 설정해야한다.
vi ~/.zshrc
언제나 그랬듯이 위 명령어로 zshrc 파일에 접속해서, 환경변수를 추가해준다.
export SPARK_HOME=/opt/homebrew/Cellar/apache-spark/3.1.2/libexec
export PATH=${PATH}:$SPARK_HOME/bin
# 파이썬3 버전을 사용한다면 아래도 추가
export PYSPARK_PYTHON=python3
# 주피터 랩을 실행시키기 위해 아래 환경변수 추가
export PYSPARK_DRIVER=jupyter
export PYSPARK_DRIVER_PYTHON_OPS="lab"
이제 주피터 랩을 통해서 pyspark를 실행할 수 있다. 노트북을 주로 사용한다면 lab을 notebook으로 바꾸어주면 된다.
source ~/.zshrc
수정 후에는 위 명령어를 반드시 실행시켜주어야 한다.
pyspark --version
위 명령어를 입력해주면 아래와 같이 파이스파크 버전 확인이 가능하다.
그리고
pyspark
로 실행시켜주면,
이와 같이 실행된다. 다만..
엄청난 오류들이 나긴 함………….
하지만 못본 척 하고 막상 랩 열어서 import 해보면 실행은 잘 된다.^^
이렇게 ㅠㅠ 근데 spark-shell은 따로 열리지 않음.
너무 힘들어서 못본 척 그냥 되겠지 하고 그만하려다가 불안해서 교수님이 주신 예제를 실행시켜보니…
import pyspark
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
licLines = sc.textFile("/example/LICENSE")
linecnt = licLines.count()
linecnt
두둥.. sparkcontext 개체 자체가 불러와지지 않았다.ㅠㅠ 그럼 그렇지..!!!!!!!!!!! 어째 쉽게 된다 했더니.
오류 메세지를 잘 살펴보니 호스트 주소에 뭔가 잘못된 것이 있는 것 같아 구글링해봤다.
알고보니 호스트 주소를 수정해주어야 한다고 하더라.
3. 호스트 주소 수정
우선 아래 경로의 env.sh 파일을 찾아주어야 한다. 파인더에서 shift+command+g 를 눌러 경로 이동을 해주고 찾아준다.
/opt/homebrew/Cellar/apache-spark/3.1.2/libexec/conf/spark-env.sh.templete
파일 확장자가 templete이지만 다음으로 열기를 누르면 텍스트 편집기로 열 수 있다.
맨 아랫줄을 추가로 넣어주고, 저장했다.
그리고 이제 맥 호스트 파일을 수정해야한다.
우선 터미널에 hostname을 입력해서 호스트네임을 받아온다.
아래 출력된 호스트 네임을 복사해서 /etc/hosts 파일을 수정해주면 된다.
https://magiclee.tistory.com/34
나는 위 블로그를 참조했다. (감사합니다…)
sudo nano /etc/hosts
# 비밀번호 입력
# 호스트 내용 수정 후
control + x 동시 입력
Y 입력
enter로 종료
이렇게 localhost 부분을 주석처리하고 아랫줄에 hostname을 넣어주었다.
그러고 다시 pyspark를 실행했다.
그랬더니
ValueError: Cannot run multiple SparkContexts at once
알고보니 한 번 실행시키면 종료를 해주어야하는 듯 싶다..^^ㅎ
종료 지옥…
sc.stop()
위 코드 실행 후 다시 해봤더니 잘 되었다. 그리고 교수님이 주신 예제에서의 경로는 ‘/example/LICENSE’ 였는데, 나는 맥이라서 그런가 경로가 달라 알맞게 수정한 뒤 실행했다.
위 코드의 경로를 보면 수정된 것을 알 수 있고, count가 잘 먹혀 576이 출력된 것을 볼 수 있다.
마치며
하둡보다는 훨씬 괜찮았으나 역시 어려운 스파크 설치였다. 하둡에서 많이 데인 탓에.. 스파크 설치는 좀 더 수월할 수 있었던 것 같다. 또, mapper를 따로 사용해야하는 하둡과 달리 주피터 상에서 바로 사용 할 수 있다는 메리트가 굉장히 큰 것 같다. 개인적으로 설치 과정 내내 버전을 띄우면 나오는 스파크 로고가 멋지다고 생각했다.😎