اسئلة نهائية لمقرر تقنية تصميم صفحات الويب - 1266
اعداد الطالبة: أنوار شوخة – فرع رام الله والبيرة
كلية التكنولوجيا والعلوم التطبيقية
جامعة القدس المفتوحة
يوم البرمجيات الحرّة 2014 - البرمجيّات الحرّة و بناء واجهات التطبيق البرمجيّة...hossamzee
عرضٌ تقديميّ موجّه للمطوّرين، يعطي نبذةً و تعرفةً عن الواجهات البرمجيّة للتطبيق (API)، و خوادم الويب الحاليّة و السابقة، و بعض الأدوات مفتوحة المصدر المستخدمة في بناء مثل هذه الواجهات، و مثالاً مبسّطاً لها.
اسئلة نهائية لمقرر تقنية تصميم صفحات الويب - 1266
اعداد الطالبة: أنوار شوخة – فرع رام الله والبيرة
كلية التكنولوجيا والعلوم التطبيقية
جامعة القدس المفتوحة
يوم البرمجيات الحرّة 2014 - البرمجيّات الحرّة و بناء واجهات التطبيق البرمجيّة...hossamzee
عرضٌ تقديميّ موجّه للمطوّرين، يعطي نبذةً و تعرفةً عن الواجهات البرمجيّة للتطبيق (API)، و خوادم الويب الحاليّة و السابقة، و بعض الأدوات مفتوحة المصدر المستخدمة في بناء مثل هذه الواجهات، و مثالاً مبسّطاً لها.
تحليل البيانات باستخدام برنامج ( Spss ) المهارات، الأساسيات ‘التطبيقاتعلي داخل الحساني
SPSS الهدف من الدورة هو تطوير وزيادة كفاءة الكوادر التدريسية وطلبة الدراسات العليا في كلية الطب البيطري من خلال إعطاء معلومات في
ومن خلال التوضيح والشرح المبسط والمفصل نوعاً ما ، ليستفيد المتلقي قدر الإمكان ولزيادة المعلومات قدر الإمكان.
Getting Started with Content Registration - Arabic Webinar Crossref
A webinar discussing getting started with content registration at Crossref. Including the different methods of registering your content with us and new tools to help. Webinar ran in Arabic by Ambassador Mohamad Mostafa, 17 September 2018.
Network Fundamental book
It covers all the fundamentals you need to get you started at Network field, it includes:
- Network Topology
- Network Devices
- Network Models
-- OSI Model
-- TCP/IP Model
- IP Address
- Subnetting
- Headers
- Cables
- Intro to Cisco Router and Switch Components
تحليل البيانات باستخدام برنامج ( Spss ) المهارات، الأساسيات ‘التطبيقاتعلي داخل الحساني
SPSS الهدف من الدورة هو تطوير وزيادة كفاءة الكوادر التدريسية وطلبة الدراسات العليا في كلية الطب البيطري من خلال إعطاء معلومات في
ومن خلال التوضيح والشرح المبسط والمفصل نوعاً ما ، ليستفيد المتلقي قدر الإمكان ولزيادة المعلومات قدر الإمكان.
Getting Started with Content Registration - Arabic Webinar Crossref
A webinar discussing getting started with content registration at Crossref. Including the different methods of registering your content with us and new tools to help. Webinar ran in Arabic by Ambassador Mohamad Mostafa, 17 September 2018.
Network Fundamental book
It covers all the fundamentals you need to get you started at Network field, it includes:
- Network Topology
- Network Devices
- Network Models
-- OSI Model
-- TCP/IP Model
- IP Address
- Subnetting
- Headers
- Cables
- Intro to Cisco Router and Switch Components
قواعد المعطيات التقليدية كانت منذ زمن هي الخيار الأمثل الذي تستخدمه الشركات لتقوم بتخزين بياناتها. لكن مع الازدياد الكبير في حجم البيانات وتنوع هذه البيانات ظهر مفهوم الـ big data وبدأت الشركات تستخدم تقنيات مثل Hadoop
Hadoop تخزن وتعالج الـ Big Data باستخدام بيئات معالجة processing مثل: MapReduce ,Hive ,Hbase ,Pig وبيئات تخزين مقل: HDFS وذلك للاستفادة من المعالجة والتخزين الموزع.
نقل البيانات بين قواعد المعطيات العلائقية وHadoop يحوي صعوبة وتعقيدات تقنية
يجب القيام بتحضير مسبق للبيانات الموجودة ضمن قاعدة المعطيات قبل أن تستطيع Hadoop أن تصل إلى هذه البيانات
يتم استخدام Sqoop من قبل الكثير من الشركات لنقل البيانات بين قواعد المعطيات وHadoop
مثلا شركة التسويق الإلكترونية Coupons.com تستخدم Sqoop لنقل البيانات بين Hadoop وبين مستودع البيانات IBM Netezza
ميزات Sqoop:
سهلة الاستخدام
تدعم الكثير من قواعد البيانات
تقدم أمان security عالي
تتكامل بشكل جيد مع مكونات Hadoop ecosystem الأخرى
تنقل البيانات على التوازي مما يعطي تحسين في الأداء
تستخدم JDBC connectors للاتصال بقواعد المعطيات ,هذه الـ connectors تؤمن نقل فعال للبيانات بشكل يضمن سلامتها واتساقها consistency.
يمكن بشكل سهل بناء connectors جديدة للاتصال مع قواعد معطيات مختلفة
تتحمل العبء وتقدم معالجة للأخطاء بشكل جيد
كيف تعمل Sqoop؟
تؤمن Sqoop للمستخدم Command line interface
عندما يقوم المستخدم بإدخال command يتم معالجته من قبل Sqoop وإطلاق Hadoop Map only job لاستيراد وتصدير البيانات
ملاحظة: لا يتم إطلاق مهمات Reduce لأنها تستخدم لإجراء تجميع للبيانات وSqoop تقوم بنقل للبيانات فقط ولا تحتاج لمهمات Reduce
الـ Map job يقوم بإطلاق عدد من الـ mappers (العدد يمكن أن يحدده المستخدم)
كل mapper task يتم إسناد لها جزء من البيانات اعتمادا على الـ primary key الخاص بالجدول
تقوم Sqoop بتوزيع البيانات على الـ mappers بالتساوي وذلك للحصول على أداء عالي
الآن كل mapper ينشأ اتصال لقاعدة المعطيات باستخدام JDBC ويقوم بجلب الجزء من البيانات المسند له ويقوم بكتابته إلى HDFS أو Hive أو HBase
Sqoop تعتبر مجموعة من الـtools .
لاستخدام sqoop نحدد الـ tool التي نريد استخدامها ونحدد الـ arguments التي تتحكم بهذه الأداة
صيغة استخدام الأداة:
sqoop tool-name [tool-arguments]
لعرض قائمة بجميع الأدوات المتاحة نستخدم help tool التي تأتي مع sqoop كالتالي حيث نكتب: sqoop help
sqoop-import
import tool تقوم بعملimport لجدول من قاعدة المعطيات إلى HDFS
كل row ضمن الجدول يمثل كـ record ضمن HDFS
تُخزن الـ records كملفات نصية حيث تُفصل القيم بفاصلة أو بمحرف آخر ويتم وضع كل row في سطر جديد
للاتصال بقاعدة المعطيات نقوم بتحديد الـ argument: --connect
تصف هذه الـ argument الـ server وقاعدة المعطيات التي سنقوم بالاتصال بها
مثلا:
$ sqoop import --connect jdbc:mysql://database.example.com/employees
سيتم الاتصال بقاعدة المعطيات MySQL موجودة باسم employees على الجهاز database.example.com
لا يصح أن يكون عنوان الجهاز localhost إذا كنا نستخدم Sqoop على Hadoop cluster
حيث كل الـ TaskTracker nodes ستتصل إلى قاعدة المعطيات المحددة عن طريق –connect ,وفي حال كان العنوان localhost ستتصل كل node لقاعدة معطيات مختلفة أو يفشل الاتصال بدلا من ذلك نحدد العنوان الخاص بالجهاز الذي يحوي قاعدة المعطيات وبالتالي يمكن لجميع الـ nodes الوصول له
عند الاتصال بقاعدة المعطيات نحدد الـ --username والـ --password
نستخدم الـ argument: --table لنحدد الجدول ضمن قاعدة المعطيات لاستيراده
نستخدم الـ argument: --columns لتحديد عواميد محددة من جدول لاستيرادها
آلية عمل الاستيراد بشكل متوازي:
تقوم Sqoop باستيراد البيانات بشكل متوازي ,يمكن أن نقوم بتحديد عدد الـ map tasks التي ستقوم بعمليات الاستيراد عن طريق الـ argument: --num-mappers
بشكل افتراضي يتم استخدام 4 مهمات. زيادة هذه القيمة يعتمد على إعدادات بيئة العمل. قد يؤدي زيادة هذه القيمة إلى زيادة الحمل على قاعدة المعطيات وبالتالي ضعف في الأداء
لتوزيع البيانات بين الـ map tasks تقوم Sqoop باستخدام أحد الأعمدة ضمن قاعدة المعطيات لإجراء التقسيم (غالبا عمود الـ primary key)
يمكن اختيار عمود باستخدام --split-by
تقوم Sqoop بتوزيع البيانات بشكل متساوي على الـ map tasks
مثلا: بفرض أننا أردنا الاستيراد من جدول فيه عمود الـ primary key يأخذ القيم من 0 إلى 1000. ستقوم Sqoop بإنشاء أربعة map tasks وتقوم بإسناد لكل منها 250 rows.
الآلية المتبعة لإجراء عملية import:
تقوم sqoop بإرسال طلب إلى قاعدة المعطيات للحصول على metadate information
تستجيب قاعدة المعطيات على الطلب بإعادة الـ metadata information المطلوبة
اعتمادا على هذه الـ metadata information تقوم sqoop بتوليد java classes
يتم إجراء تقسيم للـ table اعتمادا على الـ primary key الخاص بالـ table
يتم إنشاء عدد منmappers كل منها يكون باستيراد جزء معين من الجدول على التوازي (بنفس الوقت)
بما أن عملية الـ import تنفذ على التوازي ,سيكون الخرج ضمن عدة ملفات
كل mapper يقوم بنقل البيانات باستخدام عدد من الـ transactions لضمان عدم حدوث ضياع في البيانات ولتقليل استهلاك الموارد
بعد أن يتم معالجة الـ records التي تم استيرادها إلى HDFS (عن طريق MapReduce أو Hive مثلا) ينتج لدينا بيانات نرغب في تصديرها مرة أخرى إلى قاعدة المعطيات
الأداة export يتم استخدامها لتصدير مجموعة من الملفات من HDFS إلى قاعدة المعطيات
يجب أن يتواجد الجدول الذي سيتم النقل إليه ضمن قاعدة المعطيات
سيتم قراءة الملفات وتحويلها إلى مجموعة من الـ records وفقا لـ delimiters (يتم تحديدها من قبل المستخدم)
طريقة النقل:
بشكل افتراضي يتم نقل الـ records إلى قاعدة المعطيات عن طريق INSERT statements
عن طريق الـ UPDATE mode سيتم استخدام UPDATE statements لتحديث الـ records الموجودة في قاعدة المعطيات
باستخدام الـ argument: --update-key نحدد أسماء الأعمدة التي سيتم استخدامها ضمن الـ UPDATE statements لتحديد الـ rows التي سيتم تعديلها
عن طريق call mode سيتم استدعاء stored procedure من أجل كل record يتم نقله
بشكل افتراضي سيتم تصدير كل الأعمدة ضمن الجدول ,يمكن تحديد أعمدة لتصديرها عن طريق الـ arguement: --columns
Arguments إلزامية عند استخدام الأداة export:
--export-dir : يحدد الـ directory ضمن HDFS الذي يحوي ملفات البيانات التي نريد تصديرها
--table : يحدد اسم الـ table الذي سيتم نقل البيانات له
أو –call : يحدد اسم الـ stored procedure التي سيتم استدعائها
أداء عملية الـ export يعتمد على إلى أي درجة يكون النقل على التوازي. Sqoop تستخدم أربعة tasks على التوازي لإجراء عملية الـ export
هذا قد لا يكون أمثلي. يختلف عدد الـ tasks المناسب حسب إعدادات كل بيئة ,يمكن لـ tasks إضافية أن تحسن من التزامن ,لكن في حالات عندما تكون قاعدة المعطيات تحوي نقطة ضعف في استخدام الـ indices على سبيل المثال سيؤدي الـ load الإضافي إلى حدوث انخفاض في الأداء
يمكن تحديد عدد الـ map tasks عن طريق الـ argument: --num-mappers
تقوم Sqoop بشكل تلقائي بتوليد code الذي سيستخدم لمعالجة الملفات التي تحوي البيانات التي سنقوم بتصديرها إلى قاعدة المعطيات
يمكن إعادة استخدام الـ code الذي تم توليده كنتيجة لعملية import سابقة
إذا كانت عملية الـ export تقوم بمحاولة إجراء insert لأسطر ضمن قاعدة البيانات بشكل لا يتوافق مع القيود المعرفة على قاعدة المعطيات (مثلا الـ primary key موجود مسبقا ضمن الجدول) ,سيتم فشل عملية الـ export
بما أن Sqoop تقوم بتقسيم عملية الـ export إلى عدة transactions ,فإن فشل أحد الـ export jobs قد يؤدي لنقل جزئي للبيانات إلى قاعدة المعطيات. هذا سيؤدي بالتالي إلى فشل مزيد من الـ jobs بسبب حصول عدم تناسق بين البيانات أو بسبب حدوث تكرار لها.
يمكن علاج هذه المشكلة عن طريق تحديد staging table عن طريق الـ option: --staging-table
حيث ستقوم الـ map tasks بتعبئة البيانات ضمن الـ staging table
بعد وصول البيانات كاملة سيتم نقلها إلى الـ table في قاعدة المعطيات عن طريق transaction وحيدة
في حال الفشل يؤدي استخدام الـ staging table إلى حفظ سلامة البيانات واتساقها.
يجب إنشاء الـ staging table قبل تنفيذ الـ export job
بنية هذا الجدول يجب أن تكون مطابقة لبنية الجدول الأساسي
يجب أن يكون الـ staging table فارغ أو يتم استخدام الـ option: --clear-staging-table
مثال:
$ sqoop export --connect jdbc:mysql://db.example.com/foo --table bar --export-dir /results/bar_data
سيتم تصدير محتوى الملفات الموجودة ضمن /results/bar_data إلى الجدول bar ضمن قاعدة المعطيات foo
يتم تنفيذ تصدير البيانات عن طريق عدد من الـ writers تعمل على التوازي. كل writer يستخدم connection منفصل لقاعدة المعطيات ويقوم بإجراء عدد من الـ transactions.
يتم استخدام عدد من الـ transactions لنقل البيانات لضمان عدم حدوث ضياع في البيانات والتقليل من استهلاك الموارد
في أغلب الأحيان لا نكون بحاجة إلى نقل جداول كاملة بين Hadoop وقاعدة المعطيات ,بل نكون بحاجة لنقل عدة أسطر جرى عليها تعديل مثلا أو تمت إضافتها وهنا تأتي فائدة الميزة التي تدعمها sqoop وهي: incremental imports
تقوم هذه الميزة بإحضار الأسطر الجديدة من الجدول المطلوب أي الأسطر التي تختلف عن الأسطر التي تم إحضارها سابقا
--check-column عن طريق هذه الـ argument نحدد العمود ضمن الجدول الذي سنستخدمه كمرجع لتحديد الأسطر التي سنحضرها
--last-value عن طريق هذه الـ arguement نحدد آخر قيمة ضمن الـ check-column من الأسطر التي تم إحضارها سابقا ,سنستخدم هذه القيمة عند إحضار الأسطر الجديدة
Sqoop تدعم نوعين من الـ incremental imports: append وlastmodified
نستخدم append عندما نكون نستورد جدول من قاعدة المعطيات يتم بالعادة إضافة جديدة له ويكون لكل سطر Id جديد ,نحدد العمود الذي يحوي قيم الـ Ids عن طريق --check-column
تقوم sqoop باستيراد الأسطر من قاعدة المعطيات التي لها قيمة ضمن الـ check column أكبر من القيمة –last-value
مثلا: إذا كان لـ check column هو العمود id وكانت –last-value 100 ,عندئذ سيتم استيراد الأسطر فقط من قاعدة المعطيات لها id أكبر من 100.
نستخدم lastmodified عندما يكون الجدول الذي نقوم باستيراده يتم إجراء update لسطوره بالعادة. عندما يتم إجراء update يتم تحديث قيمة عمود يدعى last-modified column للوقت الحالي. الآن الأسطر التي تحوي توقيت أكبر من التوقيت المحدد عن طريق –last-value سيتم استيرادها
عندما نريد إجراء incremental import جديد يجب أن نحدد الـ --last-value حتى نتأكد أن الاستيراد سيكون بالضبط للأسطر في قاعدة المعطيات التي تمت إضافتها أو التعديل عليها.
يفضل أن إنشاء الـ incremental imports كـ saved jobs في هذه الحالة يتم التعديل على قيمة –last-value بشكل تلقائي
عمليات الـ import والـ export بين قاعدة المعطيات وHadoop من الممكن أن نحتاج لتنفيذها الكثير من المرات وبالتالي يتم تنفيذ نفس الـ commands في كل مرة. هذا الأمر يشكل مشكلة وبشكل خاص عندما نكون نقوم بـ incremental import
للتعامل مع هذا الأمر فإن Sqoop تقدم إمكانية تعريف saved jobs. الـ saved job تقوم بتسجيل معلومات الـ configuration الخاصة بتنفيذ command ما ليتم تنفيذه في وقت لاحق.
يتم ذلك عن طريق الأداة: sqoop job
إذا كان الـ job يقوم بـ incremental import فسيتم تحديث الـ state الخاصة آخر أسطر تم استيرادها من أجل تنفيذ الاستيرادات الجديدة في المرة القادمة.
تعريف saved job
$ sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db --table mytable
نلاحظ أننا استخدمنا –create لإنشاء job باسم myjob ثم كتبنا الأمر الذي سيقوم هذا الـ job بتنفيذه
يمكن أن نراجع الـ configuration الخاصة بjob معين عن طريق:
$ sqoop job --show myjob
يمكن تنفيذ الـ job عن طريق:
$ sqoop job --exec myjob
يمكن عرض جميع الـ saved jobs المتاحة عن طريق:
$ sqoop job –list
تحوي sqoop أداة تدعى metastore تقوم هذه الأداة بإعداد مستدوع repository للـ metadata مشترك بين جميع المستخدمين.
عن طريق هذا المستودع يمكن للعديد من المستخدمين المحليين أو المتصلين عن بعد أن يقوموا بتعريف saved jobs أو تنفيذ saved jobs معرفة مسبقا ضمن الـ metastore.
من الاستخدامات الأساسية للـ metastore هو أن نعرف saved jobs ونجعلها متاحة ضمن الـ metastore وبالتالي يمكن لجميع المستخدمين أن يستخدموا هذه الـ jobs.
عن طريق تنفيذ sqoop-metastore نقوم بإطلاق قاعدة معطيات HSQLDB على الـ machine الحالية. تكون قاعدة المعطيات هذه مشتركة بين جميع المستخدمين.
الآن يمكن للـ clients الاتصال بقاعدة المعطيات هذه وتعريف jobs التي سيتم تشاركها بين المستخدمين.
يتم الاتصال بالـ metastore عن طريق TCP/IP باستخدام المنفذ 16000.
الـ metastore يمكن أن تتم استضافتها على machine ضمن الـ Hadoop cluster أو على أي مكان آخر ضمن الشبكة.
يتم الاتصال بالـ metastore عن طريق الـ argument: --meta-connect . على سبيل المثال: --meta-connect jdbc:hsqldb:hsql://metaserver.example.com:16000/sqoop
الأداة eval تسمح للمستخدمين بتنفيذ استعلامات SQL بسيطة على قاعدة المعطيات.
سيتم طباعة الخرج إلى الـ console.
تفيد بأنها تعطي للمستخدمين فرصة أن يراجعوا الاستعلامات التي سيقومون باستخدامها لاستيراد البيانات إلى Hadoop قبل أن يقوموا بذلك فعليا.
تفيد أيضا بالتأكد من توافر الاتصال مع قاعدة المعطيات.
$ sqoop eval --connect jdbc:mysql://db.example.com/corp \ --query "SELECT * FROM employees LIMIT 10”
مثلا عن طريق الأمر السابق قمنا بتنفيذ استعلام على قاعدة المعطيات حيث حددنا الاستعلام الذي نريد تنفيذه عن طريق الـ argument: --query
يمكن أن نقوم بسرد جميع الـ databases المتاحة ضمن مخدم قواعد المعطيات عن طريق الأداة list-databases
مثلا نقوم بسرد جميع قواعد المعطيات المتاحة ضمن MySQL server:
$ sqoop list-databases --connect jdbc:mysql://database.example.com/
يمكن أن نقوم بسرد جميع الـ tables الموجودة ضمن database معينة
مثلا نقوم بسرد جميع الجداول الموجودة ضمن قاعدة المعطيات corporation:
$ sqoop list-tables --connect jdbc:mysql://database.example.com/corporation
باستخدام sqoop يمكن أن نقوم بإجراء import أو export للبيانات من وإلى قواعد البيانات التي تدعم JDBC interface
تسمح sqoop ببناء connectors إضافية يمكن أن يتم ذلك لتحسين أداء النقل من أجل بعض أنظمة قواعد المعطيات
الـ connector تكون مصممة من أجل database vendor معينة ,مثلا MySQL Connector لن يعمل مع قاعدة المعطيات PostgreSQL
العديد من الشركات في مجال الـ IT تقدم connectors خاصة بها للتعامل مع قواعد المعطيات الخاصة بها
مثلا Microsoft تستخدم Sqoop-based connector لنقل البيانات من قواعد المعطيات الخاصة بـ Microsoft SQL Server إلى Hadoop
الـ JDBC drivers لا تأتي جاهزة مع برمجية Sqoop بل يجب أن نقوم بتحميلها وإضافتها لـ sqoop بشكل يدوي
الـ Connectors والـ drivers يتم تنزيلهم فقط على الـ machine التي تقوم بتنفيذ Sqoop وليس على كل الـ nodes ضمن الـ Hadoop cluster
عند الاتصال مع قاعدة المعطيات تقوم sqoop بالبحث ضمن الـ connectors المحملة بشكل يدوي وتبحث إن كان هناك connector يوافق قاعدة المعطيات التي نحاول أن نتصل بها.
إذا لم تجد تقوم sqoop بالبحث ضمن JDBC URL (يبدأ بـ jdbc:) لتفحص إن كانت قاعدة المعطيات التي نحاول أن نتصل بها تملك connector موجود بشكل افتراضي built-in ضمن sqoop.
إذا لم تجد أي connectors تقوم باستخدام الـ connector الافتراضي: Generic JDBC Connector
بعد أن يتم اختيار الـ connector يتم اختيار الـ JDBC driver.
من أجل أغلب قواعد المعطيات هناك JDBC driver وحيد يتم استخدامه.
مثلا MySQL connector سيقوم باستخدام MySQL JDBC Driver (والذي يدعى Connector/J)
الاستثناء لذلك هو عندما نستخدم الـ connector الافتراضي Generic JDBC Connector ,هذا الـ connector غير مرتبط بقاعدة معطيات محددة ,في هذه الحالة يجب أن نحدد اسم الـ driver عن طريق الـ parameter: –driver
الآن بعد أن تم تحديد الـ connector والـ driver يتم إنشاء الاتصال بين الـ Sqoop client وقاعدة المعطيات.