최근 airflow로 batch작업을 이관 하던 중 dataframe을 DB로 바로 저장할 수 있는 라이브러리를 찾아서 소개시켜드립니다.

 

insert문을 실행하지 않고 python으로 생성한 dataframe을 DB로 저장 시킵니다.

from sqlalchemy import create_engine
import pandas as pd

#test.csv를 dataframe형태로 읽기
df = pd.read_csv('test.csv')

#mysql+pymysql은 mairaDB에 대한 sqlalchemy의 드라이버를 의미합니다.
#SQLite 데이터베이스는 mysql+pymysql대신 sqlite를 적어주시면 됩니다.
connection_string = 'mysql+pymysql://유저명:password@localhost:3306/database'

#mariadb에 연결
engine = create_engine(connection_string)

#dataframe을 mairadb에 저장
#if_exists는 테이블이 이미 존재하는 경우 어떻게 처리할지에 대한 매개변수입니다. replace를 입력하여 기존 테이블을 대체할 수 있습니다.
df.to_sql("table명", engine, index = False, if_exists="replace")

 

python을 사용하시는 분들은 dataframe을 이용해 편리하게 DB에 데이터를 적재할 수 있습니다.

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

현재 chromedriver는 114버전까지만 공식홈페이지에서 지원합니다.

 

115버전 이후부터는 이전과는 다른방법으로 지원한다고 하는데, 기존에 chromedriver.exe를 통해서 사용을 했기 때문에

exe파일로 사용할 수 없어 해결방법을 찾고 있었습니다.

 

현재 크롬은 119버전까지 나와있으며, chromedriver는 119버전을 지원하지 않습니다.

 

해결방법으로는 편리하게 자동으로 webdriver를 설치해주는 라이브러리를 사용합니다.

 

[해결방법]

webdriver_manager 라이브러리를 이용하여 자동 설치 및 버전관리를 통해 편리하게 사용가능 합니다.

#webdriver_manager를 사용하기 위해 라이브러리 설치
pip install webdriver_manager 

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

#필요한 chrome_options은 추가해주면 됩니다.
chrome_options = webdriver.ChromeOptions()


driver = webdriver.Chrome(executable_path=ChromeDriverManager().install(),
options=chrome_options)


URL = "접속이 필요한 URL 기입"
driver.get(URL)

 

webdriver_manager를 사용하여 chromedriver를 자동으로 다운로드합니다. 

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

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

 

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

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

 

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

 

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

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

 

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

+ Recent posts