すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:同時実行性が高いためDNS解決が失敗する

最終更新日:Jan 21, 2025

このトピックでは、多数の同時リクエストがピアサービスのドメイン名にアクセスしようとしたときに発生するDNS解決の失敗に対処する方法について説明します。

エラーメッセージ

Logviewに表示されるエラーメッセージには、"name or service not known" が含まれています。

問題の内容

UDFまたはSparkジョブがピアサービスのドメイン名に対して大量の同時リクエストを生成すると、DNS解決に失敗する可能性があります。

解決策

この問題を防ぐには、ジョブの初期化フェーズでドメイン名をIPアドレスに解決します。 次に、このIPアドレスを使用して、ジョブの実行フェーズ全体にアクセスします。 コードの例を次に示します。

# -*- coding:UTF-8 -*-
from odps.udf import annotate

@annotate("string->string")
class test_udf(object):
    __ip_address = ''

    def evaluate(self, inputPath):
        import requests
        output = 'false'
        retries = 3
        print(self.__ip_address)
        url = f"http://{self.__ip_address}/{inputPath}"
        print(url)
        for i in range(retries):
            try:
                response = requests.get(url)
                if response.status_code == 200:
                    output = 'true'
                else:
                    raise
            except Exception as e:
                if i < retries:
                    print('connect retry: ' + str(i + 1))
                    print('error: ' + e.message)
                    continue
                else:
                    raise
            break

        return output

    def __init__(self):
        import socket
        retries = 3
        for i in range(retries):
            try:
                self.__ip_address = socket.gethostbyname("xxx-vpc.cn-shanghai.aliyuncs.com")
                print(self.__ip_address)
            except socket.gaierror as e:
                print('Failed to resolve domain' + e.strerror)
                if i < retries:
                    print('resolve domain retry: ' + str(i + 1))
                    continue
                else:
                    raise
            break