Airflow의 스케줄링을 이용해서 Spark를 submit하려고했지만 위와 같은 에러가 발생하였습니다.

에러의 원인은 spark의 default connection의 host가 yarn으로 설정되어 있어 발생하였습니다.

 

분산모드가 아닌 로컬 모드에서 테스트로 이루어지는 상황에서 

host가 yarn으로 설정되어 있기 때문에 이러한 에러가 발생하였습니다.

 

https://airflow.apache.org/docs/apache-airflow-providers-apache-spark/stable/operators.html 참조

 

spark를 submit할때는 spark conection이 올바르게 설정되어 있어야합니다.

 

만약 master를 yarn으로 실행시키실 경우(분산모드) host를 yarn으로 변경해주시고,
local에서 실행하실 경우 (standalone모드) host를 local로 변경해주세요.

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)

 

 

Selenium을 통한 크롤링을 Airflow환경에서 테스트 중에 발생한 에러입니다.

확인 결과 구글(브라우저)이 설치되어 있지 않아 에러가 발생 했습니다.

 

Selenium에서 사용 중인 브라우저가 설치되어있는지 확인해보시고,

설치가 되어있지 않다면 아래 방법으로 설치해주시면 해결됩니다 !

 

1. 패키지 리스트 업데이트

sudo apt update

 

2. 구글 다운로드 및 설치 

 

#구글 패키지 다운로드
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

#구글 패키지 다운로드 파일 설치
sudo apt install ./google-chrome-stable_current_amd64.deb

3. 설치 확인

google-chrome-stable --version

 

이후 실행하면 정상적으로 접속이 가능한게 확인 되었습니다.

 

cat /dev/null > 파일명

 

ex) cat /dev/null > test.txt

 

/dev/null 은 리눅스 시스템에서 빈 파일 또는 데이터를 버리는 특별한 장치 파일입니다. 데이터가 이곳으로 전송되면 버려지게 됩니다. 

cat을 사용해서 파일의 내용을 표준출력으로 /dev/null로 리다이렉션하여 파일 내용을 삭제합니다.

'데이터 엔지니어 > 리눅스' 카테고리의 다른 글

[Linux]리눅스 기초 명령어  (0) 2022.03.17

가장 중요 - 모든 에러는 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를 정확하게 입력하셨는지 확인을 한번 해보시는게 좋을것 같습니다.

+ Recent posts