このトピックでは、トンネルコマンドの機能と、それらのコマンドによるデータのアップロードおよびダウンロード方法について説明します。
対応ツール
Tunnel コマンドは、odpscmd および MaxCompute Studio で実行できます。詳細については、「ローカルクライアント (odpscmd) を使用した接続」および「MaxCompute Studio の概要」をご参照ください。
トンネルコマンドの機能
クライアントで利用可能なトンネルコマンドは、Dship ツールに代わるものです。これらのコマンドを使用して、データをアップロードおよびダウンロードできます。コマンドは次のとおりです:
-
アップロード:ローカルファイルから MaxCompute テーブルにデータをアップロードします。各アップロード操作では、単一のテーブルまたは単一のパーティションにデータを書き込むことができます。パーティションテーブルの場合、宛先パーティションを指定する必要があります。多段パーティション化テーブルの場合、最下位レベルのパーティションを指定する必要があります。詳細については、「アップロード」をご参照ください。
-
ダウンロード:MaxCompute テーブルのデータまたは特定のインスタンスの結果をローカルファイルにダウンロードします。各ダウンロード操作では、1つのテーブルまたは1つのパーティションを1つのファイルにダウンロードできます。パーティションテーブルの場合、ソースパーティションを指定する必要があります。多段パーティション化テーブルの場合、最下位レベルのパーティションを指定する必要があります。詳細については、「ダウンロード」をご参照ください。
-
レジューム:ネットワークの問題や Tunnel サービスのエラーでアップロードが失敗した場合、
Resumeコマンドを使用してファイルのアップロードを続行できます。このコマンドは、以前のアップロード操作を再開します。現在、Resume コマンドはダウンロード操作をサポートしていません。詳細については、「レジューム」をご参照ください。 -
Show:履歴タスクに関する情報を表示します。詳細については、「Show」をご参照ください。
-
パージ:セッションディレクトリをクリアします。デフォルトでは、このコマンドは過去3日間のログを削除します。詳細については、「パージ」をご参照ください。
-
Help:ヘルプ情報を表示します。各コマンドとオプションで、短いコマンド形式がサポートされています。
-
アップサート:Update と Insert のセマンティクスを組み合わせてデータを書き込みます。このコマンドは、Transaction Table 2.0 テーブルでのみサポートされます。
宛先テーブルに一致するデータが見つからない場合は、新しいデータが挿入されます。データがすでに存在する場合は、更新されます。
トンネルのアップロードとダウンロードの制限
-
現在、トンネル機能およびトンネルソフトウェア開発キット (SDK) は、外部テーブルでの操作をサポートしていません。トンネルを使用して、データを MaxCompute の内部テーブルに直接アップロードできます。または、OSS Python SDK を使用してデータを OSS にアップロードし、MaxCompute で外部テーブルを作成してデータにマッピングすることもできます。外部テーブルの詳細については、「外部テーブルの概要」をご参照ください。
-
トンネルコマンドは、ARRAY、MAP、STRUCT 型のデータのアップロードまたはダウンロードをサポートしていません。
-
サーバーサイドでの各トンネルセッションのライフサイクルは24時間です。セッションは作成後24時間以内に使用できます。また、プロセスやスレッド間で共有することもできます。ただし、同じ BlockId を再利用しないようにする必要があります。
説明トンネルセッション:サーバーサイドでは、アップロードまたはダウンロードごとにセッションが作成され、操作を識別するための一意の UploadId または DownloadId が生成されます。サーバーサイドでのトンネルセッションのライフサイクルは24時間です。24時間経過すると、セッションは非アクティブになります。
-
セッションを使用してデータをダウンロードする場合、Alibaba Cloud アカウントが作成したセッションは、その Alibaba Cloud アカウントまたはその RAM ユーザーのみがダウンロードに使用できることに注意してください。
テーブルデータのアップロードとダウンロード
開始する前に、data.txt という名前のデータファイルを作成し、d:\data.txt に保存します。ファイルには、次のデータが含まれています。
shopx,x_id,100
shopy,y_id,200
shopz,z_id
data.txt ファイルのデータの 3 行目は、作成されるパーティションテーブル sale_detail のスキーマと一致しません。sale_detail テーブルは3つの列で定義されていますが、この行には列が2つしかありません。
次の手順では、テーブルデータをアップロードおよびダウンロードする方法について説明します。
-
MaxCompute クライアントで、次のステートメントを実行してパーティションテーブル sale_detail を作成し、パーティションを追加します。
CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING,region STRING); alter table sale_detail add partition (sale_date='201312', region='hangzhou'); -
uploadコマンドを使用して、data.txt データファイルをパーティションテーブル sale_detail にアップロードします。-
コマンド例
tunnel upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false; -
実行結果
Upload session: 20230505xxxxxxxxxxxb0b02dbb6bd Start upload:d:\data.txt Using \r\n to split records Upload in strict schema mode: false Total bytes:42 Split input to 1 blocks 2023-05-05 10:11:35 upload block: '1' ERROR: column mismatch -,expected 3 columns, 2 columns found, please check data or delimiter説明data.txt にはダーティデータが含まれているため、データのインポートは失敗します。セッション ID とエラーメッセージが返されます。
-
-
次のステートメントを実行して、データを確認します。
-
コマンド例
select * from sale_detail where sale_date='201312'; -
実行結果
ID = 20230505xxxxxxxxxxxvc61z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+説明ダーティデータが原因でデータのインポートが失敗し、テーブルは空のままです。
-
-
showコマンドを使用して、失敗したアップロードのセッション ID を照会します。-
コマンド例
tunnel show history; -
実行結果
20230505xxxxxxxxxxxb0b02dbb6bd failed 'upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false'
-
-
data.txt サンプルデータファイルを、sale_detail のテーブルスキーマと一致する次のデータが含まれるように変更します。
shopx,x_id,100 shopy,y_id,200 -
resumeコマンドを実行して、データのアップロードを再開します。このコマンドでは、20230505xxxxxxxxxxxb0b02dbb6bd は失敗したアップロードのセッション ID です。-
コマンド例
tunnel resume 20230505xxxxxxxxxxxb0b02dbb6bd --force; -
実行結果
start resume 20230505xxxxxxxxxxxb0b02dbb6bd Upload session: 20230505xxxxxxxxxxxb0b02dbb6bd Start upload:d:\data.txt Using \r\n to split records Upload in strict schema mode: false Resume 1 blocks 2023-05-05 10:32:39 upload block: '1' 2023-05-05 10:32:40 upload block complete, block id: 1 upload complete, average speed is 0 bytes/s OK
-
-
次のステートメントを実行して、データが正常にアップロードされたことを確認します。
-
コマンド例
select * from sale_detail where sale_date='201312'; -
実行結果
ID = 20230505xxxxxxxxxxxx7afc9qcg +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | shopx | x_id | 100.0 | 201312 | hangzhou| | shopy | y_id | 200.0 | 201312 | hangzhou| +-----------+-------------+-------------+-----------+--------+
-
-
downloadコマンドを実行し、sale_detail テーブルのデータをローカルファイル result.txt にダウンロードします。説明データがダウンロードされるローカルパスpathの命名規則は次のとおりです:
-
ファイルを MaxCompute クライアントの bin ディレクトリに直接保存するには、path を
filename.extensionに設定します。 -
ファイルを D ドライブの test フォルダーなど、別のパスに保存するには、path を
D:\test\filename.extensionに設定します。 -
同じ名前のローカルファイルが存在する場合、上書きされます。
tunnel download sale_detail/sale_date=201312,region=hangzhou result.txt; -
-
result.txt ファイルの内容を確認します。ファイルに次の内容が含まれていれば、ダウンロードは成功です。
説明ダウンロードされたファイルには、非パーティションフィールドの値のみが表示されます。
shopx,x_id,100.0 shopy,y_id,200.0
インスタンスデータのダウンロード
-
方法1:tunnel download コマンドを使用して、特定のインスタンスの実行結果をローカルファイルにダウンロードします。
-
SELECT ステートメントを実行して、sale_detail テーブルを照会します。
select * from sale_detail;説明パーティションテーブル sale_detail でフルテーブルスキャンが無効になっている場合、このコマンドはエラー
Table(xxxx) is full scan with all partitions, please specify partition predicatesを返します。この問題の解決方法の詳細については、「付録:エラーコード」をご参照ください。 -
次のトンネルコマンドを実行して、実行結果をローカルファイルにダウンロードします。
-- SELECT コマンドのインスタンス ID を表示します show p; -- ダウンロードコマンドを実行します tunnel download instance://20170724071705393ge3csfb8 result.txt;
-
-
方法2:パラメーターを設定し、デフォルトで InstanceTunnel 経由で SQL クエリ結果が出力されるように構成します。
MaxCompute クライアントで
use_instance_tunnelオプションを有効にすると、SELECT クエリの結果は、デフォルトで InstanceTunnel を使用してダウンロードされます。これにより、MaxCompute プラットフォームから SQL クエリ結果を取得する際のタイムアウトエラーやデータ量の制限を回避できます。この設定は、次の2つの方法のいずれかで有効にできます。説明InstanceTunnel の制約と制限の詳細については、「InstanceTunnel の制約と制限」をご参照ください。
-
クライアントの最新バージョンでは、このオプションは odps_config.ini ファイルでデフォルトで有効になっており、
instance_tunnel_max_recordはデフォルトで 10000 に設定されています。# Instance Tunnel 経由で SQL 結果をダウンロードします use_instance_tunnel=true # Instance Tunnel を使用して SQL 結果をダウンロードする際の最大レコード数 instance_tunnel_max_record=10000説明instance_tunnel_max_recordパラメーターは、InstanceTunnel 経由でダウンロードする SQL クエリ結果の最大レコード数を指定します。このパラメーターを設定しない場合、レコード数の制限なくダウンロードできます。 -
set console.sql.result.instancetunnel=trueコマンドを実行して、この機能を有効にします。-
InstanceTunnel オプションを有効にします。
set console.sql.result.instancetunnel=true; -
SELECT クエリを実行します。
select * from wc_in;次の結果が返されます:
ID = 20170724081946458g14csfb8 Log view: http://logview/xxxxx..... +------------+ | key | +------------+ | slkdfj | | hellp | | apple | | tea | | peach | | apple | | tea | | teaa | +------------+ A total of 8 records fetched by instance tunnel. Max record number: 10000
説明InstanceTunnel を使用して SELECT クエリの結果を出力すると、システムは最終行にメッセージを出力します。この例では、インスタンスの実行結果として合計8レコードが返されました。同様に、
set console.sql.result.instancetunnel = falseコマンドを実行して、この機能を無効にすることもできます。 -
-