このトピックでは、Tunnel SDKに関するよくある質問に対する回答を提供します。
Tunnel SDKを使用してデータをアップロードすると、テーブルの各パーティションにデータを自動的に配布できますか?
いいえ。Tunnel SDKを使用してデータをアップロードすると、テーブルの各パーティションにデータを自動的に配布することはできません。 データは、一度に単一の非パーティションテーブルまたはパーティションテーブルのパーティションにアップロードできます。 パーティションテーブルにデータをアップロードするには、データをアップロードするパーティションを指定する必要があります。 テーブルに複数レベルのパーティションがある場合は、最後のレベルのパーティションを指定する必要があります。
Tunnel SDKを使用してファイルをアップロードする場合、UDF JARファイルの最大サイズはどれくらいですか。
UDF JARファイルの最大サイズは10 MBです。 ファイルサイズが10 MBを超える場合は、MaxCompute Tunnel uploadコマンドを使用してファイルをアップロードすることを推奨します。 MaxCompute Tunnelアップロードコマンドの詳細については、「Tunnelコマンド」をご参照ください。
Tunnel SDKを使用してデータをアップロードするテーブルのパーティション数は制限されていますか?
はい、パーティションの数は限られています。 最大 60,000 個のパーティションがサポートされています。 パーティションの数が60,000を超えると、データの収集と分析の効率が低下します。 MaxComputeでは、1つのジョブのインスタンス数に制限があります。 ジョブのインスタンス数は、入力データ量とパーティション数に基づいて決定されます。 したがって、パーティション分割ポリシーを選択する前に、ビジネス要件を評価することをお勧めします。 これにより、過剰なパーティションがビジネスに与える影響を最小限に抑えることができます。
Tunnel SDKを使用してデータをアップロードするときに、エラーメッセージ「StatusConflict」が表示された場合はどうすればよいですか?
- 問題の説明Tunnel SDKを使用してデータをアップロードすると、次のエラーメッセージが表示されます。
RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. java.io.IOException: RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.at com.aliyun.odps.tunnel.io.TunnelRecordWriter.close(TunnelRecordWriter.java:93) - 原因: この問題は、RecordWriterを無効にすると、次のいずれかの原因で発生します。
- RecordWriterは無効です。
- RecordWriterが使用されているセッションは無効です。
- RecordWriterが使用されているセッションが送信されます。
- 解決策: 上記の原因に基づいて問題を修正できます。 たとえば、原因を特定するために、セッションを送信する前に、ログを表示したり、RecordWriterとセッションのステータスを表示したりできます。 問題を修正したら、データを再度アップロードします。
Tunnel SDKを使用してデータをアップロードするときに、「Blocks not match」というエラーメッセージが表示された場合はどうすればよいですか?
- 問題の説明
Tunnel SDKを使用してデータをアップロードすると、次のエラーメッセージが表示されます。
ErrorCode=Local Error, ErrorMessage=Blocks not match, server: 0, tunnelServiceClient: 1 at com.aliyun.odps.tunnel.TableTunnel$UploadSession.commit(TableTunnel.java:814) - 原因
サーバーが取得するブロックの数は、commit() メソッドのblocksパラメーターで指定されたブロックの数と同じではありません。
- 解決策
uploadSession.openRecordWriter(i)を呼び出すことによって有効になるRecordWriterの数と、コードからcommit() メソッドのblocksパラメーターの値を表示します。 有効になっているRecordWriterの数がcommit() メソッドのblocksパラメーターの値と同じであることを確認してください。- コードの実行後、commit() メソッドが呼び出される前に
recordWriter.close();メソッドが呼び出されるかどうかを確認します。 commit() メソッドが呼び出される前にrecordWriter.close(); メソッドが呼び出されない場合、サーバーが取得するブロックの数は、commit() メソッドのblocksパラメーターで指定されたブロックの数と同じではない場合があります。
odps tunnel recordWriter.close() メソッドを呼び出して一度に80万件のデータレコードをアップロードしたときに、エラーメッセージ "StatusConflict" が表示された場合はどうすればよいですか?
- 問題の説明odps tunnel recordWriter.close() メソッドを呼び出して一度に80万件のデータレコードをアップロードすると、次のエラーメッセージが表示されます。
ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. - 原因
セッションのステータスが無効です。 セッションが無効または送信されます。
- 解決策
セッションを作成し、そのセッションを使用してデータを再度アップロードすることを推奨します。 異なるパーティションにデータをアップロードするには、パーティションごとに個別のセッションが必要です。 セッションの繰り返し送信によりこの問題が発生した場合は、データがアップロードされているかどうかを確認してください。 データのアップロードが失敗した場合は、データを再度アップロードします。 詳細については、「マルチスレッドモードでのデータアップロードの例」をご参照ください。
Tunnel SDKのTunnelBufferedWriterを使用して、データのアップロードを成功させるにはどうすればよいですか?
TunnelBufferedWriterは、0.21.3-publicより後のバージョンのJava用MaxCompute SDKで提供されています。 TunnelBufferedWriterはデータのアップロードを簡素化し、フォールトトレランス機能を提供します。 TunnelBufferedWriterは、MaxComputeクライアントのバッファにデータをキャッシュし、バッファがいっぱいになるとHTTP接続を確立してデータをアップロードします。
TunnelBufferedWriterは、データのアップロードを成功させるための最大化されたフォールトトレランス機能を提供します。 TunnelBufferedWriterの使用方法の詳細については、「TunnelBufferedWriter」をご参照ください。
Tunnel SDKを使用してデータをダウンロードすると、「指定されたテーブルとともにpartitionspecを指定する必要があります」というエラーメッセージが表示されます。 どうすればよいですか。
- 問題の説明
Tunnel SDKを使用してパーティションテーブルのデータをダウンロードすると、次のエラーメッセージが表示されます。
ErrorCode=MissingPartitionSpec, ErrorMessage=You need to specify a partitionspec along with the specified table. - 原因
Tunnel SDKを使用してパーティションテーブルからデータをダウンロードする場合は、テーブル内のパーティションキー列の値を指定する必要があります。 それ以外の場合は、エラーが返されます。
- 解決策
- MaxComputeクライアントのTunnelコマンドを使用してパーティションテーブルからデータをダウンロードする場合、MaxComputeクライアントですべてのテーブルデータをフォルダーにダウンロードできます。
- Tunnel SDKを使用してパーティションテーブルからデータをダウンロードする前に、Tunnel SDKを使用してテーブルのすべてのパーティションに関する情報を取得できます。 次のコマンドの例を示します。
odps.tables().get(tablename) t.getPartitions()
MaxCompute TunnelでサポートされているSDKは?
MaxCompute TunnelはSDK for Javaのみをサポートしています。
アップロードセッションで重複ブロックIDは許可されていますか?
アップロードセッションの各ブロックIDは一意である必要があります。 ブロックIDを使用してアップロードセッションでRecordWriterを有効にし、RecordWriterを使用してデータを書き込み、closeメソッドを呼び出してデータの書き込みを完了できます。 データの書き込み後、ブロックIDを使用して別のRecordWriterでデータを書き込むことはできません。 ブロックの最大数は20,000です。 ブロックIDの範囲は0から19999です。
ブロックの最大サイズはどれくらいですか?
Tunnelにアップロードされる各ブロックのデフォルトサイズは100 MiBです。 ブロックの最大サイズは100 GBです。 ブロックサイズを64 MBより大きい値に設定することを強く推奨します。 各ブロックはファイルに対応する。 サイズが64 MB未満のファイルは、小さなファイルと見なされます。 多数の小さなファイルが存在する場合、MaxComputeのパフォーマンスが影響を受けます。 大量のデータを継続的にアップロードする場合、各ブロックのサイズは64 MB〜256 MBになります。 1日に1回データをアップロードする場合、各ブロックのサイズは約1 GBになります。
TunnelBufferedWriterを使用してファイルをアップロードし、小さなファイルが生成されないようにします。 詳細については、「TunnelBufferedWriter」をご参照ください。
読み取りまたは書き込み操作がタイムアウトした場合、またはI/O例外が発生した場合はどうすればよいですか?
データをアップロードすると、RecordWriterが8 KBのデータを書き込むたびにネットワークアクションがトリガーされます。 120秒以内にネットワークアクションがトリガーされない場合、サーバーは接続を閉じ、RecordWriterは使用できなくなります。 この場合、新しいRecordWriterを有効にしてデータを書き込む必要があります。
この問題に対処するには、TunnelBufferedWriterを使用することを推奨します。
データをダウンロードすると、RecordReaderはRecordWriterと同じように機能します。 長期間ネットワークアクションがトリガーされない場合、サーバーは接続を閉じます。 RecordReaderを使用して、他のシステムインターフェイスを呼び出さずにデータを継続的に読み取ることを推奨します。