복붙노트

[HADOOP] 내 BroadcastHashJoin이 Spark의 ShuffledHashJoin보다 느린 이유

HADOOP

내 BroadcastHashJoin이 Spark의 ShuffledHashJoin보다 느린 이유

Spark에서 javaHiveContext를 사용하여 조인을 실행합니다.

큰 테이블은 1,76Gb이고 100 백만개의 기록을 가지고 있습니다.

두 번째 테이블은 273Mb이고 10 백만 레코드가 있습니다.

나는 JavaSchemaRDD를 얻었고 count ()를 호출했다.

String query="select attribute7,count(*) from ft,dt where ft.chiavedt=dt.chiavedt group by attribute7";

JavaSchemaRDD rdd=sqlContext.sql(query);

System.out.println("count="+rdd.count());

broadcastHashJoin (SET spark.sql.autoBroadcastJoinThreshold = 290000000)을 강제 실행하고 8 코어와 20Gb 메모리가있는 5 노드에서 5 개의 실행 프로그램을 사용하면 100 초 후에 실행됩니다. 내가 강제로 방송하지 않으면 30 초 후에 실행됩니다.

N.B. 테이블은 쪽모이 세공 파일로 저장됩니다.

해결법

  1. ==============================

    1.문제의 원인은 대부분 방송 비용입니다. 일을 간단하게 만들려면 큰 RDD에 1800MB, 작은 RDD에 300MB가 있다고 가정하십시오. 5 명의 실행 프로그램을 가정하고 이전 파티션을 작성하지 않은 경우 모든 데이터 중 5 분의 1이 이미 올바른 시스템에 있어야합니다. 표준 조인의 경우에는 1700MB가 남았습니다.

    문제의 원인은 대부분 방송 비용입니다. 일을 간단하게 만들려면 큰 RDD에 1800MB, 작은 RDD에 300MB가 있다고 가정하십시오. 5 명의 실행 프로그램을 가정하고 이전 파티션을 작성하지 않은 경우 모든 데이터 중 5 분의 1이 이미 올바른 시스템에 있어야합니다. 표준 조인의 경우에는 1700MB가 남았습니다.

    브로드 캐스트 조인의 경우 더 작은 RDD가 모든 노드로 전송되어야합니다. 그것은 1500MB의 데이터가 전송된다는 것을 의미합니다. 필요한 통신을 드라이버에 추가하면 훨씬 더 비싼 방법으로 비슷한 양의 데이터를 이동해야합니다. 브로드 캐스팅 된 데이터는 먼저 수집되어야하며 이후에는 모든 작업자에게 전달 될 수 있습니다.

  2. from https://stackoverflow.com/questions/34139049/why-my-broadcasthashjoin-is-slower-than-shuffledhashjoin-in-spark by cc-by-sa and MIT license