OSS Tables menyediakan fitur pemeliharaan otomatis yang menjalankan tiga tugas optimasi: kompresi, manajemen snapshot, dan pembersihan file yang tidak direferensikan. Fitur ini terus-menerus mengoptimalkan kinerja kueri tabel dan mengurangi biaya penyimpanan tanpa memerlukan sumber daya komputasi eksternal.
Fitur pemeliharaan otomatis menjalankan tiga tugas optimasi pada tingkat sumber daya yang berbeda:
Pembersihan file yang tidak direferensikan: Dikonfigurasikan di tingkat bucket. Secara otomatis mengidentifikasi dan menghapus objek yang tidak lagi direferensikan oleh snapshot tabel mana pun.
Compaction: Dikonfigurasikan di tingkat tabel. Menggabungkan file kecil menjadi file yang lebih besar untuk meningkatkan kinerja kueri.
Manajemen snapshot: Dikonfigurasikan di tingkat tabel. Secara otomatis membersihkan snapshot yang kedaluwarsa untuk mengurangi file metadata dan overhead penyimpanan.
Sistem secara otomatis menerapkan konfigurasi pemeliharaan default berikut saat bucket dan tabel dibuat.
Fitur pemeliharaan | Tingkat konfigurasi | Parameter | Default |
Pembersihan file yang tidak direferensikan | bucket level | status | enabled |
unreferencedDays | 3 | ||
nonCurrentDays | 10 | ||
Compaction | table level | status | enabled |
targetFileSizeMB | 512 | ||
strategy | auto | ||
Manajemen snapshot | table level | status | enabled |
maxSnapshotAgeHours | 120 | ||
minSnapshotsToKeep | 1 |
Peran terkait layanan
Layanan latar belakang menjalankan pemeliharaan otomatis untuk OSS Tables, termasuk compaction, pembersihan file yang tidak direferensikan, dan manajemen snapshot. Layanan ini menggunakan peran terkait layanan AliyunServiceRoleForOssTableMaintenance untuk mengakses Table Bucket. Untuk informasi selengkapnya tentang peran terkait layanan, lihat peran terkait layanan.
Otorisasi
Saat pertama kali mengunjungi halaman Table Buckets di Konsol OSS, notifikasi akan muncul di bagian atas halaman jika peran terkait layanan untuk akun Anda belum dibuat: Missing permissions: AliyunServiceRoleForOssTableMaintenance. Klik Create Now pada notifikasi tersebut untuk membuat peran. Setelah peran dibuat, layanan pemeliharaan latar belakang untuk OSS Tables akan mulai berjalan secara otomatis.
Jika Anda melakukan operasi ini sebagai Pengguna RAM, pastikan Pengguna RAM tersebut memiliki izin yang diperlukan untuk membuat peran terkait layanan. Akun Alibaba Cloud Anda dapat melampirkan kebijakan izin berikut ke Pengguna RAM:
{
"Version": "1",
"Statement": [
{
"Action": "ram:CreateServiceLinkedRole",
"Resource": "*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"ram:ServiceName": "tablemaintenance.oss.aliyuncs.com"
}
}
}
]
}Izin
Kebijakan izin untuk peran terkait layanan ini (AliyunServiceRolePolicyForOssTableMaintenance) mencakup izin berikut untuk membaca konfigurasi tabel, melakukan pemeliharaan data, dan memperbarui metadata:
Action | Description |
oss:GetTableBucketMaintenanceConfiguration | Baca konfigurasi pemeliharaan di tingkat bucket |
oss:GetTableMaintenanceConfiguration | Baca konfigurasi pemeliharaan di tingkat tabel |
oss:ListTableBuckets | List Table Buckets |
oss:GetTableBucket | Dapatkan informasi Table Bucket |
oss:ListTables | List tables |
oss:GetTable | Dapatkan informasi tabel |
oss:GetTableData | Baca file data tabel (untuk melakukan compaction dan pembersihan) |
oss:PutTableData | Tulis file data tabel (untuk menghasilkan file baru setelah compaction) |
oss:GetTableMetadataLocation | Dapatkan lokasi file metadata |
oss:UpdateTableMetadataLocation | Perbarui lokasi file metadata (untuk menerapkan perubahan setelah pemeliharaan) |
Pembersihan file yang tidak direferensikan
Fitur pembersihan file yang tidak direferensikan adalah optimasi di tingkat bucket yang berlaku untuk semua tabel dalam Table Bucket. Fitur ini mengidentifikasi dan menghapus semua objek yang tidak lagi direferensikan oleh snapshot tabel mana pun. Selama operasi penulisan, pembaruan, atau penghapusan data, file data seperti file Parquet, Avro, atau ORC dapat menjadi tidak direferensikan oleh metadata apa pun karena peristiwa seperti pekerjaan penulisan yang gagal atau snapshot yang kedaluwarsa. File yatim ini terus-menerus mengonsumsi ruang penyimpanan.
Saat pembersihan file yang tidak direferensikan diaktifkan, fitur ini juga akan menghapus file Parquet, Avro, atau ORC apa pun yang Anda tambahkan ke Table Bucket yang bukan bagian dari tabel.
Fitur pembersihan file yang tidak direferensikan menggunakan proses dua tahap: pertama menandai file yang tidak direferensikan sebagai non-current (dikontrol oleh unreferencedDays), lalu menghapusnya setelah berada dalam status non-current selama jumlah hari tertentu (dikontrol oleh nonCurrentDays).
Tabel berikut menjelaskan parameter konfigurasi untuk pembersihan file yang tidak direferensikan.
Parameter | Description | Value | Default |
status | Menentukan apakah pembersihan file yang tidak direferensikan diaktifkan. | enabled atau disabled. | enabled |
unreferencedDays | Jumlah hari yang ditunggu sebelum menandai file sebagai non-current setelah tidak lagi direferensikan oleh metadata apa pun. | 1 hingga 2147483647. | 3 |
nonCurrentDays | Jumlah hari yang ditunggu sebelum menghapus file setelah ditandai sebagai non-current. | 1 hingga 2147483647. | 10 |
Konsol
Anda dapat melihat dan mengubah konfigurasi pemeliharaan otomatis untuk Table Bucket di Konsol OSS.
Ikuti langkah-langkah berikut:
Login ke Konsol OSS. Di panel navigasi kiri, pilih Table Bucket List.
Klik nama Table Bucket untuk membuka halaman detailnya.
Pilih tab Data Maintenance.
Di bagian Unreferenced File Cleanup, lihat konfigurasi saat ini:
Status: Menunjukkan apakah fitur diaktifkan.
Unreferenced Days: Jumlah hari yang ditunggu sebelum menandai file sebagai non-current setelah tidak lagi direferensikan oleh metadata apa pun. Nilai default adalah 3 hari.
Non-current Days: Jumlah hari yang ditunggu sebelum menghapus file setelah ditandai sebagai non-current. Nilai default adalah 10 hari.
Klik Edit, ubah parameter untuk pembersihan file yang tidak direferensikan, lalu klik Save.
ossutil
Gunakan ossutil untuk mengubah konfigurasi pembersihan file yang tidak direferensikan:
ossutil tables-api put-table-bucket-maintenance-configuration \
--table-bucket-arn {ARN} \
--type icebergUnreferencedFileRemoval \
--value '{"status":"enabled","settings":{"icebergUnreferencedFileRemoval":{"unreferencedDays":5,"nonCurrentDays":15}}}'SDK
Kode berikut menunjukkan cara mengkueri dan mengubah konfigurasi pembersihan file yang tidak direferensikan untuk Table Bucket menggunakan SDK.
Python
Kueri konfigurasi pembersihan file yang tidak direferensikan:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table bucket maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_bucket_maintenance_configuration(
oss_tables.models.GetTableBucketMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' table bucket arn: {result.table_bucket_arn},'
f' configuration: {result.configuration}')
if __name__ == "__main__":
main()Ubah konfigurasi pembersihan file yang tidak direferensikan:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="put table bucket maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--type', help='The maintenance type, e.g., icebergUnreferencedFileRemoval.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
value = {
'status': 'enabled',
'settings': {
'icebergUnreferencedFileRemoval': {
'unreferencedDays': 7,
'nonCurrentDays': 30
}
}
}
result = client.put_table_bucket_maintenance_configuration(
oss_tables.models.PutTableBucketMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
type=args.type,
value=value,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'successfully updated maintenance configuration for: {args.table_bucket_arn}')
if __name__ == "__main__":
main()Go
Kueri konfigurasi pembersihan file yang tidak direferensikan:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableBucketMaintenanceConfiguration(context.TODO(), &tables.GetTableBucketMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
})
if err != nil {
log.Fatalf("failed to get table bucket maintenance configuration %v", err)
}
log.Printf("get table bucket maintenance configuration result:%#v\n", result)
}Ubah konfigurasi pembersihan file yang tidak direferensikan:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.PutTableBucketMaintenanceConfiguration(context.TODO(), &tables.PutTableBucketMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Type: oss.Ptr("icebergUnreferencedFileRemoval"),
Value: &tables.MaintenanceValue{
Settings: &tables.MaintenanceSettings{
IcebergUnreferencedFileRemoval: &tables.SettingsDetail{
UnreferencedDays: oss.Ptr(4),
NonCurrentDays: oss.Ptr(10),
},
},
Status: oss.Ptr("enabled"),
},
})
if err != nil {
log.Fatalf("failed to put table bucket maintenance configuration %v", err)
}
log.Printf("put table bucket maintenance configuration result:%#v\n", result)
}Java
Kueri konfigurasi pembersihan file yang tidak direferensikan:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableBucketMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableBucketMaintenanceConfigurationRequest request = GetTableBucketMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.build();
GetTableBucketMaintenanceConfigurationResult result = client.getTableBucketMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully got maintenance configuration for table bucket: %s%n", tableBucketARN);
System.out.printf("Table Bucket ARN: %s%n", result.tableBucketARN());
result.configuration().forEach((key, value) -> {
System.out.printf("Configuration Type: %s, Status: %s%n", key, value.status());
});
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}Ubah konfigurasi pembersihan file yang tidak direferensikan:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class PutTableBucketMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String type = "icebergUnreferencedFileRemoval";
String status = "enabled";
int unreferencedDays = 3;
int nonCurrentDays = 3;
IcebergUnreferencedFileRemovalSettings removalSettings = IcebergUnreferencedFileRemovalSettings.newBuilder()
.unreferencedDays(unreferencedDays)
.nonCurrentDays(nonCurrentDays)
.build();
TableBucketMaintenanceSettings settings = TableBucketMaintenanceSettings.newBuilder()
.icebergUnreferencedFileRemoval(removalSettings)
.build();
TableBucketMaintenanceConfigurationValue value = TableBucketMaintenanceConfigurationValue.newBuilder()
.status(status)
.settings(settings)
.build();
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
PutTableBucketMaintenanceConfigurationRequest request = PutTableBucketMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.type(type)
.value(value)
.build();
PutTableBucketMaintenanceConfigurationResult result = client.putTableBucketMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully configured maintenance for table bucket: %s%n", tableBucketARN);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan Operasi API berikut:
Kueri konfigurasi: GetTableBucketMaintenanceConfiguration
Ubah konfigurasi: PutTableBucketMaintenanceConfiguration
Compaction
Compaction adalah optimasi di tingkat tabel. Pada tabel Apache Iceberg, penulisan streaming atau batch kecil yang sering dapat menghasilkan banyak file kecil. Mengkueri tabel dengan banyak file kecil dapat menurunkan kinerja karena mesin kueri harus membuka dan memindai banyak file. Compaction menggabungkan beberapa file kecil menjadi lebih sedikit file yang lebih besar mendekati ukuran target. Proses ini mengurangi jumlah file, meningkatkan kinerja kueri, dan menurunkan overhead metadata.
Tabel berikut menjelaskan parameter konfigurasi untuk compaction.
Parameter | Description | Value | Default |
status | Menentukan apakah compaction otomatis diaktifkan. | enabled atau disabled | enabled |
targetFileSizeMB | Ukuran target dalam MB untuk file setelah compaction. Compaction menggabungkan file yang lebih kecil dari nilai ini menjadi file baru yang mendekati ukuran ini. | 1 hingga 2147483647. | 512 |
strategy | Strategi compaction. Strategi yang berbeda menentukan cara file digabung dan diurutkan. | auto, binpack, sort, atau z-order. Jika Anda mengatur parameter ini ke sort atau z-order, urutan pengurutan harus didefinisikan dalam metadata tabel. | auto |
Daftar berikut menjelaskan strategi compaction yang tersedia:
auto: Sistem secara otomatis memilih strategi compaction optimal. Menerapkan strategi sort pada tabel dengan urutan pengurutan yang telah ditentukan dan strategi binpack pada tabel tanpa urutan tersebut.
binpack: Menggabungkan file hanya berdasarkan ukuran file tanpa mengubah urutan data. Ini adalah strategi tercepat dan cocok ketika pengurutan data tidak diperlukan.
sort: Mengurutkan dan menggabungkan data berdasarkan urutan pengurutan yang ditentukan dalam tabel. Strategi ini cocok untuk skenario kueri rentang. Urutan pengurutan harus didefinisikan dalam metadata tabel.
z-order: Menggunakan kurva Z-Order untuk mengurutkan dan menggabungkan data di beberapa kolom secara bersamaan. Strategi ini cocok untuk skenario kueri multidimensi. Urutan pengurutan harus didefinisikan dalam metadata tabel.
Anda dapat melihat dan mengonfigurasi compaction menggunakan salah satu metode berikut.
Konsol
Lihat dan ubah konfigurasi compaction di tab Data Maintenance untuk tabel.
Login ke Konsol OSS. Di panel navigasi kiri, pilih Table Bucket list.
Klik nama Table Bucket target. Di Table list, klik nama tabel target untuk membuka halaman detail Tabel.
Pilih tab Data Maintenance.
Di bagian Compaction, lihat konfigurasi saat ini:
Status: Menunjukkan apakah compaction otomatis diaktifkan.
Target file size: Ukuran target untuk setiap file setelah compaction. Nilai default adalah 512 MB.
Compaction strategy: Strategi compaction yang digunakan. Nilai default adalah auto.
Job status: Status eksekusi dan waktu pekerjaan compaction terakhir.
Klik Edit, ubah parameter compaction, lalu klik Save.
ossutil
Gunakan ossutil untuk mengubah konfigurasi compaction:
ossutil tables-api put-table-maintenance-configuration \
--table-bucket-arn {ARN} \
--namespace mynamespace \
--name mytable \
--type icebergCompaction \
--value '{"status":"enabled","settings":{"icebergCompaction":{"targetFileSizeMB":256,"strategy":"binpack"}}}'SDK
Contoh kode berikut menunjukkan cara menggunakan SDK untuk mengkueri dan mengubah konfigurasi compaction tabel.
Python
Kueri konfigurasi compaction:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_maintenance_configuration(
oss_tables.models.GetTableMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' table arn: {result.table_arn},'
f' configuration: {result.configuration}')
if __name__ == "__main__":
main()Ubah konfigurasi compaction:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="put table maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
parser.add_argument('--type', help='The maintenance type, e.g., icebergCompaction.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
value = {
'status': 'enabled',
'settings': {
'icebergCompaction': {
'targetFileSizeMB': 512,
'strategy': 'auto'
}
}
}
result = client.put_table_maintenance_configuration(
oss_tables.models.PutTableMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
type=args.type,
value=value,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'successfully updated maintenance configuration for: {args.namespace}/{args.name}')
if __name__ == "__main__":
main()Go
Kueri konfigurasi compaction:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableMaintenanceConfiguration(context.TODO(), &tables.GetTableMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("failed to get table maintenance configuration %v", err)
}
log.Printf("get table maintenance configuration result:%#v\n", result)
}Ubah konfigurasi compaction:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
// icebergCompaction type
result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
Type: oss.Ptr("icebergCompaction"),
Value: &tables.TableMaintenanceValue{
Status: oss.Ptr("enabled"),
Settings: &tables.TableMaintenanceSettings{
IcebergCompaction: &tables.IcebergCompactionSettingsDetail{
TargetFileSizeMB: oss.Ptr(400),
Strategy: oss.Ptr("auto"),
},
},
},
})
// icebergSnapshotManagement type
//result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
// TableBucketARN: oss.Ptr(tableBucketArn),
// Namespace: oss.Ptr(namespace),
// Name: oss.Ptr(name),
// Type: oss.Ptr("icebergSnapshotManagement"),
// Value: &tables.TableMaintenanceValue{
// Status: oss.Ptr("enabled"),
// Settings: &tables.TableMaintenanceSettings{
// IcebergSnapshotManagement: &tables.IcebergSnapshotManagementSettingsDetail{
// MaxSnapshotAgeHours: oss.Ptr(350),
// MinSnapshotsToKeep: oss.Ptr(1),
// },
// },
// },
//})
if err != nil {
log.Fatalf("failed to put table maintenance configuration %v", err)
}
log.Printf("put table maintenance configuration result:%#v\n", result)
}Java
Kueri konfigurasi compaction:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String namespace = "mynamespace";
String name = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableMaintenanceConfigurationRequest request = GetTableMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.build();
GetTableMaintenanceConfigurationResult result = client.getTableMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Table ARN: %s%n", result.tableARN());
if (result.configuration() != null && !result.configuration().isEmpty()) {
System.out.println("Maintenance configurations:");
result.configuration().forEach((type, config) -> {
System.out.printf(" Type: %s, Status: %s%n", type, config.status());
if (config.settings() != null) {
if (config.settings().icebergCompaction() != null) {
System.out.printf(" Compaction - TargetFileSizeMB: %d, Strategy: %s%n",
config.settings().icebergCompaction().targetFileSizeMB(),
config.settings().icebergCompaction().strategy());
}
if (config.settings().icebergSnapshotManagement() != null) {
System.out.printf(" SnapshotManagement - MinSnapshotsToKeep: %d, MaxSnapshotAgeHours: %d%n",
config.settings().icebergSnapshotManagement().minSnapshotsToKeep(),
config.settings().icebergSnapshotManagement().maxSnapshotAgeHours());
}
}
});
} else {
System.out.println("No maintenance configuration found.");
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}Ubah konfigurasi compaction:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class PutTableMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String namespace = "mynamespace";
String name = "mytable";
String type = "icebergCompaction";
String status = "enabled";
int targetFileSizeMB = 256;
String strategy = "auto";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
IcebergCompactionSettings compactionSettings = IcebergCompactionSettings.newBuilder()
.targetFileSizeMB(targetFileSizeMB)
.strategy(strategy)
.build();
TableMaintenanceSettings settings = TableMaintenanceSettings.newBuilder()
.icebergCompaction(compactionSettings)
.build();
TableMaintenanceConfigurationValue value = TableMaintenanceConfigurationValue.newBuilder()
.status(status)
.settings(settings)
.build();
PutTableMaintenanceConfigurationRequest request = PutTableMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.type(type)
.value(value)
.build();
PutTableMaintenanceConfigurationResult result = client.putTableMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully put table maintenance configuration for table: %s/%s, type: %s%n", namespace, name, type);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan Operasi API berikut untuk mengelola konfigurasi compaction:
Kueri konfigurasi: GetTableMaintenanceConfiguration
Ubah konfigurasi: PutTableMaintenanceConfiguration
Manajemen snapshot
Manajemen snapshot adalah optimasi di tingkat tabel. Di Apache Iceberg, setiap operasi penulisan membuat snapshot baru untuk mencatat status data pada titik waktu tertentu. Seiring bertambahnya jumlah penulisan, jumlah snapshot yang berlebihan dapat mengonsumsi ruang penyimpanan signifikan dan meningkatkan overhead operasi metadata. Manajemen snapshot secara otomatis membersihkan snapshot yang kedaluwarsa untuk mengurangi biaya penyimpanan sekaligus memastikan keamanan data.
Manajemen snapshot mengikuti prinsip keamanan data terlebih dahulu: jika kondisi minSnapshotsToKeep dan maxSnapshotAgeHours bertentangan, sistem memprioritaskan mempertahankan jumlah minimum snapshot. Hal ini memastikan bahwa pembersihan snapshot tidak mengganggu kemampuan pemulihan data penting.
Tabel berikut menjelaskan parameter konfigurasi untuk manajemen snapshot.
Parameter | Description | Value | Default |
status | Menentukan apakah manajemen snapshot diaktifkan. | enabled atau disabled. | enabled |
maxSnapshotAgeHours | Periode retensi maksimum untuk snapshot, dalam jam. Snapshot yang lebih tua dari periode ini akan dibersihkan. | 1~2147483647. | 120 |
minSnapshotsToKeep | Jumlah minimum snapshot yang disimpan. Jumlah snapshot terbaru ini dipertahankan meskipun usianya melebihi periode retensi maksimum. | 1~2147483647. | 1 |
Untuk melihat dan mengonfigurasi manajemen snapshot, gunakan salah satu metode berikut:
Konsol
Lihat dan ubah konfigurasi manajemen snapshot di tab Data Maintenance untuk tabel.
Login ke Konsol Manajemen OSS. Di panel navigasi kiri, pilih Table Bucket List.
Klik nama Table Bucket target. Di Table List, klik nama tabel target.
Pilih tab Data Maintenance.
Di bagian Snapshot Management, lihat konfigurasi saat ini:
Status: Menunjukkan apakah fitur diaktifkan.
Maximum Snapshot Retention Time: Periode retensi maksimum untuk snapshot. Defaultnya adalah 120 jam.
Minimum Number of Snapshots to Keep: Jumlah minimum snapshot yang disimpan. Defaultnya adalah 1.
Job Status: Menunjukkan status dan waktu pekerjaan pembersihan snapshot terbaru.
Klik Edit untuk mengubah parameter manajemen snapshot, lalu klik Save.
ossutil
Gunakan ossutil untuk mengubah konfigurasi manajemen snapshot:
ossutil tables-api put-table-maintenance-configuration \
--table-bucket-arn {ARN} \
--namespace mynamespace \
--name mytable \
--type icebergSnapshotManagement \
--value '{"status":"enabled","settings":{"icebergSnapshotManagement":{"maxSnapshotAgeHours":72,"minSnapshotsToKeep":3}}}'SDK
Contoh kode berikut menunjukkan cara menggunakan SDK untuk mengkueri dan mengubah konfigurasi manajemen snapshot tabel. Manajemen snapshot dan compaction menggunakan Operasi API pemeliharaan di tingkat tabel yang sama: GetTableMaintenanceConfiguration dan PutTableMaintenanceConfiguration.
Python
Kueri konfigurasi manajemen snapshot:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_maintenance_configuration(
oss_tables.models.GetTableMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' table arn: {result.table_arn},'
f' configuration: {result.configuration}')
if __name__ == "__main__":
main()Ubah konfigurasi manajemen snapshot:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="put table maintenance configuration sample")
parser.add_argument('--region', help='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
parser.add_argument('--type', help='The maintenance type, e.g., icebergSnapshotManagement.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
value = {
'status': 'enabled',
'settings': {
'icebergSnapshotManagement': {
'maxSnapshotAgeHours': 72,
'minSnapshotsToKeep': 3
}
}
}
result = client.put_table_maintenance_configuration(
oss_tables.models.PutTableMaintenanceConfigurationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
type=args.type,
value=value,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'successfully updated maintenance configuration for: {args.namespace}/{args.name}')
if __name__ == "__main__":
main()Go
Kueri konfigurasi manajemen snapshot:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableMaintenanceConfiguration(context.TODO(), &tables.GetTableMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("failed to get table maintenance configuration %v", err)
}
log.Printf("get table maintenance configuration result:%#v\n", result)
}Ubah konfigurasi manajemen snapshot:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
// icebergSnapshotManagement type
result, err := client.PutTableMaintenanceConfiguration(context.TODO(), &tables.PutTableMaintenanceConfigurationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
Type: oss.Ptr("icebergSnapshotManagement"),
Value: &tables.TableMaintenanceValue{
Status: oss.Ptr("enabled"),
Settings: &tables.TableMaintenanceSettings{
IcebergSnapshotManagement: &tables.IcebergSnapshotManagementSettingsDetail{
MaxSnapshotAgeHours: oss.Ptr(350),
MinSnapshotsToKeep: oss.Ptr(1),
},
},
},
})
if err != nil {
log.Fatalf("failed to put table maintenance configuration %v", err)
}
log.Printf("put table maintenance configuration result:%#v\n", result)
}Java
Kueri konfigurasi manajemen snapshot:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String namespace = "mynamespace";
String name = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableMaintenanceConfigurationRequest request = GetTableMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.build();
GetTableMaintenanceConfigurationResult result = client.getTableMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Table ARN: %s%n", result.tableARN());
if (result.configuration() != null && !result.configuration().isEmpty()) {
System.out.println("Maintenance configurations:");
result.configuration().forEach((type, config) -> {
System.out.printf(" Type: %s, Status: %s%n", type, config.status());
if (config.settings() != null) {
if (config.settings().icebergCompaction() != null) {
System.out.printf(" Compaction - TargetFileSizeMB: %d, Strategy: %s%n",
config.settings().icebergCompaction().targetFileSizeMB(),
config.settings().icebergCompaction().strategy());
}
if (config.settings().icebergSnapshotManagement() != null) {
System.out.printf(" SnapshotManagement - MinSnapshotsToKeep: %d, MaxSnapshotAgeHours: %d%n",
config.settings().icebergSnapshotManagement().minSnapshotsToKeep(),
config.settings().icebergSnapshotManagement().maxSnapshotAgeHours());
}
}
});
} else {
System.out.println("No maintenance configuration found.");
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}Ubah konfigurasi manajemen snapshot:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class PutTableMaintenanceConfigurationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String namespace = "mynamespace";
String name = "mytable";
String type = "icebergSnapshotManagement";
String status = "enabled";
int maxSnapshotAgeHours = 72;
int minSnapshotsToKeep = 3;
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
IcebergSnapshotManagementSettings snapshotManagementSettings = IcebergSnapshotManagementSettings.newBuilder()
.maxSnapshotAgeHours(maxSnapshotAgeHours)
.minSnapshotsToKeep(minSnapshotsToKeep)
.build();
TableMaintenanceSettings settings = TableMaintenanceSettings.newBuilder()
.icebergSnapshotManagement(snapshotManagementSettings)
.build();
TableMaintenanceConfigurationValue value = TableMaintenanceConfigurationValue.newBuilder()
.status(status)
.settings(settings)
.build();
PutTableMaintenanceConfigurationRequest request = PutTableMaintenanceConfigurationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.type(type)
.value(value)
.build();
PutTableMaintenanceConfigurationResult result = client.putTableMaintenanceConfiguration(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully put table maintenance configuration for table: %s/%s, type: %s%n", namespace, name, type);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan Operasi API berikut untuk mengonfigurasi manajemen snapshot:
Kueri konfigurasi: GetTableMaintenanceConfiguration
Ubah konfigurasi: PutTableMaintenanceConfiguration
Mekanisme runtime
Penjadwalan: Backend sistem secara otomatis menjadwalkan dan menjalankan tugas pemeliharaan. Tugas-tugas ini tidak berjalan pada waktu tetap. Biasanya, tugas pemeliharaan untuk tabel tertentu berjalan kira-kira sekali setiap 24 jam. Beban sistem tinggi dapat menunda tugas pemeliharaan.
Penggunaan sumber daya: Tugas pemeliharaan otomatis tidak mengonsumsi kuota throughput atau QPS Anda dan tidak memengaruhi beban kerja produksi Anda.
Isolasi transaksi: Tugas pemeliharaan menggunakan isolasi snapshot Iceberg. Operasi penulisan konkuren dapat berlanjut saat tugas menggabungkan file. Operasi baca juga tidak terpengaruh karena mesin kueri secara otomatis memilih snapshot valid terbaru.
Kueri status pekerjaan pemeliharaan
Periksa status tiga jenis pekerjaan pemeliharaan untuk tabel: compaction, manajemen snapshot, dan pembersihan file yang tidak direferensikan. Setiap jenis pekerjaan mengembalikan statusnya secara independen.
Konsol
Lihat Job status untuk setiap pekerjaan pemeliharaan di tab Data Maintenance tabel.
Masuk ke OSS Management Console. Di bilah navigasi kiri, pilih Table Bucket List.
Klik nama Table Bucket target. Di Table List, klik nama tabel untuk membuka halaman detailnya.
Klik tab Data Maintenance.
Di setiap bagian pemeliharaan, lihat Job status:
Compaction: Menunjukkan status eksekusi pekerjaan compaction (misalnya "Failed" atau "Succeeded") dan timestamp eksekusi terakhir.
Snapshot management: Menunjukkan status eksekusi pekerjaan pembersihan snapshot dan timestamp eksekusi terakhir.
Unreferenced file cleanup: Pekerjaan ini dikonfigurasikan di tingkat Table Bucket. Untuk melihat statusnya, klik tautan Edit Configuration in Table Bucket untuk membuka halaman Data Maintenance Table Bucket.
Ossutil
ossutil tables-api get-table-maintenance-job-status \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket \
--namespace mynamespace \
--name mytableSDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table maintenance job status sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_maintenance_job_status(
oss_tables.models.GetTableMaintenanceJobStatusRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' table arn: {result.table_arn},'
f' status: {result.status}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "The region where the table bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The namespace of the table.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableMaintenanceJobStatus(context.TODO(), &tables.GetTableMaintenanceJobStatusRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("failed to get table maintenance job status %v", err)
}
log.Printf("get table maintenance job status result:%#v\n", result)
}Java
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableMaintenanceJobStatusSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytable-bucket";
String namespace = "mynamespace";
String name = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableMaintenanceJobStatusRequest request = GetTableMaintenanceJobStatusRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.build();
GetTableMaintenanceJobStatusResult result = client.getTableMaintenanceJobStatus(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Table ARN: %s%n", result.tableARN());
if (result.jobStatus() != null && !result.jobStatus().isEmpty()) {
System.out.println("Maintenance job status:");
result.jobStatus().forEach((type, status) -> {
System.out.printf(" Type: %s, Status: %s%n", type, status.status());
if (status.lastRunTimestamp() != null) {
System.out.printf(" LastRunTimestamp: %s%n", status.lastRunTimestamp());
}
if (status.failureMessage() != null && !status.failureMessage().isEmpty()) {
System.out.printf(" FailureMessage: %s%n", status.failureMessage());
}
});
} else {
System.out.println("No maintenance job status found.");
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Panggil API GetTableMaintenanceJobStatus untuk mendapatkan status pekerjaan pemeliharaan.