python을 이용하는 개발자로써 DataFrame형태의 데이터를 자주 접합니다.

 

python에서 hdfs에 dataframe 데이터를 저장하는 방법을 공유 합니다.

 

#hdfs 관련 라이브러리 로드
from hdfs import InsecureClient

#client 선언
hdfs_url = "http://<HDFS-NAMENODE-HOST>:<HDFS-NAMENODE-PORT>"
client = InsecureClient(hdfs_url, user="<HDFS-USER>")

#원하는 저장 경로(csv파일 또는 parquet 파일로 저장가능)
hdfs_path = "/path/to/your/directory/{file_name}.csv"
hdfs_path = "/path/to/your/directory/{file_name}.parquet"


with client.write(hdfs_path, overwrite=True) as writer:
    df.to_csv(writer, index=False, header=True)

 

가장 중요 - 모든 에러는 log를 확인하는 습관을 들여야하며, log안에서 해결가이드를 얻을 수 있었습니다.

 

1. ERROR : Cannot set priority of datanode process xxxx

-> /dfs/journalnode/ 모든 파일을 삭제하고 초기화를 진행한뒤 namenode 실행하니 정상적으로 namenode 실행되었습니다.

설정을 변경하면서 namenode를 초기화 하는 과정에 있어서 기존의 폴더들에 파일이 존재하면 이미 실행되고 있다고 인식할 수 있습니다.

namenode를 초기화 하기위해서는 하위 폴더들의 파일을 정리해주는 과정이 필요합니다.

 

2. hdfs-site.xml에서 rpc-adress의 port를 8020으로 설정했을때의 hdfs 실행 방법

hdfs dfs -ls hdfs:://nn01:8020/(주소 직접입력 필요)

저는 core-site.xml에 port를 9000으로 설정하여 알수 없는 충돌이 일어난것으로 보입니다.

되도록 기본port를 수정하지 않는 선에서 xml파일들을 설정하면 충돌을 피할 수 있습니다.

 

 

xml 폴더들의 설정을 변경하기 전에 기본port를 파악하고있으면, port에 대한 충돌을 피할 수 있습니다.

 

 

- HA(High Availability)구성을 위한 zookeeper 설치 

1. zookeeper를 사용할 노드에 zookeeper user 생성

2. namenode(nn01)에서 wget을 통하여 zookeeper 설치

3. conf/zoo_sample.cfg의 파일을 conf/zoo.cfg파일로 복사하여 zoo.cfg의 파일을 수정

4. 수정된 zoo.cfg파일을 포함하여 새롭게 zookeeper파일 압축하여 다른 zookeeper 노드들에 배포

5. 배포된 노드들에서 zookeeper파일을 압축해제

6. zookeeper 사용 노드들에 myid 지정(nn01은 1, rm01은 2, jn01은 3으로 지정하였습니다.)

7. zookeeper설치 폴더/bin/zkServer.sh start 명렁어를 각 zookeeper 노드들에서 실행

-> 만약 zookeeper 노드가 총 3대라면 follower mode2대, leader mode 1대의 비율이 되야합니다.

 

8. zookeeper 종료는 zookeeper설치 폴더/bin/zkServer.sh stop 명령어를 통해 모두 종료

 

zookeeper 실행시

Error contacting service. It is probably not running 에러가 발생하였습니다.

위 에러 해결방법은 https://colly.tistory.com/15 작성하였습니다.

 

 

- Hadoop 설치 

1. 모든 node에 hadoop user 생성

2. namenode(nn01)에서 wget을 통하여 hadoop 설치 

3. core-site.xml, hdfs-site.xml, mapred-site.xml, yarn-site.xml, hadoop-env.sh(java_home환경변수 설정, hadoop pid 설정) 수정 후 재압축 하여 모든 노드에 배포

4. 모든 서버에 /etc/profile.d/hadoop.sh 파일에서 hadoop_home, path 설정 후 생성 

 

-zookeeper , hadoop 실행 순서

 

1. 주키퍼 장애 컨트롤러(zk) 초기화

hadoop설치 폴더/bin/hdfs zkfc -formatZK (최초 실행시 1번만 실행 / namenode에서 실행 - nn01)

2. 저널노드 실행

hadoop설치 폴더/bin/hdfs --daemon start journalnode(각각의 저널노드에서 실행 - nn01)

3. 네임노드(namenode) 초기화 

hadoop설치 폴더/bin/hdfs namenode -format (최초 실행시 1번만 실행 / namenode에서 실행 - nn01)

4. 액티브 네임노드(active namenode)실행

hadoop설치 폴더/bin/hdfs --daemon start namenode(namenode에서 실행 - nn01 )

5. 액티브 네임노드용 주키퍼 장애 컨트롤러(zkfc)를 실행

hadoop설치 폴더/bin/hdfs --daemon start zkfc(namenode에서 실행 - nn01)

6. 데이터 노드 실행

hadoop설치 폴더/sbin/hadoop-daemons.sh start datanode(namenode에서 실행 - nn01)

7. 스탠바이 네임 노드 포맷, 액티브 네임노드의 메타 데이터를 스탠바이 네임노드로 복사

hadoop설치 폴더/bin/hdfs namenode -bootstrapStandby(stanbynamenode에서 실행 - rm01)

8. 스탠바이 네임노드 실행

hadoop설치 폴더/bin/hdfs --daemon start namenode(standbynamenode에서 실행 - rm01)

9. 스탠바이 네임노드에서 주키퍼 장애 컨트롤러 실행

hadoop설치 폴더/bin/hdfs --daemon start zkfc(standbynamenode에서 실행 - rm01)

10. yarn클러스터 실행

hadoop설치 폴더/sbin/start-yarn.sh(rm01에서 실행)

11. 액티브 - 스탠바이 네임노드 확인

hadoop 설치 폴더/bin/hdfs haadmon -getServiceState nn01 (active로 표시되야함)

hadoop 설치 폴더/bin/hdfs haadmon -getServiceState rm01 (standby로 표시되야함)

12. 각 서버별 실행된 파일 확인

jps로 확인

 

 

 

 

 

 

 

- 가상화 머신을 이용하여 총 4대의 노드 생성

 

hadoop1(nn01). 액티브 네임노드(ha구성을 위한 액티브), 저널노드 

hadoop2(rm01). 스탠바이 네임노드(ha구성을 위한 스탠바이), 리소스 매니저, 저널노드, 데이터노드

hadoop3.(jn01) 저널노드, 데이터 노드 

hadoop4(dn01). 데이터 노드 

 

/etc/hosts 에서 ip hostname으로 구성하여 hostname으로 하둡을 운영하였습니다. 

 

-> 제한된 컴퓨터 자원으로 인하여 총 4대의 노드로 구성하였으며,

다른분들이 하둡 구축한 게시글들을 따라서 구성하였기에 ssh 설정, 각각의 설정파일들에 대한 작성하지 않고

구축 순서 제가 겪었던 오류와 해결과정 등에 대해서 작성하도록 하겠습니다.

 

zookeeper를 설치하고 실행하는 과정에서

Error contacting service. It is probably not running 오류가 발생하는 경우가 있습니다.

 

저의 실수는 zoo.cfg파일에서 

server.1 = nn01이라는 서버 이름을 명시하여서 입력을 받지 못했다고 판단됩니다.

 

직접 서버들의 ip주소를 입력했을때는 정상적으로 작동하였습니다.

저와같은 오류가 발생하신 분들은 server ip를 정확하게 입력하셨는지 확인을 한번 해보시는게 좋을것 같습니다.

2023.11월 현재 m2칩을 지원하는 무료 가상화 솔루션은 한정적입니다.

많이 이용하시는 virtualBox는 m2칩을 지원하지 않기때문에 저에게 선택지는 UTM이었습니다.

 

하지만, UTM은 마우스를 전혀 사용할 수 없었고, cli환경이지만 마우스를 전혀 사용할 수 없다는 것은 큰 단점이었습니다.

그래서 조금 더 편한 개발환경을 만들기 위해 고민하였고, 가상환경은 UTM으로 설정하지만 실제 개발은 맥 터미널을 이용하여 사용하였습니다.

 

우선 UTM에 접속 후 로그인을 하게되면 ip 정보를 확인할 수 있습니다.

 

ssh username@ipaddr 을 입력하게되면,

이런식으로 접속이 가능합니다.

 

주의사항 - utm의 서버를 실행시켜놓지 않으면 접속이 불가능합니다.

실제 hadoop 환경에 대한 경험이 없어 직접 구축을 해봤습니다.

연습용으로 구축해보기 위해 vm환경에서 4대의 클러스터를 구성할 예정입니다.

 

우선, vm설치를 진행해보았습니다.

 

먼저, 저는 맥북 m2 칩을 사용하고 있습니다

-> virtualBox는 m2 환경에서 호환이 되지 않아 저는 utm으로 설치하였습니다.

 

https://mac.getutm.app/ 

 

UTM

Securely run operating systems on your Mac

mac.getutm.app

appstore에서 설치하시면 14,000원의 유료로 구매해야하지만, web에서 다운로드 받으시면 무료로 다운 받을 수 있습니다.

 

os는 ubuntu22.04버전 사용하였고, 

추후 버전 문제로 오류가 발생할 경우 20.04버전으로 변경할 예정입니다.

 

utm에 대한 설치와 ubuntu설치 과정은 타 블로그를 참고하였습니다.

 

ubuntu설치까지 완료 화면

 

 

보완해야할 점, 참고해야할 점 댓글로 남겨주시면 도움이 많이 될 것 같습니다 

감사합니다.

+ Recent posts