복붙노트

[HADOOP] Spark를 사용하여 병렬로 데이터 집합 캐시 및 쿼리

HADOOP

Spark를 사용하여 병렬로 데이터 집합 캐시 및 쿼리

데이터 집합을 캐시하고 그 데이터 집합에 대해 "N"개의 쿼리를 병렬로 실행하여 일부 메트릭을 계산해야하는 요구 사항이 있습니다. 이러한 모든 쿼리는 필터가 변경 될 것 같은 유사한 메트릭을 계산하며이 쿼리를 왜냐하면 응답 시간이 중요하고 캐시하려는 데이터 세트의 크기가 항상 1GB 미만일 것이기 때문입니다.

Spark에서 데이터 셋을 캐싱 한 다음 그 데이터를 쿼리하는 방법을 알고 있지만 동일한 데이터 셋을 통해 병렬로 쿼리를 실행해야한다면 어떻게 동일한 결과를 얻을 수 있습니까? alluxio를 소개하는 것도 한 방법이지만, Spark 세계에서 동일한 방법으로 달성 할 수있는 다른 방법은 없을까요?

예를 들어 Java를 사용하면 메모리에 데이터를 캐시 할 수 있으며 멀티 스레딩을 사용하여 동일한 결과를 얻을 수 있지만 Spark에서 수행하는 방법은 무엇입니까?

해결법

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

    1.스칼라 병렬 컬렉션을 사용하여 Spark 드라이버 코드에서 병렬 쿼리를 실행하는 것은 매우 간단합니다. 다음은 이것이 어떻게 생겼는지에 대한 최소한의 예입니다.

    스칼라 병렬 컬렉션을 사용하여 Spark 드라이버 코드에서 병렬 쿼리를 실행하는 것은 매우 간단합니다. 다음은 이것이 어떻게 생겼는지에 대한 최소한의 예입니다.

    val dfSrc = Seq(("Raphael",34)).toDF("name","age").cache()
    
    
    // define your queries, instead of returning a dataframe you could also write to a table etc
    val query1: (DataFrame) => DataFrame = (df:DataFrame) => df.select("name")
    val query2: (DataFrame) => DataFrame = (df:DataFrame) => df.select("age")
    
    // Fire queries in parallel
    import scala.collection.parallel.ParSeq
    ParSeq(query1,query2).foreach(query => query(dfSrc).show())
    

    편집하다:

    Query-ID 및 결과를지도에 수집하려면 다음과 같이해야합니다.

    val resultMap  = ParSeq(
     (1,query1), 
     (2,query2)
    ).map{case (queryId,query) => (queryId,query(dfSrc))}.toMap
    
  2. from https://stackoverflow.com/questions/47726441/cache-and-query-a-dataset-in-parallel-using-spark by cc-by-sa and MIT license