ここでは、MaxCompute を使用して IP ソースを分析する方法を説明します。 IP アドレスライブラリからのデータのダウンロード、アップロード、UDF (ユーザー定義関数) の記述、SQL 文の記述などの手順が含まれます。
背景
Taobao IP アドレスライブラリのクエリ API は IP アドレス文字列です。 以下に例を示します。
MaxCompute では、HTTP リクエストは直接許可されていません。 ただし、以下の方法のいずれかを使用して、MaxCompute で IP アドレスを照会できます。
- SQL 文を実行し、次に HTTP リクエストを開始します。 この方法は非効率的です。 照会頻度が 10 QPS より低い場合は、リクエストは拒否されます。
- IP アドレスライブラリをローカルサーバーにダウンロードします。 この方法は非効率的で、データウェアハウスのデータ分析に影響を与えます。
- IP アドレスライブラリを定期的に管理し、MaxCompute にアップロードします。 この方法は比較的有効です。 しかし、IP アドレスライブラリを定期的に管理する必要があります。
以下に、3 番目の方法を詳しく説明します。
IP アドレスライブラリのダウンロード
- IP アドレスライブラリからデータを取得します。 このセクションでは不完全な UTF-8 IP アドレスライブラリのデモを示します。
- 以下の図に示すように、UTF-8 IP アドレスライブラリをダウンロードし、データ形式を確認します。
データの最初の 4 つの文字列は、開始 IP アドレスと終了 IP アドレスです。最初の 2 つは 10 進数の整数、次の 2 つはドット付き10進法で表示されます。 10 進数の整数の形式は、IP アドレスが対象のネットワークセグメントに属しているかどうかを確認するのに使用されます。
IP アドレスライブラリからのデータのアップロード
- 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 );
- Tunnel コマンドを実行し、D ドライブに格納されている ipdata.txt.utf8 ファイルをアップロードします。
odps@ workshop_demo>tunnel upload D:/ipdata.txt.utf8 ipresource;
select count(*) from ipresource;
SQL 文を使用して、アップロードしたデータを表示します。 通常は、定期的なアップデートと管理のために、ライブラリのデータ量は増加します。 - 以下の図に示すように、
select * from ipresource limit 10;
SQL 文を使用して、ipresource テーブルのデータの最初の 10 件を表示します。
UDF の記述
- [Resource] を右クリックし、 の順に選択します。 次の図に示すように、表示されるダイアログボックスに、Python リソースの名前を入力し、 [Upload to ODPS] を選択し、 [OK] をクリックします。 の順に選択します。
- 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] をクリックします。 - [Function] を右クリックし、[Create Function] を選択します。
関数の名前を
ipint.ipint
に、フォルダをリソース名に設定し、[Submit and Unlock] をクリックします。
の順に選択します。 - ODPS SQL ノードを作成し、SQL 文を実行して ipint 関数が期待どおりに動作しているかどうかを確認します。 以下に例を示します。
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 を他のプロジェクトと共有します。
- ipint という名前のパッケージを作成します。
odps@ MaxCompute_DOC>create package ipint; OK
- UDF をパッケージに追加します。
odps@ MaxCompute_DOC>add function ipint to package ipint; OK
- bigdata_DOC プロジェクトにパッケージのインストールを許可します。
odps@ MaxCompute_DOC> allow project bigdata_DOC to install package ipint; OK
- UDF を使用する必要がある bigdata_DOC プロジェクトに切り替えて、パッケージをインストールします。
odps@ MaxCompute_DOC>use bigdata_DOC; odps@ bigdata_DOC>install package MaxCompute_DOC.ipint; OK
- 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 テーブルを管理します。