অ্যাপাচি স্পার্ক: পুনরায় বিভাজন, বাছাই এবং জোড়ায় ক্যাশে করার প্রভাব


10

আমি কোনও টেবিলে যোগদান করার সময় স্পার্কের আচরণটি অন্বেষণ করছি। আমি ডেটাব্রিক্স ব্যবহার করছি।

আমার ডামি দৃশ্যটি হ'ল:

  1. ডেটাফ্রেম এ হিসাবে বাহ্যিক সারণি পড়ুন (অন্তর্নিহিত ফাইলগুলি ডেল্টা ফর্ম্যাটে রয়েছে)

  2. ডেটাফ্রেম বিটিকে ডেটাফ্রেম এ হিসাবে নির্দিষ্ট নির্দিষ্ট কলামগুলির সাথে নির্দিষ্ট করুন

  3. কলাম 1 এবং কলাম 2 এ ডেটাফ্রেমগুলি এ এবং বিতে যোগদান করুন

(হ্যাঁ, এটি খুব একটা বোঝায় না, আমি স্পার্কের অন্তর্নিহিত যান্ত্রিকগুলি বোঝার জন্য কেবল পরীক্ষা করছি)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))

b = a.select("column1", "column2", "columnA")

c= a.join(b, how="left", on = ["column1", "column2"])

আমার প্রথম চেষ্টাটি কোডটি যেমন চালানো হয়েছিল (চেষ্টা 1)। আমি তখন পুনরায় বিভাজন এবং ক্যাশে দেওয়ার চেষ্টা করেছি (চেষ্টা 2)

a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).cache()

অবশেষে, আমি পুনরায় বিভাগ করেছি, বাছাই করেছি এবং ক্যাশে করেছি

 a = spark.read.table("table") \
.select("column1", "column2", "column3", "column4") \
.withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5")))))
.repartition(col("column1"), col("column2")).sortWithinPartitions(col("column1"), col("column2")).cache()

উত্সাহিত সম্পর্কিত dags সংযুক্ত হিসাবে।

আমার প্রশ্নগুলি হ'ল:

  1. কেন চেষ্টা 1 এ টেবিলটি ক্যাশে হয়েছে বলে মনে হচ্ছে যদিও ক্যাশে স্পষ্টভাবে নির্দিষ্ট করা হয়নি।

  2. InMemoreTableScan সর্বদা এই ধরণের অন্য নোড দ্বারা অনুসরণ করা হয়।

  3. কেন তিনটি ধাপে তিনটি ক্যাচিং প্রদর্শিত হচ্ছে?

  4. প্রয়াসে কেন 3 হোলসটেজকোডিজেন একটি (এবং কেবলমাত্র একটি) ইনমোয়ার টেবিলস্ক্যান অনুসরণ করে।

চেষ্টা 1

চেষ্টা 2

এখানে চিত্র বর্ণনা লিখুন


আমি সন্দেহ করি যে ডেটাফ্রেম পাঠক যখন উত্সটি বাহ্যিক সারণী হয় তখন স্বয়ংক্রিয়ভাবে ডেটা ক্যাশে করে। আমার একইরকম পরিস্থিতি রয়েছে যেখানে আমি একটি ডাটাবেস টেবিল থেকে ডেটা পড়ছি, সক্ষম হওয়ার সাথে সাথে 'অ্যাপ্লিকেশন ডিটেইল ইউআই' এর "এসকিউএল" ট্যাবটি ডাউনলোড করা হচ্ছে আমাকে সারি সংখ্যা ডাউনলোড করা হচ্ছে তা দেখায় তবে নির্দিষ্ট জায়গায় এখনও কোনও ফাইল সংরক্ষণ করা হয়নি। । আমি অনুমান করি এটি গণনাটি জানে কারণ এটি কোথাও ডেটা ক্যাশে করেছে এবং এটিই ড্যাজে প্রদর্শিত হবে। আপনি যদি স্থানীয়ভাবে কোনও পাঠ্য ফাইল থেকে ডেটা পড়েন তবে আপনি ক্যাশের স্থিতিটি দেখতে পাবেন না।
সেলিম

উত্তর:


4

আপনি এই 3 টি পরিকল্পনায় যা পর্যবেক্ষণ করছেন তা হ'ল ডেটাব্রিক্স রানটাইম এবং স্পার্কের মিশ্রণ।

প্রথমত, ডেটাব্রিক্স রানটাইম ৩.৩+ চালানোর সময়, ক্যাশিং সমস্ত পারকোয়েট ফাইলের জন্য স্বয়ংক্রিয়ভাবে সক্ষম হয়। এর জন্য সংশ্লিষ্ট কনফিগারেশন: spark.databricks.io.cache.enabled true

আপনার দ্বিতীয় ক্যোয়ারির জন্য, InMemoryTableScan দু'বার ঘটছে কারণ ডান যখন যোগদানের ডাক দেওয়া হয়েছিল, স্পার্ক সমান্তরালভাবে ডেটাসেট এ এবং ডেটাসেট বি গুনতে চেষ্টা করেছিল। বিভিন্ন নির্বাহককে উপরোক্ত কাজগুলি অর্পণ করে ধরে নিয়েছেন, উভয়কেই (ডাটাব্রিক্স) ক্যাশে থেকে টেবিলটি স্ক্যান করতে হবে।

তৃতীয়টির জন্য, InMemoryTableScan নিজেই ক্যাশিংয়ের উল্লেখ করে না। এর অর্থ হ'ল যে অনুঘটকটি যেকোন পরিকল্পনা ক্যাশেড টেবিলটিকে একাধিকবার স্ক্যান করার সাথে জড়িত।

PS: আমি 4 বিন্দুটি কল্পনা করতে পারি না :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.