AWS

AWS Glue에서 Spark를 이용해 MSSQL 데이터를 S3에 저장하기

whistory 2022. 12. 26. 09:59
반응형

 

 

python job을 생성하여 싱글노드로 MSSQL 데이터를 S3에 저장하다보니, 데이터의 양이 1억건이 넘어가면 

메모리부족이 발생했다.

 

데이터 사이즈가 큰 테이블의 경우에는, Spark을 이용해 분산저장을 해야겠다.

 

일단 Glue Job에서, [Spark script editor] 을 통해

Spark job을 생성한다. 

 

 

 

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

## database information
server_name = "jdbc:sqlserver://serverIp:port"
database_name = "database"
table_name = "table"
username = "username"
password = "password"

## s3 bucket information
bucket_name = "bucket_name"
target1_name = "prefix1"
target2_name = "prefix2"

url = server_name + ";" + "databaseName=" + database_name + ";"

jdbcDF = spark.read \\
        .format("com.microsoft.sqlserver.jdbc.spark") \\
        .option("url", url) \\
        .option("dbtable", f"dbo.{table_name}") \\
        .option("user", username) \\
        .option("password", password).load()

jdbcDF.write.format('parquet').mode("overwrite").save(f"s3://{bucket_name}/{target1_name}/{database_name}/{table_name}/")
jdbcDF.write.format('parquet').mode("overwrite").save(f"s3://{bucket_name}/{target2_name}/{database_name}/{table_name}/")
    
#print(jdbcDF)
print(f"upload path 1 = s3://{bucket_name}/{target1_name}/{database_name}/{table_name}/")
print(f"upload path 2 = s3://{bucket_name}/{target2_name}/{database_name}/{table_name}/")

job = Job(glueContext)
job.init(args['JOB_NAME'], args)
job.commit()

 

 

위 Job실행을 위해서는 spark mssql connector jar 파일이 필요한데, 이를 S3에 올려주고, 

Dependent Jars path 에 해당 jar 파일의 경로를 적어준다.

 

 

 

 

이렇게 되면, job을 수행할떄,  자동으로 input arguments에 해당 jar 파일이 추가되어 정상적으로 작동되는것을 확인할수있다.

 

반응형