مشكلة غريبة مع شرارة التخزين المؤقت

0

نحن نستخدم Spark 2.2.0. لدينا 1.5 تيرابايت من البيانات في جدول خلية. لدينا 80 مجموعة عقدة حيث تحتوي كل عقدة على حوالي 512 غيغابايت من ذاكرة الوصول العشوائي و 40 نواة.

أنا أصل إلى هذه البيانات باستخدام Spark SQL. مع الأمر البسيط Spark SQL (بدون التخزين المؤقت) ، يستغرق الأمر البسيط مثل الحصول على عدد مميز لقيمة عمود معينة حوالي 13 ثانية. ولكن عندما أقوم بتشغيل نفس الأمر بعد التخزين المؤقت للجدول يستغرق الأمر أكثر من 10 دقائق. لست متأكدا ما هي المشكلة؟

export SPARK_MAJOR_VERSION=2
spark-shell --master yarn --num-executors 40 --driver-memory 5g --executor-memory 100g --executor-cores 5
spark.conf.set("spark.sql.shuffle.partitions", 10)
val df = spark.sql("select * from analyticalprofiles.customer_v2")
df.createOrReplaceTempView("tmp")
spark.time(spark.sql("select count(distinct(household_number)) from tmp").show())
>> Time taken: 13927 ms



import  org.apache.spark.storage.StorageLevel
val df2 = df.persist(StorageLevel.MEMORY_ONLY)
df2.createOrReplaceTempView("tmp2")
spark.time(spark.sql("select count(distinct(household_number)) from tmp2").show())
>> 1037482 ms ==> FIRST TIME - okay if this is more
spark.time(spark.sql("select count(distinct(household_number)) from tmp2").show())
>> 834740 ms  ==> SECOND TIME - Was expecting much faster execution ???

يستغرق إجراء تجربة مماثلة مع "spark.catalog.cacheTable (" tmp ")" ولكن لا يزال مع التخزين المؤقت للاستعلام مزيدًا من الوقت. غير متأكد من السبب ؟؟؟ يمكن لأي شخص أن يساعد ؟؟؟

df2.storageLevel.useMemory
res6: Boolean = true

sc.getPersistentRDDs
res8: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(12 -> In-memory table tmp MapPartitionsRDD[12] at cacheTable at <console>:24)

spark.conf.get("spark.sql.inMemoryColumnarStorage.compressed")
res11: String = true

spark.conf.get("spark.sql.inMemoryColumnarStorage.batchSize")
res12: String = 10000

spark.catalog.isCached("tmp")
res13: Boolean = true

1 إجابة

0

يمكنك تجربة ما يلي.

  1. يمكنك زيادة عدد المنفذين وتقليل ذاكرة المنفذ بالصيغة التالية

      SPARK_EXECUTOR_CORES (--executor-cores) : 5 
    
      Number of Executors (--num-executors) : (number of nodes) *  (number of cores) /(executor cores) -1 (for Application Master) = (80*40)/5 ~ 640-1 = 639
    
      SPARK_EXECUTOR_MEMORY (--executor-memory): Memory/(Number of Executors/Number of Nodes):  512/(639/80) ~ 64 GB
    
  2. إذا كنت تريد الاستمرار في إطار البيانات ، استخدم StorageLevel.MEMORY_AND_DISK_SER. إذا كانت الذاكرة (RAM) ممتلئة ، فسيتم حفظها في القرص.

اتمنى ان يساعدك

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام