복붙노트

[HADOOP] pyspark / spark를 사용하여 큰 분산 데이터 세트 샘플링

HADOOP

pyspark / spark를 사용하여 큰 분산 데이터 세트 샘플링

hdfs에있는 파일을 클러스터의 노드에 분산시킵니다.

이 파일에서 무작위로 10 줄의 샘플을 얻으려고합니다.

pyspark 셸에서 다음을 사용하여 RDD로 파일을 읽었습니다.

>>> textFile = sc.textFile("/user/data/myfiles/*")

그리고 나서 샘플을 간단하게 가져 가고 싶습니다 ... Spark에 대한 멋진 점은 takeSample과 같은 명령이 있다는 것입니다. 불행히도 다음과 같은 시간이 너무 오래 걸리기 때문에 나는 뭔가 잘못하고 있다고 생각합니다.

>>> textFile.takeSample(False, 10, 12345)

그래서 각 노드에 파티션을 만들고 다음 명령을 사용하여 각 노드가 그 파티션을 샘플링하도록 지시했습니다.

>>> textFile.partitionBy(4).mapPartitions(lambda blockOfLines: blockOfLines.takeSample(False, 10, 1234)).first()

하지만 오류가 발생합니다 ValueError : 압축 할 값이 너무 많습니다.

org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/worker.py", line 77, in main
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/serializers.py", line 117, in dump_stream
    for obj in iterator:
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/rdd.py", line 821, in add_shuffle_key
    for (k, v) in iterator:
ValueError: too many values to unpack

spark 또는 pyspark를 사용하여 큰 분산 데이터 세트에서 10 줄을 어떻게 샘플링 할 수 있습니까?

해결법

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

    1.대신 textFile.sample (false, fraction, seed)을 사용해보십시오. takeSample은 RDD에서 count ()를 호출하기 때문에 일반적으로 매우 느립니다. 그렇지 않으면 각 파티션에서 고르게 가져 가지 않기 때문에 기본적으로 분수를 계산하기 위해 요청한 샘플 크기와 함께 카운트를 사용하고 내부적으로 샘플을 호출하기 때문에 이렇게해야합니다. 샘플은 빠릅니다. 왜냐하면 실제로 시간의 분수 퍼센트를 반환하는 무작위적인 부울 생성기를 사용하기 때문에 카운트를 호출 할 필요가 없습니다.

    대신 textFile.sample (false, fraction, seed)을 사용해보십시오. takeSample은 RDD에서 count ()를 호출하기 때문에 일반적으로 매우 느립니다. 그렇지 않으면 각 파티션에서 고르게 가져 가지 않기 때문에 기본적으로 분수를 계산하기 위해 요청한 샘플 크기와 함께 카운트를 사용하고 내부적으로 샘플을 호출하기 때문에 이렇게해야합니다. 샘플은 빠릅니다. 왜냐하면 실제로 시간의 분수 퍼센트를 반환하는 무작위적인 부울 생성기를 사용하기 때문에 카운트를 호출 할 필요가 없습니다.

    또한, 나는 이것이 당신에게 일어나고 있다고 생각하지 않지만 반환 된 샘플 크기가 충분히 크지 않다면 샘플을 다시 호출하여 분명히 느려질 수 있습니다. 데이터의 크기에 대한 아이디어가 있어야하기 때문에 샘플을 호출 한 다음 샘플을 크기를 줄이는 것이 좋습니다. 왜냐하면 스파크보다 데이터에 대해 더 많이 알고 있기 때문입니다.

  2. ==============================

    2.takeSample 대신에 sample을 사용하면 합리적으로 빠른 것으로 나타납니다.

    takeSample 대신에 sample을 사용하면 합리적으로 빠른 것으로 나타납니다.

    textFile.sample(False, .0001, 12345)
    

    이 문제는 데이터 세트의 행 수에 대한 대략적인 생각이없는 한 선택할 올바른 부분을 알기가 어렵다는 점입니다.

  3. from https://stackoverflow.com/questions/24806084/sampling-a-large-distributed-data-set-using-pyspark-spark by cc-by-sa and MIT license