2016-08-19 3 views
5

현재 매우 큰 MySQL 테이블의 내용을 Spark SQL을 통해 쪽매 파일로 대량 마이그레이션하려고합니다. 그러나 그렇게 할 때, 운전자의 메모리 한도를 더 높게 설정하더라도 (나는 로컬 모드에서 스파크를 사용하고있다.) 나는 빨리 메모리가 부족하다. 예제 코드 : 스파크가 매우 잘 작동하지 않을 메모리에 전체 테이블의 내용을 읽으려고처럼Spark SQL을 통한 대량 데이터 마이그레이션

Dataset<Row> ds = spark.read() 
    .format("jdbc") 
    .option("url", url) 
    .option("driver", "com.mysql.jdbc.Driver") 
    .option("dbtable", "bigdatatable") 
    .option("user", "root") 
    .option("password", "foobar") 
    .load(); 

ds.write().mode(SaveMode.Append).parquet("data/bigdatatable"); 

보인다. Spark SQL을 통해 대량 데이터 마이그레이션을 수행하는 가장 좋은 방법은 무엇입니까?

+0

스파크가 잘못 구성 되었기 때문에 OOM을 얻지 못하면 드라이버에서 스트리밍을 활성화해야합니다. http://stackoverflow.com/a/2448019/2439539 – r90t

답변

3

솔루션에서 Spark은 쓰기를 시작하기 전에 전체 테이블 내용을 하나의 파티션으로 읽습니다. 당신이 피할 수있는 한 가지 방법은 읽기 부분을 분할이지만, 소스 데이터의 숫자 순차적으로 열 필요

위의 예에서
Dataset<Row> ds = spark.read() 
    .format("jdbc") 
    .option("url", url) 
    .option("driver", "com.mysql.jdbc.Driver") 
    .option("dbtable", "bigdatatable") 
    .option("user", "root") 
    .option("password", "foobar") 
    .option("partitionColumn", "NUMERIC_COL") 
    .option("lowerBound", "1") 
    .option("upperBound", "10000") 
    .option("numPartitions", "64") 
    .load(); 

가 열 "NUMERIC_COL는"데이터에 존재하고 그것을해야합니다 이상적으로는 1에서 10000까지 동일하게 다양해야합니다. 물론 이것은 많은 요구 사항이며 아마도 이와 같은 열은 존재하지 않을 것입니다. 따라서 데이터베이스에 열과 같은보기를 작성하거나 추가해야합니다 (일반적인 SQL 구문을 사용 했으므로 DBMS에 적응해야합니다.)

String query = "(select mod(row_number(), 64) as NUMERIC_COL, * from bigdatatable) as foo" 

Dataset<Row> ds = spark.read() 
    .format("jdbc") 
    .option("url", url) 
    .option("driver", "com.mysql.jdbc.Driver") 
    .option("dbtable", query) 
    .option("user", "root") 
    .option("password", "foobar") 
    .option("partitionColumn", "NUMERIC_COL") 
    .option("lowerBound", "0") 
    .option("upperBound", "63") 
    .option("numPartitions", "64") 
    .load(); 
+0

감사합니다 @ 다니엘 –

관련 문제