ここでは、MaxCompute を使用して IP ソースを分析する方法を説明します。 IP アドレスライブラリからのデータのダウンロード、アップロード、UDF (ユーザー定義関数) の記述、SQL 文の記述などの手順が含まれます。

背景

Taobao IP アドレスライブラリのクエリ API は IP アドレス文字列です。 以下に例を示します。

MaxCompute では、HTTP リクエストは直接許可されていません。 ただし、以下の方法のいずれかを使用して、MaxCompute で IP アドレスを照会できます。

  1. SQL 文を実行し、次に HTTP リクエストを開始します。 この方法は非効率的です。 照会頻度が 10 QPS より低い場合は、リクエストは拒否されます。
  2. IP アドレスライブラリをローカルサーバーにダウンロードします。 この方法は非効率的で、データウェアハウスのデータ分析に影響を与えます。
  3. IP アドレスライブラリを定期的に管理し、MaxCompute にアップロードします。 この方法は比較的有効です。 しかし、IP アドレスライブラリを定期的に管理する必要があります。

以下に、3 番目の方法を詳しく説明します。

IP アドレスライブラリのダウンロード

  1. IP アドレスライブラリからデータを取得します。 このセクションでは不完全な UTF-8 IP アドレスライブラリのデモを示します。
  2. 以下の図に示すように、UTF-8 IP アドレスライブラリをダウンロードし、データ形式を確認します。

    データの最初の 4 つの文字列は、開始 IP アドレスと終了 IP アドレスです。最初の 2 つは 10 進数の整数、次の 2 つはドット付き10進法で表示されます。 10 進数の整数の形式は、IP アドレスが対象のネットワークセグメントに属しているかどうかを確認するのに使用されます。

IP アドレスライブラリからのデータのアップロード

  1. MaxCompute クライアントでテーブル DDL (データ定義言語) を作成するか、DataWorks の GUI でテーブルを作成します。
    DROP TABLE IF EXISTS ipresource ;
    
    CREATE TABLE IF NOT EXISTS ipresource 
    (
        start_ip BIGINT
        ,end_ip BIGINT
        ,start_ip_arg string
        ,end_ip_arg string
        ,country STRING
        ,area STRING
        ,city STRING
        ,county STRING
        ,isp STRING
    );
  2. Tunnel コマンドを実行し、D ドライブに格納されている ipdata.txt.utf8 ファイルをアップロードします。
    odps@ workshop_demo>tunnel upload D:/ipdata.txt.utf8 ipresource;

    select count(*) from ipresource; SQL 文を使用して、アップロードしたデータを表示します。 通常は、定期的なアップデートと管理のために、ライブラリのデータ量は増加します。

  3. 以下の図に示すように、select * from ipresource limit 10; SQL 文を使用して、ipresource テーブルのデータの最初の 10 件を表示します。

UDF の記述

  1. [Data Studio] > [Business Flow] > [Resource] の順に選択します。 [Resource] を右クリックし、[Create Resource] > [Python] の順に選択します。 次の図に示すように、表示されるダイアログボックスに、Python リソースの名前を入力し、 [Upload to ODPS] を選択し、 [OK] をクリックします。
  2. Python リソースのコードを記述します。 以下に例を示します。
    from odps.udf import annotate
    @annotate("string->bigint")
    class ipint(object):
        def evaluate(self, ip):
            try:
                return reduce(lambda x, y: (x << 8) + y, map(int, ip.split('.')))
            except:
                return 0
    [Submit and Unlock] をクリックします。
  3. [Data Studio] > [Business Flow] > [Function] の順に選択します。 [Function] を右クリックし、[Create Function] を選択します。
    関数の名前を ipint.ipint に、フォルダをリソース名に設定し、[Submit and Unlock] をクリックします。
  4. ODPS SQL ノードを作成し、SQL 文を実行して ipint 関数が期待どおりに動作しているかどうかを確認します。 以下に例を示します。
同様に、ローカルの ipint.py を作成し、MaxCompute クライアントを使用してリソースをアップロードします。










odps@ MaxCompute_DOC>add py D:/ipint.py;
OK: Resource 'ipint.py' have been created.
                
リソースをアップロードしたら、クライアントを使用して関数を登録します。










odps@ MaxCompute_DOC>create function ipint as ipint.ipint using ipint.py;
Success: Function 'ipint' have been created.
                
登録後、関数を使用できるようになります。 クライアントで select ipint('1.2.24.2'); を使用して、関数をテストします。
プロジェクト間の認証を実行し、同じ Alibaba Cloud アカウントで UDF を他のプロジェクトと共有します。
  1. ipint という名前のパッケージを作成します。
    odps@ MaxCompute_DOC>create package ipint;
    OK
  2. UDF をパッケージに追加します。
    odps@ MaxCompute_DOC>add function ipint to package ipint;
    OK
  3. bigdata_DOC プロジェクトにパッケージのインストールを許可します。
    odps@ MaxCompute_DOC> allow project bigdata_DOC to install package ipint;
    OK
  4. UDF を使用する必要がある bigdata_DOC プロジェクトに切り替えて、パッケージをインストールします。
    odps@ MaxCompute_DOC>use bigdata_DOC;
    odps@ bigdata_DOC>install package MaxCompute_DOC.ipint;
    OK
  5. UDF を使用できるようになります。 bigdata_DOC プロジェクトのユーザー (Bob など) がリソースにアクセスする場合、管理者は ACL を使用してユーザーにアクセス権限を付与します。
    odps@ bigdata_DOC>grant Read on package MaxCompute_DOC.ipint to user aliyun$bob@aliyun.com; --Use the ACL to grant the package access permission to Bob.

SQL での IP アドレスライブラリの使用

ここでは、例として IP アドレス 1.2.254.2 を使用します。 必要に応じて、特定のフィールドを使用して IP アドレスを照会します。
以下の SQL コードを使用して、テスト結果を表示します。
select * from ipresource
WHERE ipint('1.2.24.2') >= start_ip
AND ipint('1.2.24.2') <= end_ip

データの正確さを確保するために、定期的に Taobao IP アドレスライブラリからデータを取得し、ipresource テーブルを管理します。