Cloud Bigtable برای کاربران Cassandra

1. مقدمه

این نرم‌افزار کد راهنمای هر کسی است که درخواست‌های خود را از Apache Cassandra به Google Cloud Bigtable منتقل می‌کند.

در این کد لبه شما

  • از شبیه ساز Cloud Bigtable استفاده کنید
  • یک مورد استفاده از سری زمانی را کاوش کنید
  • یک جدول و خانواده ستون ایجاد کنید
  • معادل های Cloud Bigtable Java CQL Insert، Update، Select و Delete را بیاموزید.

تجربه خود را در استفاده از Google Cloud Platform چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

2. راه اندازی کنید

شما به یک مجموعه داده نمونه با تنها چند ردیف نگاه می کنید تا به شما امکان می دهد مفاهیم اصلی را به سرعت درک کنید.

کاساندرا

پرسش‌های Cassandra معادل در هر مرحله وجود دارد، بنابراین در صورت تمایل یک خوشه محلی را دنبال کنید، یا می‌توانید به سرعت یک خوشه Cassandra کلیک برای استقرار و SSH را در آن راه‌اندازی کنید .

اگر دنبال می‌کنید، یک فضای کلید ایجاد کنید و از آن استفاده کنید. استراتژی تکرار در اینجا مهم نخواهد بود.

cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor' : 2};
cqlsh> use mykeyspace;

Cloud Bigtable

برای جدول خود به یک نمونه Cloud Bigtable نیاز دارید. شما می توانید یک نمونه محلی را به صورت رایگان با استفاده از شبیه ساز تنظیم کنید. شما نیازی به ایجاد فضای کلید در Cloud Bigtable ندارید، همانند سازی شما توسط پیکربندی نمونه شما مدیریت می شود.

برای شروع شبیه ساز از دستور زیر استفاده کنید:

gcloud beta emulators bigtable start

سپس در پنجره یا تب دیگری، متغیر محیط شبیه ساز را با این دستور تنظیم کنید:

$(gcloud beta emulators bigtable env-init) #Sets BIGTAB`LE_EMULATOR_HOST

سپس یک پروژه جاوا ایجاد کنید که از آن برای اجرای نمونه های کد استفاده می کنید و کلاینت Cloud Bigtable را با Maven، Gradle یا SBT وارد کنید . سپس در یک فایل جاوا جدید یک اتصال به سرویس گیرنده داده ایجاد کنید.

BigtableDataSettings settings =
    BigtableDataSettings.newBuilder().setProjectId(projectId).setInstanceId(instanceId).build();

try {
  dataClient = BigtableDataClient.create(settings);
} catch (Exception e) {
  System.out.println("Error during data client connection: \n" + e.toString());
}

3. ایجاد جدول

در هر دو جدول Cassandra و Cloud Bigtable، هر ردیف دارای یک کلید مرتبط با خود است. کلیدهای Cassandra دارای یک کلید پارتیشن و ستون خوشه بندی هستند که می توانند مجزا یا همپوشانی داشته باشند. کل کلیدهای Cloud Bigtable برای تقسیم (پارتیشن) و سفارش استفاده می شود. این دو سیستم در مورد ساخت کلیدهای اولیه/ردیف بسیار شبیه هستند. هر دو سیستم اساساً فهرست‌های طبقه‌بندی شده واژگانی هستند که در آن کلیدها به عنوان شکل اصلی توزیع ردیف بین گره‌ها عمل می‌کنند. در بیشتر موارد می توانید از همان کلید برای Cloud Bigtable دوباره استفاده کنید.

در این کد لبه، شما از Cloud Bigtable برای ذخیره داده های سری زمانی در مورد تلفن های همراه و تبلت های همراه استفاده می کنید (با تبلت های Bigtable اشتباه نگیرید.) در زیر دستورالعمل های ایجاد جدول آمده است.

کاساندرا

cqlsh:mykeyspace> create table mobileTimeSeries (
           deviceid text,
           devicetype text,
           date date,
           connected_cell map<timestamp,Boolean>, 
           os_build text, 
           os_name text,
           PRIMARY KEY((devicetype, deviceid), date));

Cloud Bigtable

می توانید با استفاده از کلاینت جاوا یک جدول و خانواده ستون ایجاد کنید، اما ساده ترین کار استفاده از دستور زیر با ابزار cbt است:

cbt createtable mobile-time-series families=stats_summary

Cloud Bigtable یک پایگاه داده NoSQL است، بنابراین نیازی به تعریف طرحواره در ایجاد جدول نخواهید داشت، اما باید به کوئری هایی که قرار است اجرا کنید فکر کنید و کلید ردیف را برای آنها بهینه کنید.

رایج‌ترین استراتژی برای انتقال کلید صرفاً گرفتن تمام کلیدهای پارتیشن و ستون‌های خوشه‌بندی و پیوستن به آنها برای تشکیل رشته‌ای است که کلید ردیف Cloud Bigtable را نشان می‌دهد. ما به طور کلی استفاده از کلیدهای رشته ای را توصیه می کنیم زیرا به اشکال زدایی توزیع کلید از طریق Key Visualizer کمک می کنند. برای کمک به خوانایی می توانید از یک جداکننده مانند هش '#' بین مقادیر ستون استفاده کنید.

در این مثال، ما از یک ردیف ردیف "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]" استفاده خواهیم کرد.

4. درج

Insert ها بین Cassandra و Cloud Bigtable تقریباً مشابه هستند. در اینجا یک سطر و سپس چندین سطر را با استفاده از کلید ردیفی "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD] وارد می‌کنید.

کاساندرا

مجرد

cqlsh:mykeyspace> insert into mobileTimeSeries (deviceid, devicetype, date, connected_cell, os_build) values ('4c410523', 'phone',toDate(now()), {toTimeStamp(now()): true}, 'PQ2A.190405.003');

دسته ای

cqlsh:mykeyspace> BEGIN BATCH
insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-01', 'chromeos', '12155.0.0-rc1');
insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-02','chromeos', '12145.0.0-rc6');
APPLY BATCH;

Cloud Bigtable

مجرد

با کلید ردیف و داده هایی که می خواهید استفاده کنید، جهش ایجاد کنید، سپس جهش را با سرویس گیرنده داده اعمال کنید. یک ردیف داده برای تلفن همراه با اطلاعاتی درباره اتصال سلولی و سیستم عامل آن اضافه می‌کنید.

try {
  System.currentTimeMillis();
  long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00

  String rowKey = "phone#4c410523#20190501";
  ByteString one = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 1});

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(
              COLUMN_FAMILY_NAME,
              ByteString.copyFrom("connected_cell".getBytes()),
              timestamp,
              one)
          .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "PQ2A.190405.003");

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during Write: \n" + e.toString());
}

دسته ای

چندین جهش را روی یک شی bulkMutation تعریف کنید، سپس از سرویس گیرنده داده برای اعمال همه جهش ها با یک فراخوانی API استفاده کنید. داده‌های چند روزه درباره نام و نسخه سیستم عامل تبلت تلفن همراه اضافه می‌کنید.

try {
  long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00

  BulkMutation bulkMutation =
      BulkMutation.create(tableId)
          .add(
              "tablet#a0b81f74#20190501",
              Mutation.create()
                  .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
                  .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc1"))
          .add(
              "tablet#a0b81f74#20190502",
              Mutation.create()
                  .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
                  .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc6"));

  dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
  System.out.println("Error during WriteBatch: \n" + e.toString());
}

5. به روز رسانی

در اینجا شما سلولی را که هنوز نوشته نشده است به روز می کنید و سپس یک مقدار جدید را در یک سلول می نویسید در حالی که نسخه های قبلی را نیز حفظ می کنید.

کاساندرا

افزودن سلول ها

cqlsh:mykeyspace> UPDATE mobileTimeSeries SET os_name = 'android' WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';

به روز رسانی سلول ها

cqlsh:mykeyspace> UPDATE mobileTimeSeries SET connected_cell = connected_cell +  {toTimeStamp(now()): false} WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';

Cloud Bigtable

در Cloud Bigtable، می‌توانید به‌روزرسانی‌ها را مانند نوشتن رفتار کنید.

افزودن سلول ها

این مانند سلول های نوشتن است، فقط ستونی را که قبلاً روی آن ننوشته اید ارائه دهید. در اینجا نام سیستم عامل را به ردیف گوشی اضافه می کنید.

try {
  long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30

  String rowKey = "phone#4c410523#20190501";

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "android");

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during update: \n" + e.toString());
}

به روز رسانی سلول ها

در اینجا یک داده جدید در مورد وضعیت اتصال تلفن همراه اضافه خواهید کرد. می توانید از نسخه های سلولی برای ذخیره بخشی از داده های سری زمانی خود به راحتی استفاده کنید. فقط یک مهر زمانی برای نوشتن خود ارائه دهید و یک نسخه جدید برای سلول اضافه خواهید کرد. برای پاکسازی داده‌های خود، می‌توانید از جمع‌آوری زباله برای حذف نسخه‌ها پس از تعداد معین یا مدت زمان معینی استفاده کنید.

try {
  long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30

  String rowKey = "phone#4c410523#20190501";

  ByteString zero = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 0});

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(
              COLUMN_FAMILY_NAME,
              ByteString.copyFrom("connected_cell".getBytes()),
              timestamp,
              zero);

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during update2: \n" + e.toString());
}

6. انتخاب می کند

اکنون، داده هایی را که در جدول نوشته اید بازیابی خواهید کرد. هنگام انتقال دستورات انتخاب CQL، باید چندین جنبه از دستورات انتخاب را در نظر بگیرید، مانند ستون‌ها، فیلتر کردن عبارت‌های کجا، و توابع محدود و جمع‌آوری‌شده مانند گروه بر اساس. در اینجا، شما فقط به دو عبارت انتخاب ساده نگاه می‌کنید تا ایده اصلی را بدست آورید، اما می‌توانید برای اطلاعات بیشتر در مورد انتخاب، به مستندات نگاه کنید. در Cloud Bigtable دو نوع عملیات بازیابی وجود دارد: دریافت و اسکن. Get یک ردیف را بازیابی می کند در حالی که اسکن محدوده ردیف ها را بازیابی می کند.

کاساندرا

مجرد

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-04';

چندگانه

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='tablet' AND deviceid = 'a0b81f74' AND date >= '2019-09-04';

Cloud Bigtable

مجرد

از جستجوی ردیف برای دریافت اطلاعات برای یک تلفن خاص در تاریخ مشخص شده استفاده کنید که همه در یک ردیف است. این هر نسخه دارای مهر زمانی مقادیر را برمی گرداند، بنابراین باید دو خط برای connect_cell در مُهر زمانی مختلف مشاهده کنید.

try {
  String rowKey = "phone#4c410523#20190501";

  Row row = dataClient.readRow(tableId, rowKey);
  for (RowCell cell : row.getCells()) {

    System.out.printf(
        "Family: %s    Qualifier: %s    Value: %s    Timestamp: %s%n",
        cell.getFamily(),
        cell.getQualifier().toStringUtf8(),
        cell.getValue().toStringUtf8(),
        cell.getTimestamp());
  }
} catch (Exception e) {
  System.out.println("Error during lookup: \n" + e.toString());
}

چندگانه

از اسکن محدوده برای مشاهده یک ماه داده برای یک رایانه لوحی تلفن همراه مشخص که در چندین ردیف پخش شده است استفاده کنید. می‌توانید از فیلتری با اینها استفاده کنید تا فقط نسخه‌های خاصی از داده‌ها را دریافت کنید یا مقادیر را فیلتر کنید.

try {
  Query query = Query.create(tableId).range("tablet#a0b81f74#201905", "tablet#a0b81f74#201906");
  ServerStream<Row> rowStream = dataClient.readRows(query);
  for (Row row : rowStream) {
    System.out.println("Row Key: " + row.getKey().toStringUtf8());
    for (RowCell cell : row.getCells()) {

      System.out.printf(
          "Family: %s    Qualifier: %s    Value: %s    Timestamp: %s%n",
          cell.getFamily(),
          cell.getQualifier().toStringUtf8(),
          cell.getValue().toStringUtf8(),
          cell.getTimestamp());
    }
  }
} catch (Exception e) {
  System.out.println("Error during scan: \n" + e.toString());
}

7. حذف می کند

در اینجا داده هایی را که در جدول خود قرار داده اید حذف خواهید کرد. ابتدا یک ردیف را حذف می کنید، سپس چندین ردیف را حذف می کنید.

CQL Cassandra امکان حذف تک ردیف و همچنین حذف محدوده زمانی که تمام ستون های اصلی مشخص شده اند را می دهد. می توانید این کار را با Bigtable با اسکن یک محدوده و سپس انجام حذف سطح ردیف انجام دهید. توجه داشته باشید که شما همان نتیجه را دریافت خواهید کرد، اما عملیات بیشتری خواهید داشت زیرا هر حذف عملیات خودش است.

کاساندرا

مجرد

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='phone' and deviceid = '4c410523';

چندگانه

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='tablet' and deviceid = 'a0b81f74';

Cloud Bigtable

مجرد

در اینجا اطلاعات مربوط به یک تلفن و تاریخ خاص را حذف خواهید کرد. از کلید ردیف برای حذف یک ردیف در یک زمان استفاده کنید.

try {
  String rowKey = "phone#4c410523#20190501";

  RowMutation mutation = RowMutation.create(tableId, rowKey).deleteRow();

  dataClient.mutateRow(mutation);
} catch (Exception e) {
  System.out.println("Error during Delete: \n" + e.toString());
}

چندگانه

در اینجا تمام داده های یک تبلت موبایل خاص را حذف خواهید کرد. برای انتقال یک پرس و جوی CQL که چندین ردیف را حذف می کند، باید یک اسکن انجام دهید و سپس هر ردیف را با استفاده از مجموعه کلیدهای ردیف به دست آمده حذف کنید.

try {
  Query query = Query.create(tableId).prefix("tablet#a0b81f7");
  ServerStream<Row> rowStream = dataClient.readRows(query);
  BulkMutation bulkMutation = BulkMutation.create(tableId);
  for (Row row : rowStream) {
    bulkMutation.add(row.getKey(), Mutation.create().deleteRow());
  }

  dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
  System.out.println("Error during DeleteMultiple: \n" + e.toString());
}

8. تمام کردن

پاک کن

کاساندرا

اگر یک خوشه کاساندرا برای دنبال کردن آن ایجاد کردید، با خیال راحت آن را همانطور که معمولاً حذف می‌کنید حذف کنید.

Cloud Bigtable

اگر جدول خود را بر روی یک نمونه موجود در Cloud Bigtable ایجاد کرده اید، می توانید آن را با دستور cbt حذف کنید.

cbt deletetable mobile-time-series

اگر از شبیه ساز استفاده کرده اید، می توانید با تایپ CTRL-C در ترمینالی که آن را شروع کرده اید، شبیه ساز را متوقف کنید تا تمام کارها پاک شود.

مراحل بعدی