2017-12-16 17 views
1

Spark로 약 1500 개의 원격 Oracle 테이블에서 데이터를 가져오고 싶었습니다. 스레드 당 테이블을 선택할 수있는 멀티 스레드 응용 프로그램을 원합니다. 쓰레드를 시작하고 각각의 테이블에서 읽을 스파크 작업을 시작합니다. 그 불꽃이 실행멀티 스레드 드라이버에서 Apache Spark SQL 작업 시작하기

공식 스파크 사이트 https://spark.apache.org/docs/latest/job-scheduling.html에서

는이 작업을 할 수있는 분명하다 ...

... 클러스터 관리자는 응용 프로그램에서 스케줄링을위한 시설을 제공합니다. 둘째, 각 Spark 애플리케이션에서 여러 스레드 (스레드)가 제출 한 경우 여러 개의 "작업"(스파크 작업)이 동시에 실행 중일 수 있습니다. 응용 프로그램이 네트워크를 통해 요청을 처리 할 경우 일반적입니다. Spark에는 각 SparkContext 내에서 리소스를 예약하는 공정한 스케줄러가 포함되어 있습니다. 당신은 SO가이 비슷한 질문에 아무런 대답을 허용 없었다 가장 upvoted 답변이 불꽃

의 정신에 정말 아니다

로 시작하는 것이 Concurrent job Execution in Spark를 게시 할이에 알아 차렸을 수도 있습니다 그러나

  1. 모두는 스파크의 정신이 무엇인지 관심이 불꽃
  2. 의 "정신"에없는 알고? 실제로 아무 의미가 없습니다.

이전에 이런 식으로 된 사람이 있습니까? 특별한 일을해야 했니? 프로토 타입을 작성하는 데 많은 시간을 낭비하기 전에 몇 가지 지침을 원했습니다. 나는 이것에 어떤 도움도 정말로 감사 할 것이다!

+1

분산 된 작업자 풀이있는 요점은 작업자 관리자를 활용하여 드라이버 노드가 아닌 클러스터 자체에서 작업을 예약하는 것이기 때문에 Spark의 정신이 아닙니다.왜 여러 드라이버 대신 sparkcontext마다 여러 개의 작업/작업이 필요하고 일반적인 추상화 (드라이버 -> 작업자 -> 드라이버 -> 실제 작업자)를 사용합니까? 어떤 이유로 원사 클라이언트 또는 독립 실행 형 모드로 강제 전환됩니까? – cowbert

+0

실제로 현재 시간에 저는 원사 클라이언트 모드로 강제됩니다. 나는 제 플린으로 모든 것을하고있다. 그러나 내가 아니더라도 모든 직업이 똑같은 일을하고 있기 때문에 하나의 유물 (운전 기사 한 명) 만 갖고 싶습니다. 적어도 공정한 스케줄러가 작업 스케쥴을 처리하는 대신에 더 나은 스케줄링을 처리하는지 여부는 흥미로운 테스트 일 것입니다. 게다가, 스파크 워드 프로세서가 말하는 것처럼, 이것은 네트워크 애플 리케이션이 실행되는 방식이며 이상하지는 않다. –

+1

나는 여기서 사용하는 기술을 설명했다 : https://stackoverflow.com/a/47733522/1138523 –

답변

4

스파크 컨텍스트는 스레드로부터 안전하므로 많은 스레드에서 병렬로 호출 할 수 있습니다. (프로덕션 중입니다)

주의해야 할 점은 실행중인 스레드의 수를 제한하는 것입니다.
1. 실행 프로그램 메모리가 모든 스레드간에 공유되므로 사용자는 OOM 캐시에서 메모리를 계속해서 바꿔 넣거나 꺼내십시오.
2. CPU가 제한되어 있으므로 코어보다 많은 작업을 수행해도 아무런 개선이 없습니다.

+0

드라이버 프로그램은 공유하지 않을 것이다. 임무 수행자. 드라이버 프로그램은 스파크 작업을 제출할 프로그램입니다. 이는 작업을 제출하는 스레드가 작업을 나타내는 스레드를 방해하지 않는다는 것을 의미합니다. 또한 작업을 처리하는 것보다 더 많은 파티션을 처리하는 것이 중요합니다. Executor가 CPU 및/또는 사용 가능한 메모리를 예약하지 않도록 구성되었는지 확인하십시오. 파티션이 많을수록 작을수록 작업 배포가 향상되어 한 명의 집행자가 갑자기 다른 작업자보다 오래 동안 처리하지 않아도됩니다. – YoYo

1

하나의 멀티 스레드 응용 프로그램에서 작업을 제출할 필요가 없습니다 네가 그렇게 할 수없는 이유는 보이지 않는다). 개별 프로세스로 작업을 제출하십시오. 한 번에 하나씩 모든 작업을 제출하고 프로세스를 백그라운드로 밀어 넣거나 원사 클러스터 모드로 제출하는 스크립트를 준비하십시오. 스케쥴러 (yarn, mesos, spark cluster)는 모든 스케줄러가 메모리 및/또는 CPU 가용성에 따라 동시에 실행할 수있는 공간이 없으므로 일부 작업 만 대기하게합니다.

여러 파티션을 사용하여 실제로 테이블을 처리하는 경우에만 접근 방식이 유용하다는 것을 알 수 있습니다. 또한 많은 테이블을 처리해야하기 때문에 어느 정도의 이익을 얻을지는 모르겠습니다. 테이블 데이터로 수행하는 작업에 따라 여러 개의 단일 스레드 및 비 스파크 작업 만 실행하는 것이 더 간단 할 수 있습니다.

@cowbert 그의 메모를 참조하십시오.