クラウドニュース

Googleが円周率31兆桁世界新!の料金は2,529万円 (たぶん)

Googleが、GCP を使って円周率31兆桁を計算したそうです。従来記録を9兆桁上回る世界新記録とか。

「Google が円周率計算なんて大人げない」という意見もありますが、クラウドで円周率計算をするとどうなるかという意味では興味深いです。コストがいくらなのか気になったので、料金を試算してみました。

円周率計算が n1-megamem-96 1インスタンス、計算した結果を出力するストレージノードが n1-standard-16 24インスタンスで、それぞれ 10TB SSD の永続ディスク接続しているとのこと。永続ディスクは iSCSI 接続とのこと。計算よりもストレージがネックなんですね。

ストレージノードの n1-standard-16 は、CPU はそれほど必要ではないと思われますが、ネットワーク帯域幅が vCPU の数によって自動的に決まるので、 ネットワーク帯域幅を確保するために n1-standard-16 とした、とのことです。

計算処理は 111.8日、トータルで 121.1日かかったそうですが、ざっくり4ヶ月として計算すると下記のようになります。

種別マシンタイプ月間料金(コスト)4ヶ月コスト
計算ノードn1-megamem-96
(vCPU96・メモリ1.4TB)
$5,454 1ノード$21,816
ストレージノードn1-standard-16
(vCPU16・メモリ60GB)
$388 24ノード$37,248
ストレージノード 永続ディスク (PD) SSD 10TB$1740 ($0.170/GB)24個(多分)$167,040

合計で $226,104、 日本円だと 25,291,993 円となりました (2019/03/15 現在 1ドル111.86円で計算)。 永続ディスクのスナップショット料金は含めていません (当初 $75,768、日本円で 8,475,408円 と書いてましたが、SSD を 1TB と間違えていましたので再計算しました)。

GCE インスタンスについては継続利用割引適用済なので 30% 引きです (継続利用割引については こちら をどうぞ)

確約利用割引は 1年または3年しか選べないので、今回の4ヶ月という期間にはあわず使っていません。ちなみに以前調べたところでは、確約利用割引は1年で37%引き、3年で55%引きでした 。

詳細は Google のブログをご覧ください。

https://cloud.google.com/blog/products/compute/calculating-31-4-trillion-digits-of-archimedes-constant-on-google-cloud

生成した円周率ファイルが含まれるディスクのスナップショットもありますので円周率が正しいか誰でも検証できます。NTFS・XFS 版が用意されているので、Windows・Linux 等でアクセス可能です。スナップショットから永続ディスクを生成すると1日40ドルかかります。2020年3月14日までこのスナップショットが使えるそうなのでお急ぎください!

メモ

GCPUG slack での yuryu さんの発言 (2019/03/19)

Q.
これは n1-megamem-96 に iSCSI イニシエータを設定し、n1-standard-16 x 24 に iSCSI ターゲットを設定し、n1-megamem-96 では /data0~/data23 とかでマウントした、的な理解でよいのでしょうか。

A.
はい、そんなかんじです。なお今回はSSD-PDを使いましたが、結果的にはStandard PDでもいけたので、もうちょっともっと安くできたと思います。どっちにしても個人ではちょっとお高いですが…

n1-megamem-96 のディスクは結果を格納するためにつけてあって、30TBの SSD-PD をつけてあります
そうですね。あとiSCSIのターゲットはメモリいらないので、highcpu にすればもっと安くなります。あと16 CPUじゃなくて8CPUでもスループットそんなに変わらないと思います。この辺は富豪的にやってしまいました。

GCPのBigQueryに、INFORMATION_SCHEMAとALTER TABLEが追加(ベータ)

2019/02/04 に GCP の BigQuery に、メタ情報 INFORMATION_SCHEMAと、ALTER TABLEが追加されました。

INFORMATION_SCHEMA

データセット一覧を取得するには下記のようにします。

SELECT
 * EXCEPT(schema_owner)
FROM
 INFORMATION_SCHEMA.SCHEMATA

結果は以下のようになります。

  +----------------+---------------+---------------------+---------------------+-----------------+
  |  catalog_name  |  schema_name  |    creation_time    | last_modified_time  |    location     |
  +----------------+---------------+---------------------+---------------------+-----------------+
  | myproject      | mydataset1    | 2018-11-07 19:50:24 | 2018-11-07 19:50:24 | US              |
  | myproject      | mydataset2    | 2018-07-16 04:24:22 | 2018-07-16 04:24:22 | US              |
  | myproject      | mydataset3    | 2018-02-07 21:08:45 | 2018-05-01 23:32:53 | asia-northeast1 |
  +----------------+---------------+---------------------+---------------------+-----------------+

テーブル一覧を取得するには下記のようにします。

SELECT
 * EXCEPT(is_typed)
FROM
 mydataset.INFORMATION_SCHEMA.TABLES
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | table_catalog  | table_schema  |   table_name   | table_type | is_insertable_into |    creation_time    |
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | myproject      | mydataset     | mytable1       | BASE TABLE | YES                | 2018-10-29 20:34:44 |
  | myproject      | mydataset     | myview1        | VIEW       | NO                 | 2018-12-29 00:19:20 |
  +----------------+---------------+----------------+------------+--------------------+---------------------+

カラム情報取得は下記のようにします。

SELECT
 * EXCEPT(is_generated, generation_expression, is_stored, is_updatable)
FROM
 `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
WHERE
 table_name="population_by_zip_2010"

結果は下記です。

+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+
|       table_name       | column_name | ordinal_position | is_nullable | data_type | is_hidden | is_system_defined | is_partitioning_column | clustering_ordinal_position |
+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+
| population_by_zip_2010 | zipcode     |                1 | NO          | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | geo_id      |                2 | YES         | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | minimum_age |                3 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | maximum_age |                4 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | gender      |                5 | YES         | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | population  |                6 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+

さらなる詳細は下記ドキュメントを参照してください。

https://cloud.google.com/bigquery/docs/information-schema-intro

INFORMATION_SCHEMA の料金

INFORMATION_SCHEMAからデータを取得すると、最低でも10MB分のクエリコストがかかります。なぜならキャッシュされないからだそうですが、メタ情報でお金取るんかい! って感じです。ま、10MB分で0.00022円ですけどね。

テーブルの行数とサイズ

INFORMATION_SCHEMA に、テーブルの行数やサイズ情報は含まれていません。これまで通りメタテーブル [データセット名].__TABLES__ を参照する必要があります。

下記のような感じで、サイズが大きいデータセットやテーブルの確認ができるかと思っていたのですが、できないようです。残念。

SELECT dataset_id, sum(size_bytes) INFORMATION_SCHEMA group by dataset_id ORDER BY sum(size_bytes) DESC

ALTER TABLE

ALTER TABLE は作成済テーブルの情報を更新する DDL 文です。

MySQL・PostgreSQL・Oracleのように、作成済テーブル名変更・カラム追加・型変更ができるようになったかと期待したのですが、残念ながらそのようなものではありませんでした。

設定できるのは下記です。かなり限定されていますね。

  • テーブル・パーティションの有効期限 (expiration) 設定
  • 必須パーティションフィルタ (required partition filter) 設定
  • KMSキー名設定
  • 説明文 (description) 設定
  • ラベル設定

具体的には下記のように ALTER TABLE 文を実行します。下記はテーブルに有効期限を設定し、説明文を更新しています。

 #standardSQL
 ALTER TABLE mydataset.mytable
 SET OPTIONS (
   expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
   description="Table that expires seven days from now"
 )

詳細情報は下記を参照してください。

https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language