1

:오라클 connetion 나는 다음과 같은 코드로 스파크 SQL에서 오라클 DB에 연결을 시도하고

우리는 스파크 SQL을 통해 오라클과 연결 기본적으로
val dataTarget=sqlcontext.read. 
  format("jdbc"). 
  option("driver", config.getString("oracledriver")). 
  option("url", config.getString("jdbcUrl")). 
  option("user", config.getString("usernameDH")). 
  option("password", config.getString("passwordDH")). 
  option("dbtable", targetQuery). 
  option("partitionColumn", "ID"). 
  option("lowerBound", "5"). 
  option("upperBound", "499999"). 
  option("numPartitions", "10"). 
  load().persist(StorageLevel.DISK_ONLY) 

가 하나 개의 파티션에 대한 하나의 연결을 만듭니다 전체 RDD에 대해 생성됩니다. 이렇게하면 테이블에 거대한 데이터가있을 때 병렬 처리가 느슨해지고 성능 문제가 발생합니다. 내 코드에서는 option("numPartitions", "10") 을 전달하여 10 개의 연결을 만듭니다. 내가 아는 한 틀린 것을 정정하십시오. 오라클과의 연결 수는을 넘는 파티션 수와 같습니다.

오라클에 연결 제한이있을 수 있으므로 더 많은 연결을 사용하면 오류가 발생합니다.

은 java.sql.SQLException : ORA-02391 : 초과 나는 더 많은 파티션을 사용하는 경우

병렬 처리에 대한 더 많은 파티션을 만들려면 동시 SESSIONS_PER_USER 한계, 오류가 온다하지만 덜 넣으면 나는 성능 문제에 직면 . 단일 연결을 만들고 여러 파티션에 데이터를로드하는 다른 방법이 있습니까 (이것이 내 생명을 구할 것입니다).

좋습니다.

답변

1

없다 여러 개의 파티션

에 단일 연결 및로드 데이터를 생성하는 다른 방법이 있습니까. 일반적으로 파티션은 서로 다른 물리적 노드와 다른 가상 시스템에서 처리됩니다. 모든 인증 및 인증 메커니즘을 고려할 때, 당신은 단지 연결을 가져 와서 그것을 노드에서 전달할 수 없습니다.

문제가 단지 SESSIONS_PER_USER을 초과하면 DBA에게 연락하여 Spark 사용자의 가치를 높이십시오.

문제가 있다면 동일한 번호 파티션을 유지하려고 시도 할 수 있지만 Spark 코어 수가 줄어들 수 있습니다. 이것은 주로 미세 조정이기 때문에 JDBC를 완전히 삭제하고 표준 내보내기 메커니즘 (COPY FROM)을 사용하여 파일을 직접 읽는 것이 좋습니다.

0

한 작업 주위 다음 하나의 오라클 연결 (파티션) 단순히 repartition 사용하여 데이터를로드 할 수 있습니다 :

val dataTargetPartitioned = dataTarget.repartition(100); 

할 수도 필드로 파티션 (partitioning a dataframe 경우) :

val dataTargetPartitioned = dataTarget.repartition(100, "MY_COL"); 
+1

앞에서 말한 것처럼 하나의 연결 만 사용하면 성능에 영향을 미치고 병렬 처리가 느슨해집니다 –

+0

"한 가지 연결을 만들고 데이터를 여러 파티션에로드하는 다른 방법이 있습니까?" 필자의 접근 방식으로 단일 Oracle 연결과 다중 파티션을 가진 Dataframe을 모두 가질 수 있다고 생각합니다. – tbone