img

اسکالا نیروبخش پروژه Apache Spark

/
/
/

scala، که مخففی برای Scalable Language (زبان مقیاس پذیر) می‌باشد، یک زبان برنامه نویسی چند روشی(multi-paradigm)، statically typed، type-safe، می‌باشد که تمرکز آن بر روی خدمات محور است. امروزه به طور گسترده ای توسط دانشمندان داده ای مورد کاربرد قرار می‌گیرد، محبوبیت آن در آینده به دلیل رشد فزاینده در داده‌های کلان و زمینه‌های علوم داده ای افزایش خواهد یافت.

دنیا از طرف بازه ی گسترده ای از منابع آماج سیلی از اطلاعات قرار دارد. داغ ترین سویه ها(trend) در زمینه ی تکنولوژی در حال حاضر علوم داده ای و داده‌های کلان می‌باشند، که هر دوی آنها راه هایی را در برابر سیل عظیم اطلاعات ارائه می‌دهند. بسیار از بستر‌ها در این فضا ایجاد شده اند، اما Apache Spark و Scala هم راستای یکدیگر برای حل چالش هایی که این حجم بیکران از داده پدید می‌آورد، کار می‌کنند. آنها در حال حاضر در Facebook، Pinterest، NetFlix، Conviva و TripAdvisor، و سایر جاهای دیگر جهت داده کلان و یادگیری ماشین به کارگیری می‌شوند.

Scala چیست؟
Scala یعنی زبان مقیاس پذیر(Scalable Language). این زبان به عنوان زبانی شی گرا(object-oriented) و تابع ساز(functional) توسعه یافت. همه چیز در Scala یک شیء محسوب می‌گردد، حتی داده‌های ابتدایی آن نیز شیء هستند.
اگر شما تکه ای کد را به زبان Scala بنویسید، خواهید دید که شمایل آن به زبان‌های اسکریپت نویسی شباهت دارد. این زبان بسیار قدرتمند، در عین حال جمع و جور است، و تنها به چند خط کوتاه از کد را در مقایسه با سایر زبان‌های برنامه نویسی می‌طلبد. به دلیل مشخصاتش و پشتیبانی از برنامه نویسی همزمان و برنامه نویسی توزیع شده(distributed/concurrent programming)، استفاده از این زبان در جریان دادن داده(data streaming)، پردازش دسته ای(batch processing)، AWS Lambda Expression و تحلیل در Apache Spark محبوبیت دارد. این زبان از زبان هایی است که بسیار مورد توجه دانشمندان داده قرار دارد، و محبوبیت آن در آینده نیز به دلیل انفجار اطلاعات و قلمرو‌های علوم داده ای افزایش چشمگیری خواهد داشت.

Apache Spark چیست؟
Apache spark یک چهارچوب پردازش خوشه ای بر مبنای چهارچوب Hadoop’s MapReduce می‌باشد. Spark از پردازش خوشه ای در-حافظه برخوردار است، که به افزایش سرعت پردازش ها، با کاهش زمان عبور ورودی و خروجی، کمک می‌کند. این چهارچوب به طور گسترده ای برای مسائل داده‌های کلان استفاده می‌شود که دلیل آن پشتیبانی از معماری توزیع پذیر و توانایی‌های پردازش موازی می‌باشد.
Apache Spark به دلیل اینکه از پردازش جریان و پرسمان تعاملی برخوردار می‌باشد به Hadoop ترجیح داده می‌شود.
به منظور ارائه سطح وسیعی از خدمات، این چهارچوب به صورت داخلی از کتابخانه هایی چون GraphX، SparkSQL و MLlib بهره می‌برد. Spark از python، Scala، Java، و R به عنوان زبان‌های برنامه نویسی پشتیبانی می‌کند، که البته از هه بیشتر Scala محبوب‌تر است.

دلایل استفاده از Scala
۸۸ درصد از استفاده کنندگان Spark به دلایل زیر با Scala کد نویسی می‌کنند:
۱- Apache Spark با Scala نوشته شده است و در JVM مقیاس پذیر است. خبره بودن در Scala به شما کمک می‌کند که به درون منبع کد Spark رسوخ کرده، تا بتوانید به آسانی به جدیدترین و آخرین ویژگی‌ها دسترسی پیدا کرده و آنها را پیاده سازی کنید.
۲- Spark با Scale پیاده سازی شده است، بنابراین از حداکثر امکانات در اولین نسخه منتشر شده برخوردار است. ویژگی هایی از Scala وارد شده اند تا از زبان هایی همچون python پشتیبانی شود.
۳- هم کنش پذیری Scala با جاوا بزرگترین مزیت آن است، به طوری که توسعه دهندگان جاوا به راحتی مفاهیم شیء گرایی را درک می‌کنند. شما همچنین می‌توانید کد‌های جاوا را درون یک کلاس Scala بنویسید.
۴- Scala یک نوع زبان ایستا می‌باشد. این زبان شبیه یک زبان نوع پویا به نظر می‌رسد چون از مکانیزم‌های ارتباط با انواع پیشرفته ای سود می‌جوید. این مطلب به عملکردی بهبود یافته می‌انجامد.
۵- Scale وسعت ایده سازی (expressive power) یک زبان برنامه نویسی پویا را بدون تحت شعاع قرار دادن امنیت ارائه می‌دهد.
۶- این زبان به منظور رایانش موازی (parallelism) و هم روندی(concurrency) در خدمت به کاربردهای داده ای کلان طراحی شده است. Scala برخوردار از پشتیبانی از هم روندی داخلی با کیفتی می‌باشد و با داشتن کتابخانه‌های چون، Akka امکان ساختن برنامه هایی مقیاس پذیر را به شما می‌دهد.
۷- Scala به خوبی درمیان چهارچوب MapReduce کار می‌کند که دلیل آن طبیعت عملکرد آن است. بسیار از چهارچوب‌های داده Scala از نوع داده ی انتزاعی مشابه ای پیروی می‌کنند که متشکل از مجموعه ای از API‌های Scala می‌باشد. توسعه دهندگان تنها ملزم اند که مقدمات مجوعه‌های استاندارد را یاد بگیرند، که آنها را قادر می‌ساز به سادگی با سایر کتابخانه‌ها آشنا گردند.

نصب Scala
Scala می‌تواند بر روی ویندوز یا سیستم‌های مبتنی بر linux نصب شود. نصب جاوا قبل از نصب scala ضروری است. مراحل پیش رو Scala 2.11.7 را بر روی Ubuntu 14.04 با جاوای ۷ نصب می‌کند. فرمان هایی که در ادامه آمده اند را در ترمینال تایپ کنید.

۱- برای نصب جاوا تایپ کنید:

$ sudo apt-add-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer

۲- برای نصب Scala، تایپ کنید:

$ cd -/Downloads
$ wget http://www.scala-lang.org/files/archives/scala.
۲٫۱۱٫۷٫deb
$ sudo dpkg -i scala-2.11.7.deb
$ scala –version

کار با Spark RDD با استفاده از Scala
مجموعه داده‌های توزیع شده ی ارتجاعی (RDD) انواع داده ابتدایی از Spark هستند. اینها می‌توانند به دو روش تولید شوند—یک منبع موجود یا از یک منبع خارجی.
ایجاد RDD از یک منبع موجود: اول، به دیرکتوری home رجوع کنید و sparkcontext را با نام sc بارگذاری کنید.

$ ./bin/spark-shell

سپس، یک RDD از داده‌های موجود که قبلا در درایور برنامه ذخیره شده است ایجاد کنید. اول، ما یک آرایه خواهیم ساخت و سپس با استفاده از متد موازی کننده جهت ساخت Spark RDD از یک گردش پذیر(iterable) که پیش از این در درایور برنامه حضور داشته است اقدام می‌کنیم. کدهای مربوطه را در ذیل مشاهده می‌کنید:

val data = Array(2, 4, 6, 8)
val disData = sc.parallelize(data)

برای دیدن محتویات هر یک از RDD ها، از متود collect استفاده کنید، همانگونه که در زیر نشان داده شده است:

distData.collect()

 

ساختن RDD از یک منبع خارجی
یک RDD می‌تواند از یک منبع خارجی ساخته شود که فرمت ورودی Hadoop داشته باشد، فرمتی مثل سیستم فایل اشتراک گزارده شده، HDFS، HBase، و سایرین. اول، فایل دلخواه را با کد زیر بارگذاری کنید:

val lines = sc.textFile(“text.txt”);

به منظور نمایش دادن خطوط، از فرمانی که در زیر داده شده است استفاده کنید:

Lines.take(2)

تغییر شکل‌های مقدماتی و عمل ها
تغییر شکل‌ها (transformations) داده RDD شما را از شکلی به شکلی دیگر دستکاری می‌کنند. عمل‌ها همچنین به شما RDD دیگری می‌دهند، اما این عملیات کلیه تغییرشکل‌های ردیف شده بر روی RDD پایه را فعال(trigger) می‌کند و سپس اقدامات عملی را بر روی آخرین RDD اجرا می‌کند.
تغییرشکل نقشه: نقشه به هر المان RDD یک تابع اعمال می‌کند. کد زیر طول هر خط را چک می‌کند.

val length = lines.map(s => s.length)
Length.collect()

عمل کاهش: کاهش المان‌ها را با توجه به مقدار کلید تجمیع می‌کند. این کار به خروجی تابع نقشه اعمال می‌شود. کدی که در ادامه آمده است جمع کل کاراکترهای فایل را محاسبه می‌کند.

val totallLength = Length.reduce((a, b)) => a + b)

 

API مربوط به DataFrame
DataFrame یک مجموعه داده توزیع یافته می‌باشد که به صورت ستون هایی که مشابه سامانه‌های پایگاه داده ای نسبی است، سر و شکل یافته است.
DataFrame با جداول Hive، فایل‌های داده ای ساختاریافته، پایگاه داده خارجی یا RDD‌های موجود قابل ایجاد است. API متعلق به DataFrame از یک الگو برای توصیف داده استفاده می‌کند، که به Spark اجازه مدیریت این الگو را داده و فقط داده را میان نودها (nodes) منتقل می‌کند.
این از سریال سازی جاوا بهینه تر است. این کار هنگامی مفید است که رایانش در یک پروسه انجام می‌شود، از آنجایی که Spark می‌تواند داده را به صورت ذخیره سازی off-heap با فرمت دو دویی سریال سازی کند و سپس تعداد زیادی تغییر شکل را مستقیما بر روی آن انجام دهد، که موجب کاهش هزینه‌های بازیافت حافظه ی ساختن اشیای مفرد برای هر ردیف در مجموعه ی داده می‌گردد.
چون Spark الگو را درک می‌کند، ما مجبور نیستیم از سریال سازی جاوا برای کد بندی داده استفاده کنیم. کد پیش رو به بررسی تعداد از توابع مربوط به DataFrame می‌پردازد.
اول، شیء sparkcontext را به ترتیب زیر بسازید:

val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

سپس، یک شیء JSON خارجی را بخوانید و آن را در DataFrame dfs ذخیره کنید، بعد آن را نمایش دهید و پرینت کنید، به وسیله ی کدی که در زیر می‌بینید:

val dfs = sqlContext.read.json(“employee.json”)
dfs.show()
dfs.printSchema()

 

API مربوط به DataSet
API مربوط به DataSet کدبند هایی دارد که میان نمایندگان JVM (اشیاء) و فرمت داخلی دو دویی Spark ترجمه انجام می‌دهند. Spark از کدبند‌های داخلی سود می‌برد، که به قدری قدرتمند هستند که بایت کد را ایجاد کرده و با داده off-heap ترکیب می‌کنند و دسترسی در لحظه تقاضا را برای صفت‌های مفرد فراهم آورده، بدون اینکه مجبور به از سریال خارج سازی تمامی یک شیء باشد. علاوه بر این، API مربوط به DataSet به گونه ای طراحی شده که به خوبی با Scala کار می‌کند. هنگام کار با شیء‌های java، مهم است که آنها کاملا با javaBean در توافق باشند. کد زیر تعدادی تابع مقدماتی را بررسی می‌کند:

val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val sampleData: Seq[ScalaPerson] = ScalaData.sampleData()
val dataset = sqlContext.createDataset(sampleData)

 

Scala در برابر Python debate
Scala و python هر دو قدرتمند هستند و در میان دانشمندان داده محبوبیت دارد، بسیاری از این دانشمندان هر دوی این زبان‌ها را فراگرفته و به کار می‌بندند. Scala سریع تر است و نسبتا کار با آن آسان است، در حالی که python کندتر بوده اما کار با آن بسیار آسان است. اما python معمولا در مکان دوم قرار می‌گیرد به این دلایل:
۱- Scala معمولا از python ده برابر سریع تر است، کد python به ترجمه و تبدیل بسیاری نیاز دارد، که آن را کمی کند کند می‌کند. به همین دلیل عملکرد آن زیر سایه می‌رود. Scala در عملکرد برتری دارد، هنگامی تعداد هسته ی پردازنده کم تری وجود دارد.
۲- Scala در هم روندی بهتر است زیرا که توانایی این را دارد که به آسانی در میان چندین پایگاه داده ای و سرویس‌ها یکپارچه شود. Scala دارای دارای کتابخانه‌های ناهمگام و هسته‌های واکنش دهنده می‌باشد. Python از عهده ی چند شاخه کردن پردازش‌های سنگین برای پردازش چند رشته ای یا موازی بر نمی آید.
۳- Scala چندین «نوع ماهیتی» دارد، ماکرو‌ها و تلویحی‌ها (implicits). برتری‌های این زبان زمانی آشکار می‌گردد که از این امکانات قدرتمند در کتابخانه‌ها و چهارچوب‌های مهم استفاده گردد. Scala برای برای جاری سازی (streaming) spark بهترین انتخاب است، زیرا که پشتیبانی python از جریان سازی spark به اندازه scala تکامل یافته و پیشرفته نیست.
Scala نسبت به python از کتابخانه‌های یادگیری ماشین و و پردازش‌های زبان‌های طبیعی کم تری برخوردار است. کتابخانه تنها تعداد محدودی الگوریتم دارد اما آنها برای کاربردهای داده ی کلان کفایت می‌کنند. Scala فاقد تصویر سازی و تغییر شکل موضعی داده ی مناسب است. در هر حال، Scala نسبت به python ترجیح داده می‌شود، زیرا که python برای قابل حمل سازی باگ‌های بسیاری ایجاد می‌کند و ترجمه آن دشوار است. عملکرد خوب scala در ترکیب برنامه نویسی تابع محور و شیء گرا ممکن است برای شما غافلگیر کننده باشد و کمی طول می‌کشد که قوانین نوشتاری آن را یاد بگیرید. تسلط به scala برای project spark ممکن است سخت باشد، ولی ارزش وقتی که برای آن می‌گذارید را دارد.

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

It is main inner container footer text