از زمان به وجود آمدن Apache Spark در یازده سال پیش، این پلتفرم به طرز چشمگیری و به طور مداوم اولین انتخاب توسعه دهندگان داده های بزرگ بوده است. توسعه دهندگان همیشه آن را به دلیل ارائه API های ساده و قدرتمند که می توانند تقریبا هر تجزیه و تحلیل را روی داده های بزرگ انجام دهند، پسندیده اند. در این مقاله، می کوشیم که به یکی از جنبه های جذاب تحلیل داده توسط اسپارک یعنی RDD ها بپردازیم.
Spark یک موتور پردازش توزیع شده است، یعنی این امکان را به ما می دهد که در یک محیط توزیع شده (در یک Cluster شامل چندین server) بتوانیم عملیات ETL و آماده سازی داده ، تحلیل داده ،پیاده سازی الگوریتم های یادگیری ماشین ، پردازش جریان و غیره را انجام دهیم.
در شکل زیر مولفه های Spark را می توانیم ببینیم که روی Spark Core پایه گذاری شده اند:
مولفه های Spark
Spark برای مدیریت منابع توزیع شده در خوشه از Standalone Scheduler به شکل پیش فرض استفاده می کند، اما می توان از Hadoop Yarn ، Mesos ، EC2 و غیره نیز استفاده کرد.
نکته ی اساسی در مورد Spark این است که بر خلاف MapReduce، data sharing بهینه تری دارد و به شکل In-memory کار می کند و این یکی از دلایل اساسی بالا بودن سرعت Spark نسبت به MapReduce است.
اجرا یک Job در Spark به شکل In-memory
اجرا یک Job در Map reduce به شکل Disk Base
یکی از مهمترین صورت مسئله ها در یک پروژه ی داده، نحوه ی ذخیره سازی داده برای نگهداری و همچنین مدل داده ای برای پردازش و تحلیل است. در بخش تحلیل، اسپارک از یک مدل داده ای In-memory به نام RDD (resilient distributed dataset) استفاده می کند که قابلیت تقسیم شدن به چند پارتیشن را نیز دارد .
RDD می تواند به چندین Partition تقسیم شود.
نحوه ی توزیع شدن پارتیشن های یک RDD در Worker Node ها
در هر Job یک Spark DAG ایجاد می شود که در نهایت به یک خروجی توسط Action برسیم
انجام Transformation که منجر به ساخت RDD ها می شود و انجام Action که Job را اجرا می کند
با وجود تمام قابلیت های RDD، با رشد استفاده از این پلتفرم دو نوع مدل داده ای دیگر نیز در نسخه های بعدی به آن اضافه شد.
مدل داده ای Spark بر اساس تاریخ ارائه
در واقع در سطح پایین، Spark فقط RDDها را می شناسد، یعنی ساختار داده ای که با آن کار می کند RDD است، بنابراین می توان گفت که Dataset و DataFrame نوعی API سطح بالا برای کار با داده های ساخت یافته هستند که Spark در لایه ی پایین با منطق RDD با آن ها برخورد می کند.
همچنین در RDD باید به شکل دستی Schema را تعریف کنیم اما در Dataframe و Dataset این اتفاق به شکل خودکار رخ می دهد.
DataFrame ها را می توان یک مجموعه ی توزیع شده از داده های ساخت یافته در ستون هایی نام گذاری شده دانست، که معادل جداول RDBMS ها هستند. با این جداول می توان به کمک Spark SQL تعامل داشت و همچنین می توان DataFile های ساخت یافته، جداول Hive،جداول پایگاه داده ی خارجی یا RDD ها را به آن ها تبدیل نمود. DataFrame ها در زبان هایی مثل پایتون و R که نیازی به تعریف نوع داده نیست استفاده می شوند.
Dataset ها یک مفهوم شبیه به DataFrame ها هستند اما در زبان های برنامه نویسی مثل Java و Scala که نیاز به تعریف نوع داده هست (statically typed) استفاده می شوند و به عنوان یک API جدید در Apache Spark 1.6 معرفی شدند. در عملیات تجمیع از RDD ها سریع ترند اما نسبت به Dataframe ها کند می باشند. این امکان وجود دارد که Dataset از Object های JVM ایجاد شود و بعد با استفاده از Transformationهایی از قبیل filter ، Map و Flatmap و غیره کنترل شود.
DataFrame vs Dataset