본문 바로가기
학습장/Data Engineering

vertica-spark 연동

by daedoo_ 2021. 4. 5.

Vertica와 pyspark 연동 (특히, spark -> Vertica로 데이터 적재)을 위해 버티카쪽에서 필요한 설정

( load() 의 경우 필요한 .jar 파일만 있으면 가능)

 

1. VERIFY_HADOOP_CONF_DIR

연동하고자 하는 hadoop의 core-site.xml, hdfs-site.xml 파일을 버티카 전체 노드마다 /etc/hadoop/conf 에 위치시킴. 아래 쿼리를 수행하여 각 노드별로 정상 적용 여부 체크 가능

SELECT VERIFY_HADOOP_CONF_DIR();

 

#참고

 

https://www.vertica.com/docs/8.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/VERIFY_HADOOP_CONF_DIR.htm

 

www.vertica.com

 

2. /etc/hosts

버티카 각 노드의 /etc/hosts 에 목적지 정보 추가. (연동하고자 하는 hadoop의 Namenode, Datanode) Namenode는 클라이언트가 찾는 hdfs 파일이 어떤 Datanode 및 어떤 블럭에 있는지 알려주는 역할.

(Vertica DB -> HDFS 로 방화벽 허용 되어있어야 함.)

 

설정파일 준비

- Vertica-spark 커넥터

- spark-submit 구문에서 관련 설정파일들의 경로를 --jar 옵션에 추가

(pyspark shell 에서 테스트 수행시 pyspark vertca_jdbc.jar, vertica-8.1.1_spark2.1_scala2.11.jar  처럼 입력하면 테스트 환경 가능)

  • vertica-8.1.1_spark2.1_scala2.11.jar

load() : 버티카 테이블 데이터를 pyspark DataFrame으로 로드

from pyspark.sql import SQLContext
from pyspark.sql import DataFrame
sqlContext = SQLContext(sc)
opts={}
opts['table']='tableName'
opts['db']='dbName'
opts['user']=user
opts['password']=password
opts['host']='111.xxx.xxx.xxx'
opts['numPartitions']='10' #optional - default:16
opts['dbschema']=스키마명  #optional - default:public

df = sqlContext.read.load(format="com.vertica.spark.datasource.DefaultSource", **opts)
df.show()

 

save() : pyspark에서 버티카 테이블로 데이터 적재

  • load()시 사용하는 파라미터와 비슷하고 'hdfs_url' 필수로 추가 필요
  • 'table'에 설정된 테이블명은 save시에는 타겟테이블이 됨
opts['hdfs_url']='hdfs://네임노드명:port/HDFS경로' 
df_src = spark.read.parquet(적재할소스파일경로)
df_src.write.save(format="com.vertica.spark.datasource.DefaultSource",mode="overwrite", **opts)
  • hdfs_url : 설정된 HDFS경로에 적재할 데이터를 .orc 형식의 파일로 임시로 write 한다. 그리고 그 파일을 버티카가 클라이언트로서 hadoop 으로 접속하여, COPY 구문으로 적재됨.
  • mode="overwrite" : 타겟 테이블을 DROP 후 재생성하여 적재함. (append도 가능)
  • save() 수행시에, 버티카에 타겟스키마명.S2V_JOB_STATUS_USER_USER명  테이블이 자동생성되어 수행내역이 기록된다.

최종적으로 버티카에 인입되는 적재구문 예시

COPY "타겟스키마명"."타겟테이블명" FROM 'hdfs://네임노드명:port/HDFS경로/S2V_job3123442635970489/*.orc' ON ANY NODE orc DIRECT REJECTED DATA 

save()시 because of error: Could not connect to HDFS cluster No route to host 에러 발생하는 경우, 버티카 -> 하둡 방화벽 설정 여부 및 버티카 /etc/hosts 체크

 

#참고

 

https://www.vertica.com/docs/8.1.x/HTML/index.htm#Authoring/SparkConnector/WritingtoVerticaUsingDefaultSource.htm%3FTocPath%3DIntegrating%2520with%2520Apache%2520Spark%7CSaving%2520an%2520Apache%2520Spark%2520DataFrame%2520to%2520a%2520Vertica%2520Table%7C_____1

 

www.vertica.com

 

느낀점: spark과 연동을 위한 설정이 간편했는데, Vertica는 DW용 DBMS들 중에서도 hadoop 환경과의 연동에 많이 신경 쓴 듯 하다.

댓글