شعار زيفيرنت

اجمع بين AWS Glue وAmazon MWAA لإنشاء مجموعة متقدمة من VPC واستراتيجيات تجاوز الفشل | خدمات الويب الأمازون

التاريخ:

غراء AWS هي خدمة تكامل بيانات بدون خادم تجعل من السهل اكتشاف وإعداد ونقل ودمج البيانات من مصادر متعددة للتحليلات والتعلم الآلي (ML) وتطوير التطبيقات.

غالبًا ما يتعين على عملاء AWS Glue تلبية متطلبات الأمان الصارمة، والتي تتضمن أحيانًا تأمين اتصال الشبكة المسموح به للمهمة، أو التشغيل داخل VPC محدد للوصول إلى خدمة أخرى. للتشغيل داخل VPC، يجب تعيين المهام إلى شبكة فرعية واحدة، ولكن الشبكة الفرعية الأكثر ملاءمة يمكن أن تتغير بمرور الوقت (على سبيل المثال، بناءً على الاستخدام والتوفر)، لذلك قد تفضل اتخاذ هذا القرار في وقت التشغيل، بناءً على على استراتيجيتك الخاصة.

تدفقات عمل أمازون المدارة لتدفق أباتشي (Amazon MWAA) هي خدمة AWS لتشغيل مسارات عمل Airflow المُدارة، والتي تسمح بكتابة منطق مخصص لتنسيق كيفية تشغيل المهام مثل وظائف AWS Glue.

في هذا المنشور، نعرض كيفية تشغيل مهمة AWS Glue كجزء من سير عمل Airflow، مع تحديد ديناميكي قابل للتكوين لشبكة VPC الفرعية المعينة للمهمة في وقت التشغيل.

حل نظرة عامة

للتشغيل داخل VPC، يجب تعيين مهمة AWS Glue على الأقل لاتصال يتضمن تكوين الشبكة. يسمح أي اتصال بتحديد VPC، والشبكة الفرعية، ومجموعة الأمان، ولكن للتبسيط، يستخدم هذا المنشور اتصالات من النوع: NETWORK، والتي تحدد فقط تكوين الشبكة ولا تتضمن أنظمة خارجية.

إذا كانت المهمة تحتوي على شبكة فرعية ثابتة تم تعيينها بواسطة اتصال واحد، في حالة انقطاع الخدمة على مناطق التوفر أو إذا لم تكن الشبكة الفرعية متوفرة لأسباب أخرى، فلا يمكن تشغيل المهمة. علاوة على ذلك، تتطلب كل عقدة (سائق أو عامل) في مهمة AWS Glue عنوان IP معينًا من الشبكة الفرعية. عند تشغيل العديد من المهام الكبيرة بشكل متزامن، قد يؤدي ذلك إلى نقص في عنوان IP وتشغيل المهمة بعدد أقل من العقد عما هو مقصود أو عدم تشغيلها على الإطلاق.

تسمح مهام استخراج وتحويل وتحميل AWS Glue (ETL) بتحديد اتصالات متعددة باستخدام تكوينات شبكة متعددة. ومع ذلك، ستحاول المهمة دائمًا استخدام تكوين شبكة الاتصالات بالترتيب المدرج واختيار أول تكوين يجتاز فحوصات طبية ولديه عنواني IP على الأقل لبدء المهمة، وهو ما قد لا يكون الخيار الأمثل.

باستخدام هذا الحل، يمكنك تحسين هذا السلوك وتخصيصه عن طريق إعادة ترتيب الاتصالات ديناميكيًا وتحديد أولوية التحديد. إذا كانت هناك حاجة إلى إعادة المحاولة، فسيتم إعادة ترتيب أولويات الاتصالات مرة أخرى بناءً على الإستراتيجية، لأن الظروف ربما تكون قد تغيرت منذ آخر تشغيل.

ونتيجة لذلك، فهو يساعد على منع فشل المهمة في التشغيل أو التشغيل تحت السعة بسبب نقص عنوان IP للشبكة الفرعية أو حتى انقطاع الخدمة، مع تلبية متطلبات أمان الشبكة والاتصال.

يوضح الرسم البياني التالي بنية الحل.

المتطلبات الأساسية المسبقة

لاتباع خطوات المنشور، تحتاج إلى مستخدم يمكنه تسجيل الدخول إلى وحدة تحكم إدارة AWS ولديه إذن للوصول إلى Amazon MWAA، سحابة أمازون الافتراضية الخاصة (Amazon VPC)، وAWS Glue. تحتاج منطقة AWS التي تختار نشر الحل فيها إلى القدرة على إنشاء VPC وعناوين IP مرنة. الحصة الإقليمية الافتراضية لكلا النوعين من الموارد هي خمسة، لذا قد تحتاج إلى طلب زيادة عبر وحدة التحكم.

أنت أيضًا بحاجة إلى ملف إدارة الهوية والوصول AWS دور (IAM) مناسب لتشغيل وظائف AWS Glue إذا لم يكن لديك واحدة بالفعل. للحصول على التعليمات، راجع أنشئ دور IAM لـ AWS Glue.

نشر بيئة Airflow وVPC

أولاً، ستنشر بيئة Airflow جديدة، بما في ذلك إنشاء VPC جديد مع شبكتين فرعيتين عامتين وشبكتين خاصتين. وذلك لأن Amazon MWAA تتطلب التسامح مع فشل منطقة توافر الخدمات، لذلك يجب تشغيلها على شبكتين فرعيتين في منطقتي توافر خدمات مختلفتين في المنطقة. يتم استخدام الشبكات الفرعية العامة حتى تتمكن بوابة NAT من توفير الوصول إلى الإنترنت للشبكات الفرعية الخاصة.

أكمل الخطوات التالية:

  1. خلق تكوين سحابة AWS القالب في جهاز الكمبيوتر الخاص بك عن طريق نسخ القالب مما يلي دليل البدء السريع في ملف نصي محلي.
  2. في وحدة تحكم AWS CloudFormation ، اختر كومات في جزء التنقل.
  3. اختار إنشاء مكدس مع الخيار بموارد جديدة (قياسي).
  4. اختار قم بتحميل ملف قالب واختر ملف القالب المحلي.
  5. اختار التالى.
  6. أكمل خطوات الإعداد، وأدخل اسمًا للبيئة، واترك باقي المعلمات كإعداد افتراضي.
  7. في الخطوة الأخيرة، أقر بأنه سيتم إنشاء الموارد واختيارها تقدم.

يمكن أن يستغرق الإنشاء من 20 إلى 30 دقيقة، حتى تتغير حالة المكدس إلى CREATE_COMPLETE.

المورد الذي سيستغرق معظم الوقت هو بيئة Airflow. أثناء إنشائه، يمكنك متابعة الخطوات التالية، حتى تتم مطالبتك بفتح واجهة مستخدم Airflow.

  1. على المكدس الموارد علامة التبويب، لاحظ معرفات VPC والشبكتين الفرعيتين الخاصتين (PrivateSubnet1 و PrivateSubnet2)، لاستخدامه في الخطوة التالية.

إنشاء اتصالات AWS Glue

ينشر قالب CloudFormation شبكتين فرعيتين خاصتين. في هذه الخطوة، يمكنك إنشاء اتصال AWS Glue بكل منها حتى يمكن تشغيل مهام AWS Glue فيها. أضافت Amazon MWAA مؤخرًا القدرة على تشغيل مجموعة Airflow على VPCs المشتركة، مما يقلل التكلفة ويبسط إدارة الشبكة. لمزيد من المعلومات، راجع تقديم دعم VPC المشترك على Amazon MWAA.

أكمل الخطوات التالية لإنشاء الاتصالات:

  1. في وحدة تحكم AWS Glue ، اختر اتصالات البيانات في جزء التنقل.
  2. اختار إنشاء اتصال.
  3. اختار شبكة كمصدر للبيانات.
  4. اختر VPC والشبكة الفرعية الخاصة (PrivateSubnet1) تم إنشاؤها بواسطة مكدس CloudFormation.
  5. استخدم مجموعة الأمان الافتراضية.
  6. اختار التالى.
  7. للحصول على اسم الاتصال، أدخل MWAA-Glue-Blog-Subnet1.
  8. راجع التفاصيل وأكمل الإنشاء.
  9. كرر هذه الخطوات باستخدام PrivateSubnet2 وتسمية الاتصال MWAA-Glue-Blog-Subnet2.

قم بإنشاء مهمة AWS Glue

الآن يمكنك إنشاء مهمة AWS Glue التي سيتم تشغيلها لاحقًا بواسطة سير عمل Airflow. تستخدم المهمة الاتصالات التي تم إنشاؤها في القسم السابق، ولكن بدلاً من تعيينها مباشرةً على الوظيفة، كما تفعل عادةً، في هذا السيناريو تترك قائمة اتصالات المهمة فارغة وتسمح لسير العمل بتحديد أي منها سيتم استخدامه في وقت التشغيل.

البرنامج النصي للمهمة في هذه الحالة ليس مهمًا، والغرض منه فقط هو توضيح المهمة التي تم تشغيلها في إحدى الشبكات الفرعية، اعتمادًا على الاتصال.

  1. في وحدة تحكم AWS Glue ، اختر وظائف ETL في جزء التنقل ، ثم اختر محرر النص.
  2. اترك الخيارات الافتراضية (Spark Engine و ابدأ بانتعاش) و اختار إنشاء البرنامج النصي.
  3. استبدل البرنامج النصي للعنصر النائب بكود Python التالي:
    import ipaddress
    import socket
    
    subnets = {
        "PrivateSubnet1": "10.192.20.0/24",
        "PrivateSubnet2": "10.192.21.0/24"
    }
    
    ip = socket.gethostbyname(socket.gethostname())
    subnet_name = "unknown"
    for subnet, cidr in subnets.items():
        if ipaddress.ip_address(ip) in ipaddress.ip_network(cidr):
            subnet_name = subnet
    
    print(f"The driver node has been assigned the ip: {ip}"
          + f" which belongs to the subnet: {subnet_name}")
    

  4. إعادة تسمية المهمة إلى AirflowBlogJob.
  5. على تفاصيل الوظيفة علامة التبويب ، لـ دور IAM، اختر أي دور وأدخل 2 لعدد العمال (للتوفير فقط).
  6. احفظ هذه التغييرات حتى يتم إنشاء الوظيفة.

امنح أذونات AWS Glue لدور بيئة Airflow

يوفر الدور الذي تم إنشاؤه لـ Airflow بواسطة قالب CloudFormation الأذونات الأساسية لتشغيل مهام سير العمل ولكن ليس للتفاعل مع الخدمات الأخرى مثل AWS Glue. في مشروع الإنتاج، يمكنك تحديد القوالب الخاصة بك باستخدام هذه الأذونات الإضافية، ولكن في هذا المنشور، وللتبسيط، يمكنك إضافة الأذونات الإضافية كسياسة مضمنة. أكمل الخطوات التالية:

  1. في وحدة تحكم IAM ، اختر الأدوار في جزء التنقل.
  2. حدد الدور الذي أنشأه القالب؛ سيبدأ بالاسم الذي قمت بتعيينه لمكدس CloudFormation ثم -MwaaExecutionRole-.
  3. في صفحة تفاصيل الدور، على أضف أذونات القائمة، اختر إنشاء سياسة مضمنة.
  4. قم بالتبديل من الوضع المرئي إلى الوضع JSON وأدخل JSON التالي في مربع النص. يفترض أن دور AWS Glue الذي قمت به يتبع التقليد الذي بدأت به AWSGlueServiceRole. لتعزيز الأمان، يمكنك استبدال مورد حرف البدل على ec2:DescribeSubnets إذن باستخدام ARNs للشبكتين الفرعيتين الخاصتين من مكدس CloudFormation.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "glue:GetConnection"
                ],
                "Resource": [
                    "arn:aws:glue:*:*:connection/MWAA-Glue-Blog-Subnet*",
                    "arn:aws:glue:*:*:catalog"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "glue:UpdateJob",
                    "glue:GetJob",
                    "glue:StartJobRun",
                    "glue:GetJobRun"
                ],
                "Resource": [
                    "arn:aws:glue:*:*:job/AirflowBlogJob",
                    "arn:aws:glue:*:*:job/BlogAirflow"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:DescribeSubnets"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "iam:GetRole",
                    "iam:PassRole"
                ],
                "Resource": "arn:aws:iam::*:role/service-role/AWSGlueServiceRole*"
            }
        ]
    }
    

  5. اختار التالى.
  6. أدخل GlueRelatedPermissions كاسم السياسة وإكمال الإنشاء.

في هذا المثال، نستخدم مهمة البرنامج النصي ETL؛ بالنسبة للمهمة المرئية، نظرًا لأنها تنشئ البرنامج النصي تلقائيًا عند الحفظ، فإن دور Airflow سيحتاج إلى إذن للكتابة إلى مسار البرنامج النصي الذي تم تكوينه على خدمة تخزين أمازون البسيطة (أمازون S3).

إنشاء تدفق الهواء DAG

يعتمد سير عمل Airflow على الرسم البياني الدائري المباشر (DAG)، والذي يتم تعريفه بواسطة ملف Python الذي يحدد برمجيًا المهام المختلفة المعنية وترابطاتها المتبادلة. أكمل البرامج النصية التالية لإنشاء DAG:

  1. قم بإنشاء ملف محلي باسم glue_job_dag.py باستخدام محرر نصوص.

في كل خطوة من الخطوات التالية، نقدم مقتطفًا برمجيًا لإدخاله في الملف وشرحًا لما يحدث.

  1. يضيف المقتطف التالي استيرادات وحدات Python المطلوبة. تم بالفعل تثبيت الوحدات على Airflow؛ إذا لم يكن الأمر كذلك، فستحتاج إلى استخدام ملف requirements.txt ملف للإشارة إلى Airflow التي سيتم تثبيت الوحدات. كما أنه يحدد أيضًا عملاء Boto3 الذين سيستخدمهم الكود لاحقًا. افتراضيًا، سيستخدمون نفس الدور والمنطقة مثل Airflow، ولهذا السبب قمت بالإعداد قبل الدور بالأذونات الإضافية المطلوبة.
    import boto3
    from pendulum import datetime, duration
    from random import shuffle
    from airflow import DAG
    from airflow.decorators import dag, task
    from airflow.models import Variable
    from airflow.providers.amazon.aws.operators.glue import GlueJobOperator
    
    glue_client = boto3.client('glue')
    ec2 = boto3.client('ec2')
    

  2. يضيف المقتطف التالي ثلاث وظائف لتنفيذ استراتيجية ترتيب الاتصال، والتي تحدد كيفية إعادة ترتيب الاتصالات المعطاة لتحديد أولويتها. هذا مجرد مثال؛ يمكنك إنشاء التعليمات البرمجية المخصصة الخاصة بك لتنفيذ المنطق الخاص بك، وفقًا لاحتياجاتك. يتحقق الكود أولاً من عناوين IP المتاحة على كل شبكة اتصال فرعية ويفصل بين العناوين التي تحتوي على عدد كافٍ من عناوين IP المتاحة لتشغيل المهمة بكامل طاقتها وتلك التي يمكن استخدامها لأن لديها عنواني IP متاحين على الأقل، وهو الحد الأدنى الذي تحتاجه المهمة يبدأ. إذا تم تعيين الإستراتيجية على random، سيتم ترتيب الترتيب بشكل عشوائي داخل كل مجموعة من مجموعات الاتصال الموصوفة مسبقًا وإضافة أي اتصالات أخرى. إذا كانت الإستراتيجية capacity، سيتم ترتيبها من معظم عناوين IP المجانية إلى الأقل.
    def get_available_ips_from_connection(glue_connection_name):
        conn_response = glue_client.get_connection(Name=glue_connection_name)
        connection_properties = conn_response['Connection']['PhysicalConnectionRequirements']
        subnet_id = connection_properties['SubnetId']
        subnet_response = ec2.describe_subnets(SubnetIds=[subnet_id])
        return subnet_response['Subnets'][0]['AvailableIpAddressCount']
    
    def get_connections_free_ips(glue_connection_names, num_workers):
        good_connections = []
        usable_connections = []    
        for connection_name in glue_connection_names:
            try:
                available_ips = get_available_ips_from_connection(connection_name)
                # Priority to connections that can hold the full cluster and we haven't just tried
                if available_ips >= num_workers:
                    good_connections.append((connection_name, available_ips))
                elif available_ips >= 2: # The bare minimum to start a Glue job
                    usable_connections.append((connection_name, available_ips))                
            except Exception as e:
                print(f"[WARNING] Failed to check the free ips for:{connection_name}, will skip. Exception: {e}")  
        return good_connections, usable_connections
    
    def prioritize_connections(connection_list, num_workers, strategy):
        (good_connections, usable_connections) = get_connections_free_ips(connection_list, num_workers)
        print(f"Good connections: {good_connections}")
        print(f"Usable connections: {usable_connections}")
        all_conn = []
        if strategy=="random":
            shuffle(good_connections)
            shuffle(usable_connections)
            # Good connections have priority
            all_conn = good_connections + usable_connections
        elif strategy=="capacity":
            # We can sort both at the same time
            all_conn = good_connections + usable_connections
            all_conn.sort(key=lambda x: -x[1])
        else: 
            raise ValueError(f"Unknown strategy specified: {strategy}")    
        result = [c[0] for c in all_conn] # Just need the name
        # Keep at the end any other connections that could not be checked for ips
        result += [c for c in connection_list if c not in result]
        return result
    

  3. يقوم التعليمة البرمجية التالية بإنشاء DAG نفسها باستخدام مهمة تشغيل التشغيل، والتي تقوم بتحديث الوظيفة بأمر الاتصال المحدد بواسطة الإستراتيجية، وتشغيلها، وانتظار النتائج. يأتي اسم الوظيفة والاتصالات والاستراتيجية من متغيرات Airflow، لذلك يمكن تهيئتها وتحديثها بسهولة. يحتوي على محاولتين مع تكوين التراجع الأسي، لذلك إذا فشلت المهام، فسيتم تكرار المهمة بأكملها بما في ذلك اختيار الاتصال. ربما يكون الخيار الأفضل الآن هو اتصال آخر، أو أن الشبكة الفرعية التي تم اختيارها عشوائيًا مسبقًا موجودة في منطقة توافر الخدمات التي تعاني حاليًا من انقطاع الخدمة، ومن خلال اختيار شبكة مختلفة، يمكنها التعافي.
    with DAG(
        dag_id='glue_job_dag',
        schedule_interval=None, # Run on demand only
        start_date=datetime(2000, 1, 1), # A start date is required
        max_active_runs=1,
        catchup=False
    ) as glue_dag:
        
        @task(
            task_id="glue_task", 
            retries=2,
            retry_delay=duration(seconds = 30),
            retry_exponential_backoff=True
        )
        def run_job_task(**ctx):    
            glue_connections = Variable.get("glue_job_dag.glue_connections").strip().split(',')
            glue_jobname = Variable.get("glue_job_dag.glue_job_name").strip()
            strategy= Variable.get('glue_job_dag.strategy', 'random') # random or capacity
            print(f"Connections available: {glue_connections}")
            print(f"Glue job name: {glue_jobname}")
            print(f"Strategy to use: {strategy}")
            job_props = glue_client.get_job(JobName=glue_jobname)['Job']            
            num_workers = job_props['NumberOfWorkers']
            
            glue_connections = prioritize_connections(glue_connections, num_workers, strategy)
            print(f"Running Glue job with the connection order: {glue_connections}")
            existing_connections = job_props.get('Connections',{}).get('Connections', [])
            # Preserve other connections that we don't manage
            other_connections = [con for con in existing_connections if con not in glue_connections]
            job_props['Connections'] = {"Connections": glue_connections + other_connections}
            # Clean up properties so we can reuse the dict for the update request
            for prop_name in ['Name', 'CreatedOn', 'LastModifiedOn', 'AllocatedCapacity', 'MaxCapacity']:
                del job_props[prop_name]
    
            GlueJobOperator(
                task_id='submit_job',
                job_name=glue_jobname,
                iam_role_name=job_props['Role'].split('/')[-1],
                update_config=True,
                create_job_kwargs=job_props,
                wait_for_completion=True
            ).execute(ctx)   
            
        run_job_task()
    

إنشاء سير عمل تدفق الهواء

يمكنك الآن إنشاء سير عمل يستدعي مهمة AWS Glue التي أنشأتها للتو:

  1. في وحدة تحكم Amazon S3، حدد موقع الحاوية التي تم إنشاؤها بواسطة قالب CloudFormation، والتي سيكون لها اسم يبدأ باسم المكدس ثم -environmentbucket- (فمثلا، myairflowstack-environmentbucket-ap1qks3nvvr4).
  2. داخل هذا الدلو، قم بإنشاء مجلد يسمى dagsوداخل هذا المجلد، قم بتحميل ملف DAG glue_job_dag.py التي قمت بإنشائها في القسم السابق.
  3. في وحدة تحكم Amazon MWAA، انتقل إلى البيئة التي قمت بنشرها باستخدام حزمة CloudFormation.

إذا لم تكن الحالة بعد متوفرة ، انتظر حتى يصل إلى تلك الحالة. لن يستغرق الأمر أكثر من 30 دقيقة منذ نشر مكدس CloudFormation.

  1. اختر رابط البيئة الموجود في الجدول لرؤية تفاصيل البيئة.

تم تكوينه لالتقاط DAGs من المجموعة والمجلد الذي استخدمته في الخطوات السابقة. سوف يقوم Airflow بمراقبة هذا المجلد لإجراء التغييرات.

  1. اختار افتح واجهة مستخدم تدفق الهواء لفتح علامة تبويب جديدة للوصول إلى واجهة مستخدم Airflow، باستخدام أمان IAM المدمج لتسجيل دخولك.

إذا كانت هناك أي مشكلة في ملف DAG الذي قمت بإنشائه، فسيعرض خطأ في أعلى الصفحة يشير إلى الأسطر المتأثرة. وفي هذه الحالة، راجع الخطوات وقم بالتحميل مرة أخرى. وبعد بضع ثوانٍ، سيتم تحليله وتحديث شعار الخطأ أو إزالته.

  1. على إداري القائمة، اختر المتغيرات.
  2. أضف ثلاثة متغيرات بالمفاتيح والقيم التالية:
    1. القفل glue_job_dag.glue_connections مع القيمة MWAA-Glue-Blog-Subnet1,MWAA-Glue-Blog-Subnet2.
    2. القفل glue_job_dag.glue_job_name مع القيمة AirflowBlogJob.
    3. القفل glue_job_dag.strategy مع القيمة capacity.

قم بتشغيل المهمة باستخدام تعيين شبكة فرعية ديناميكية

أنت الآن جاهز لتشغيل سير العمل ورؤية الإستراتيجية تعيد ترتيب الاتصالات ديناميكيًا.

  1. في واجهة مستخدم Airflow ، اختر DAGsوعلى الصف glue_job_dag، اختر أيقونة التشغيل.
  2. على تصفح القائمة، اختر حالات المهمة.
  3. في جدول المثيلات، قم بالتمرير لليمين لعرض Log Url واختر الأيقونة الموجودة عليه لفتح السجل.

سيتم تحديث السجل أثناء تشغيل المهمة؛ يمكنك تحديد موقع السطر الذي يبدأ بـ "تشغيل مهمة اللصق مع أمر الاتصال:" والسطور السابقة التي توضح تفاصيل عناوين IP الخاصة بالاتصال والفئة المخصصة. في حالة حدوث خطأ، سترى التفاصيل في هذا السجل.

  1. في وحدة تحكم AWS Glue ، اختر وظائف ETL في جزء التنقل، ثم اختر الوظيفة AirflowBlogJob.
  2. على أشواط علامة التبويب، اختر مثيل التشغيل، ثم سجلات الإخراج الرابط، والذي سيفتح علامة تبويب جديدة.
  3. في علامة التبويب الجديدة، استخدم رابط دفق السجل لفتحه.

سيعرض عنوان IP الذي تم تعيينه للسائق والشبكة الفرعية التي ينتمي إليها، والتي يجب أن تتطابق مع الاتصال المشار إليه بواسطة Airflow (إذا لم يتم عرض السجل، فاختر سيرة ذاتية لذلك يتم تحديثه بمجرد توفره).

  1. في واجهة مستخدم Airflow، قم بتحرير متغير Airflow glue_job_dag.strategy لتعيينه على random.
  2. قم بتشغيل DAG عدة مرات وشاهد كيف يتغير الترتيب.

تنظيف

إذا لم تعد بحاجة إلى النشر، فاحذف الموارد لتجنب أي رسوم إضافية:

  1. احذف نص Python الذي قمت بتحميله، بحيث يمكن حذف حاوية S3 تلقائيًا في الخطوة التالية.
  2. احذف مكدس CloudFormation.
  3. احذف مهمة AWS Glue.
  4. احذف البرنامج النصي الذي حفظته المهمة في Amazon S3.
  5. احذف الاتصالات التي قمت بإنشائها كجزء من هذا المنشور.

وفي الختام

في هذا المنشور، أظهرنا كيف يمكن لـ AWS Glue وAmazon MWAA العمل معًا لإنشاء مسارات عمل مخصصة أكثر تقدمًا، مع تقليل النفقات التشغيلية والإدارية. يمنحك هذا الحل مزيدًا من التحكم في كيفية تشغيل مهمة AWS Glue لتلبية متطلبات التشغيل أو الشبكة أو الأمان الخاصة.

يمكنك نشر بيئة Amazon MWAA الخاصة بك بطرق متعددة، مثل قالب المستخدمة في هذا المنشور، على وحدة تحكم Amazon MWAA، أو باستخدام AWS CLI. يمكنك أيضًا تنفيذ إستراتيجياتك الخاصة لتنسيق مهام AWS Glue، استنادًا إلى بنية الشبكة ومتطلباتها (على سبيل المثال، لتشغيل المهمة بشكل أقرب إلى البيانات عندما يكون ذلك ممكنًا).


عن المؤلفين

مايكل جرينشتاين هو مهندس حلول متخصص في التحليلات للقطاع العام.

جونزالو هيريروس هو كبير مهندسي البيانات الضخمة في فريق AWS Glue.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة