<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Atsumi</title>
    <description>The latest articles on DEV Community by Atsumi (@__attsun__).</description>
    <link>https://dev.to/__attsun__</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F355626%2Ff50f597b-15b4-4a5c-92c5-288f139908ef.jpg</url>
      <title>DEV Community: Atsumi</title>
      <link>https://dev.to/__attsun__</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/__attsun__"/>
    <language>en</language>
    <item>
      <title>"Unable to find current origin/master revision in submodule path" error at Github Action "actions/checkout@v2"</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Thu, 20 May 2021 14:34:41 +0000</pubDate>
      <link>https://dev.to/__attsun__/unable-to-find-current-origin-master-revision-in-submodule-path-error-at-github-action-actions-checkout-v2-oho</link>
      <guid>https://dev.to/__attsun__/unable-to-find-current-origin-master-revision-in-submodule-path-error-at-github-action-actions-checkout-v2-oho</guid>
      <description>&lt;p&gt;When I run following actions (that checkout repository with submodules and update),&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.head_ref }}&lt;/span&gt;
    &lt;span class="na"&gt;submodules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recursive'&lt;/span&gt;
    &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.MY_PAT }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;following error has occurred.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unable to find current origin/master revision in submodule path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This issue was fixed by &lt;code&gt;fetch-depth: 0&lt;/code&gt; option at checkout action.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GNU timeを知った</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Wed, 17 Jun 2020 10:15:49 +0000</pubDate>
      <link>https://dev.to/__attsun__/gnu-time-49m8</link>
      <guid>https://dev.to/__attsun__/gnu-time-49m8</guid>
      <description>&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/high-performance-python/9781492055013/"&gt;High Performance Python 2nd Edition&lt;/a&gt;を読む中で、&lt;br&gt;
timeはGNU版と簡易版の二つがあることを知った。&lt;/p&gt;
&lt;h3&gt;
  
  
  time（シェル組み込み）
&lt;/h3&gt;

&lt;p&gt;bashやzshのプロンプトでパスが通っている &lt;code&gt;time&lt;/code&gt;はシェル組み込みのtimeで、簡易版らしい。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# zsh
$ time sleep 1
sleep 1  0.00s user 0.00s system 0% cpu 1.004 total
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  GNU time
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/usr/bin/time&lt;/code&gt;にインストールされたコマンドはGNU版で、上記よりもリッチな情報を出すことができる。&lt;/p&gt;

&lt;p&gt;macの場合は&lt;code&gt;brew install gnu-time&lt;/code&gt;で&lt;code&gt;gtime&lt;/code&gt;としてインストール可能。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gtime --verbose sleep 1
        Command being timed: "sleep 1"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: 0%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.00
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 612
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 297
        Voluntary context switches: 0
        Involuntary context switches: 17
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Major (requiring I/O) page faults&lt;/code&gt;は、スワップの発生を意味しており注意すべきメトリクスである。&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>MLflowに入門してみる</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Tue, 09 Jun 2020 10:40:16 +0000</pubDate>
      <link>https://dev.to/__attsun__/mlflow-2ka2</link>
      <guid>https://dev.to/__attsun__/mlflow-2ka2</guid>
      <description>&lt;h1&gt;
  
  
  MLflowとは
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.mlflow.org/docs/latest/index.html"&gt;公式ドキュメントのトップページ&lt;/a&gt;によると以下。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;オープンソースで、機械学習の一連のサイクルを管理するためのソフトウェア。&lt;/li&gt;
&lt;li&gt;MLflowはPython, R, JavaのAPIを持つ他、REST APIやCLIもあるので様々なライブラリや言語と合わせて利用することができる。&lt;/li&gt;
&lt;li&gt;以下４つの機能を持つ。

&lt;ul&gt;
&lt;li&gt;MLflow tracking

&lt;ul&gt;
&lt;li&gt;学習に利用するコードやパラメータ、学習の結果を記録することで、過去の学習記録を簡単にトラッキングできるようにする。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;MLflow Projects

&lt;ul&gt;
&lt;li&gt;コードを再利用可能にする仕組み。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;MLflow Models

&lt;ul&gt;
&lt;li&gt;機械学習モデルをパッケージングし、様々なプラットフォームで利用な可能な形式で提供することを可能にする&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;MLflow Model Registry

&lt;ul&gt;
&lt;li&gt;機械学習モデルを保存するレジストリ。バージョンや学習の情報などを提供する。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Tutorial
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html"&gt;https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  このチュートリアルの内容
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;線形回帰モデルを学習&lt;/li&gt;
&lt;li&gt;コードをパッケージングし再利用可能な状態にする&lt;/li&gt;
&lt;li&gt;モデルをHTTPで利用可能な形でデプロイする&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  実践
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 環境構築
pipenv install "mlflow[extras]" 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  学習を実行（MLflow Tracking）
&lt;/h3&gt;

&lt;p&gt;以下を写経&lt;br&gt;
&lt;a href="https://github.com/mlflow/mlflow/blob/master/examples/sklearn_elasticnet_wine/train.py"&gt;https://github.com/mlflow/mlflow/blob/master/examples/sklearn_elasticnet_wine/train.py&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 実行
## ハイパーパラメータを適当に変えていくつか作ってみる
$ pipenv run python sklearn_elasticnet_wine_train.py
$ pipenv run python sklearn_elasticnet_wine_train.py 0.6 0.6
$ pipenv run python sklearn_elasticnet_wine_train.py 0.4 0.4

# mlrunsというディレクトリができる
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  学習を結果を確認
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# UIを起動
pipenv run mlflow ui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;モデルの作成時刻やハイパーパラメータ、学習結果などを閲覧可能。&lt;/li&gt;
&lt;li&gt;モデルごとの比較が可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  モデルをパッケージングする（MLflow Projects)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  基本的なディレクトリを作る
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir sklearn_elasticnet_wine
mv sklearn_elasticnet_wine.py sklearn_elasticnet_wine/train.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Projectsファイルを作成
&lt;/h4&gt;

&lt;p&gt;こちらに記載のある二つのファイルを作成する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html#packaging-training-code-in-a-conda-environment"&gt;https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html#packaging-training-code-in-a-conda-environment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;※ &lt;code&gt;conda.yaml&lt;/code&gt;は、UIのモデル詳細にあったのでコピペした&lt;/p&gt;

&lt;h4&gt;
  
  
  実行
&lt;/h4&gt;

&lt;p&gt;condaは使いたくないので &lt;code&gt;--no-conda&lt;/code&gt;を利用&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipenv run mlflow run sklearn_elasticnet_wine -P alpha=0.42 --no-conda 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;MLProjectsの実行環境は、&lt;code&gt;conda&lt;/code&gt;, &lt;code&gt;Docker&lt;/code&gt;, &lt;code&gt;System Environment&lt;/code&gt; (今回)の３つを選択可能。&lt;/p&gt;

&lt;p&gt;これで、モデル生成に利用したコードと実行環境を別環境でも再現できるようになった。&lt;/p&gt;

&lt;h3&gt;
  
  
  モデルをサーブする(MLflow Model)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  生成されたモデルアーティファクト
&lt;/h4&gt;

&lt;p&gt;モデル作成のステップで作成された &lt;code&gt;mlruns/0/ハッシュ値/artifacts/model/&lt;/code&gt;ディレクトリに必要なものが格納されている。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MLmodel: モデルに関するメタ情報&lt;/li&gt;
&lt;li&gt;model.pkl: 学習済みモデルをシリアライズしたもの&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ちなみに、MLProjectsで利用した&lt;code&gt;conda.yaml&lt;/code&gt;もここに入っている。&lt;/p&gt;

&lt;h4&gt;
  
  
  web APIとしてデプロイ
&lt;/h4&gt;

&lt;p&gt;こちらも、condaを入れたくないので &lt;code&gt;--no-conda&lt;/code&gt;で動かす&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipenv run mlflow models serve -m mlruns/0/2ca121e400654d5898de9f4f9e1fe928/artifacts/model -p 1234 --no-conda 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;リクエストできた。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST -H "Content-Type:application/json; format=pandas-split" --data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' http://127.0.0.1:1234/invocations

[4.479576972663602]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>mlflow</category>
      <category>mlops</category>
    </item>
    <item>
      <title>BigQueryベストプラクティス (パフォーマンス:3)</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Mon, 01 Jun 2020 00:30:04 +0000</pubDate>
      <link>https://dev.to/__attsun__/bigquery-3-52fo</link>
      <guid>https://dev.to/__attsun__/bigquery-3-52fo</guid>
      <description>&lt;p&gt;公式ドキュメントに記載のある「BigQuery best practices」をまとめてみるシリーズ。&lt;/p&gt;

&lt;p&gt;今回は「Managing query outputs」をまとめます。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;イタリック体はドキュメントに記載のない追加コメント&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  クエリアウトプットに関するベストプラクティス
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-output"&gt;原文&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid repeatedly joining the same tables and using the same subqueries.
&lt;/h3&gt;

&lt;p&gt;繰り返し、同じテーブルや同じサブクエリをジョインすることを避ける。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;何度も同じテーブルをJOINする場合は、ネストされたカラムを利用して非正規化する。&lt;/li&gt;
&lt;li&gt;何度も同じサブクエリを使う場合は、サブクエリをテーブルとしてマテリアライズする。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Carefully consider materializing large result sets to a destination table. Writing large result sets has performance and cost impacts.
&lt;/h3&gt;

&lt;p&gt;巨大な結果セットを書き込む場合、パフォーマンスとコストに影響があるので注意する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;キャッシュされた結果セットの上限は10GB程度なので、これを越すと &lt;code&gt;Response too large&lt;/code&gt;エラーに繋がる&lt;/li&gt;
&lt;li&gt;避けるには、以下の手段を用いる

&lt;ul&gt;
&lt;li&gt;適切にフィルターする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ORDER BY&lt;/code&gt; を利用する場合は &lt;code&gt;LIMIT&lt;/code&gt; を利用する&lt;/li&gt;
&lt;li&gt;出力テーブルを指定する&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;巨大なテーブルを作成する場合は、有効期限を設定するなどしてコスト管理する。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you are sorting a very large number of values, use a LIMIT clause.
&lt;/h3&gt;

&lt;p&gt;巨大なデータセットをそーとする場合、 &lt;code&gt;LIMIT&lt;/code&gt; を利用しよう&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;巨大なデータセットに &lt;code&gt;ORDER BY&lt;/code&gt; をすると、 &lt;code&gt;Resource exceeded&lt;/code&gt; が発生する。これは、ソートの最終ステージは一つのスロットのみで行われるため、スロットの容量を超えてしまうことで発生する。&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bigquery</category>
    </item>
    <item>
      <title>AI Platform Pipelinesを触ってみる</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Sun, 31 May 2020 06:35:43 +0000</pubDate>
      <link>https://dev.to/__attsun__/ai-platform-pipelines-4o5b</link>
      <guid>https://dev.to/__attsun__/ai-platform-pipelines-4o5b</guid>
      <description>&lt;h1&gt;
  
  
  AI Platform Pipelinesとは
&lt;/h1&gt;

&lt;p&gt;Kubeflow pipelinesを、GCP上に簡単にセットアップしてくれるGCPサービス。&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubeflow Pipelinesとは
&lt;/h2&gt;

&lt;p&gt;Kubeflowは、機械学習にまつわるワークフロー（前処理、モデルビルド、デプロイなど）をKubernetes上で管理するための一連のソフトウェア。&lt;/p&gt;

&lt;p&gt;Kubeflow PipelinesはKubeflowが提供するコンポーネントの一つで、機械学習にまつわるジョブの流れ（パイプライン）を管理する。&lt;/p&gt;

&lt;h3&gt;
  
  
  TFXとの関係
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;TFX Pipelinesのオーケストレーターの一つのオプションとしても利用できるらしい 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tensorflow.org/tfx/guide/kubeflow?hl=ja%EF%BC%89"&gt;https://www.tensorflow.org/tfx/guide/kubeflow?hl=ja）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;元々は、TFX PipelinesをKubernetesで簡単に動かすためのGoogle内部ツールだったらしい

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Kubeflow"&gt;https://en.wikipedia.org/wiki/Kubeflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;他のオーケストレーターとしてはApache beam, airflowがある。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  パイプラインの構成
&lt;/h2&gt;

&lt;p&gt;パイプラインは、複数のコンポーネントのDAGから成る。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WCX5Dvu2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cloud.google.com/ai-hub/docs/images/kubeflow-pipeline.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WCX5Dvu2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cloud.google.com/ai-hub/docs/images/kubeflow-pipeline.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://cloud.google.com/ai-platform/pipelines/docs/introduction"&gt;出典は公式ドキュメント&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;コンポーネントは、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;コンテナイメージ&lt;/li&gt;
&lt;li&gt;インプットパラメータ&lt;/li&gt;
&lt;li&gt;アウトプット&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;から成る。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TSEsbndX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cloud.google.com/ai-hub/docs/images/kubeflow-component.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TSEsbndX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cloud.google.com/ai-hub/docs/images/kubeflow-component.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://cloud.google.com/ai-platform/pipelines/docs/introduction"&gt;出典は公式ドキュメント&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting Started!
&lt;/h1&gt;

&lt;h2&gt;
  
  
  環境構築
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/ai-platform/pipelines/docs/getting-started"&gt;公式ドキュメント&lt;/a&gt;の通りに実施。&lt;/p&gt;

&lt;h3&gt;
  
  
  インストールされたコンポーネント
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get deploy
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
cache-deployer-deployment         1/1     1            1           10m
cache-server                      1/1     1            1           10m
metadata-envoy                    1/1     1            1           10m
metadata-grpc-deployment          1/1     1            1           10m
metadata-writer                   1/1     1            1           9m59s
minio                             1/1     1            1           9m59s
ml-pipeline                       1/1     1            1           10m
ml-pipeline-persistenceagent      1/1     1            1           10m
ml-pipeline-scheduledworkflow     1/1     1            1           10m
ml-pipeline-ui                    1/1     1            1           10m
ml-pipeline-viewer-crd            1/1     1            1           10m
ml-pipeline-visualizationserver   1/1     1            1           10m
mysql                             1/1     1            1           9m59s
proxy-agent                       1/1     1            1           10m
workflow-controller               1/1     1            1           10m

$ kubectl get cm
NAME                            DATA   AGE
cache-configmap                 4      10m
gcp-default-config              3      10m
inverse-proxy-config            3      10m
metadata-grpc-configmap         2      10m
metadata-mysql-configmap        3      10m
workflow-controller-configmap   1      10m

$ kubectl get crd
NAME                                           CREATED AT
applications.app.k8s.io                        2020-05-31T05:19:02Z
backendconfigs.cloud.google.com                2020-05-31T05:19:12Z
capacityrequests.internal.autoscaling.k8s.io   2020-05-31T05:18:57Z
managedcertificates.networking.gke.io          2020-05-31T05:19:05Z
releaserollbacks.app.gke.io                    2020-05-31T05:19:03Z
releasetracks.app.gke.io                       2020-05-31T05:19:02Z
scalingpolicies.scalingpolicy.kope.io          2020-05-31T05:18:59Z
scheduledworkflows.kubeflow.org                2020-05-31T05:23:14Z
storagestates.migration.k8s.io                 2020-05-31T05:19:07Z
storageversionmigrations.migration.k8s.io      2020-05-31T05:19:06Z
updateinfos.nodemanagement.gke.io              2020-05-31T05:19:09Z
viewers.kubeflow.org                           2020-05-31T05:23:14Z
workflows.argoproj.io                          2020-05-31T05:23:14Z
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;非常に多くのコンポーネントがインストールされています。手動でのインストールは大変そうですね・・・。&lt;/p&gt;

&lt;p&gt;実際、Kubeflowの公式インストール手順は多くのステップがあります。クラウドの恩恵を感じます。&lt;br&gt;
&lt;a href="https://www.kubeflow.org/docs/gke/deploy/"&gt;https://www.kubeflow.org/docs/gke/deploy/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;argo workflowsがインストールされており、kubeflow pipelinesのジョブはargoのジョブとして実際には起動されているようです。&lt;/p&gt;

&lt;h2&gt;
  
  
  サンプルジョブを動かす
&lt;/h2&gt;

&lt;p&gt;いくつかのサンプルが用意されています。ドキュメントの通り、「[Tutorial] Data passing in python components」を動かします。&lt;/p&gt;

&lt;p&gt;ビューからは、パイプラインの状況やログ、IN/OUTなどを確認できます。リトライやジョブ介ジューリグもあり、ジョブフローとして一通りのものは揃っており、完成度は高そうに感じます。単純にairflowの代替としての利用もありえるのではないかなと思いました。&lt;/p&gt;

&lt;p&gt;あとはスケジュール実行ジョブの設定を、airflowのように一覧でみられるビューがあればなお良さそう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u2RvfXAR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gz7b06hhi54jk1ljrt9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u2RvfXAR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gz7b06hhi54jk1ljrt9y.png" alt="job view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  サンプルジョブの中身を拝見
&lt;/h3&gt;

&lt;p&gt;動かすだけではつまらないので、サンプルジョブの&lt;a href="https://github.com/kubeflow/pipelines/blob/9c16e12ba01962668b15fc19efa69b5ba78f618d/samples/tutorials/Data%20passing%20in%20python%20components/Data%20passing%20in%20python%20components%20-%20Files.py"&gt;ソースコード&lt;/a&gt;を見てみます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/"&gt;kfp&lt;/a&gt;というPythonライブラリを利用して作られている。&lt;/li&gt;
&lt;li&gt;具体的には、&lt;a href="https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/"&gt;kfp.func_to_container_op&lt;/a&gt;というデコレータを利用して、関数をKubeflow pipelinesのコンポーネントとして登録している&lt;/li&gt;
&lt;li&gt;上記を&lt;a href="https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/#sdk-packages"&gt;kfp.compiler.Compiler.compile&lt;/a&gt;することで、これらのPythonコードをkubeflowで実行可能なyamlに変換している。

&lt;ul&gt;
&lt;li&gt;Pythonコードはyamlの中にベタガキにする、Dockerイメージとしてまとめる、のオプションがある&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;DAGの依存関係については、パラメータの受け渡しから自動的に算出されてるぽいので、airflowのようにマニュアルに管理しなくて良いのがよさそう&lt;/li&gt;
&lt;li&gt;今回のサンプルはkfpだけで完結していますが、tfxを使ってDAGを定義することもできるようです。機械学習モデルを作成するための様々な便利ライブラリが用意されているので、実運用ではtfxを多く利用することになりそうと感じました。

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kubeflow/pipelines/blob/9c16e12ba01962668b15fc19efa69b5ba78f618d/samples/core/iris/iris.py"&gt;https://github.com/kubeflow/pipelines/blob/9c16e12ba01962668b15fc19efa69b5ba78f618d/samples/core/iris/iris.py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  まとめ
&lt;/h1&gt;

&lt;p&gt;一旦はここまで。argo workflowsの力もあってか、ジョブフローエンジンとしての完成度がとても高く感じました。また、使いやすそうなSDKも良い。kubeflowのその他様々なコンポーネントとどのくらいシームレスに繋がれるのか確認してみたいと思います。&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>googlecloud</category>
      <category>mlops</category>
      <category>kubeflow</category>
    </item>
    <item>
      <title>BigQueryベストプラクティス (パフォーマンス:2)</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Thu, 21 May 2020 01:38:29 +0000</pubDate>
      <link>https://dev.to/__attsun__/bigquery-2-1pnb</link>
      <guid>https://dev.to/__attsun__/bigquery-2-1pnb</guid>
      <description>&lt;p&gt;公式ドキュメントに記載のある「BigQuery best practices」をまとめてみるシリーズ。&lt;/p&gt;

&lt;p&gt;今回はパフォーマンスのプラクティス後半をまとめます。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;イタリック体はドキュメントに記載のない追加コメント&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  クエリの計算量に関するベストプラクティス
&lt;/h2&gt;

&lt;p&gt;[原文](&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-compute"&gt;https://cloud.google.com/bigquery/docs/best-practices-performance-compute&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  If you are using SQL to perform ETL operations, avoid situations where you are repeatedly transforming the same data.
&lt;/h3&gt;

&lt;p&gt;何度も同じ変換処理を繰り返す場合は、マテリアライズなどで効率化する。&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid using JavaScript user-defined functions. Use native UDFs instead
&lt;/h3&gt;

&lt;p&gt;JavaScriptユーザー定義関数は避け、ネイティブのユーザー定義関数を使う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScriptユーザー定義関数はサブプロセスを起動するため、パフォーマンスインパクトがある。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If your use case supports it, use an approximate aggregation function
&lt;/h3&gt;

&lt;p&gt;可能であれば近似集計関数を利用する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;正確な値が不要ならば、&lt;code&gt;APPROX_COUNT_DISTINCT&lt;/code&gt;やHyperLogLog（&lt;code&gt;HLL_COUNT&lt;/code&gt;）のような近似集計関数を利用することでパフォーマンスを向上させられる。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use ORDER BY only in the outermost query or within window clauses (analytic functions). Push complex operations to the end of the query
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ORDER BY&lt;/code&gt;は、極力データを絞ったあとに利用しよう。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ソートはパフォーマンスに大きな影響を与えるが、クエリの最後や、window関数内に&lt;code&gt;ORDER BY&lt;/code&gt;を配置すれば効率化可能。&lt;/li&gt;
&lt;li&gt;正規表現などの関数についても、データを絞った後に実施すればパフォーマンス向上が狙える。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For queries that join data from multiple tables, optimize your join patterns. Start with the largest table.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;JOIN&lt;/code&gt;をするときは、サイズの大きなテーブルを先に記述しよう&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;小さなテーブルが後にくると、効率の良いブロードキャストジョインが行われる。（小さなテーブルの全データを各スロットにばらまくためシンプル）&lt;/li&gt;
&lt;li&gt;これに関してはオプティマイザーが効くこともあるが、今のところはユーザーも気をつけた方が良い。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When querying a partitioned table, use the _PARTITIONTIME pseudo column to filter the partitions
&lt;/h3&gt;

&lt;p&gt;パーティション分割テーブルにクエリをするときは、&lt;code&gt;_PARTITIONTIME&lt;/code&gt;カラムでフィルタをする&lt;/p&gt;

&lt;h2&gt;
  
  
  クエリのアウトプットに関するベストプラクティス
&lt;/h2&gt;

&lt;p&gt;[原文」(&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-output"&gt;https://cloud.google.com/bigquery/docs/best-practices-performance-output&lt;/a&gt;)&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid repeatedly joining the same tables and using the same subqueries
&lt;/h3&gt;

&lt;p&gt;繰り返しのJOINやサブクエリは避ける&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JOINが繰り返し必要ならば、ネストされたフィールドを利用することで非正規化をすることでパフォーマンスが向上できる&lt;/li&gt;
&lt;li&gt;同じサブクエリが複数回登場する場合、マテリアライズすることでパフォーマンスが改善できる。ストレージコストはかかるが、多くの場合はパフォーマンス改善効果がコストを上回るはず。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Carefully consider materializing large result sets to a destination table. Writing large result sets has performance and cost impacts
&lt;/h3&gt;

&lt;p&gt;大きなサイズの結果セットを作る場合は、コストとパフォーマンスに注意しよう。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BigQueryはだいたい10GBの結果キャッシュを持っているが、大きな結果セットを生み出してしまうと容易にその制限を超えてしまう。&lt;/li&gt;
&lt;li&gt;大きすぎると &lt;code&gt;Response too large&lt;/code&gt; というエラーにより失敗してしまう。&lt;/li&gt;
&lt;li&gt;回避するプラクティス

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;WHERE&lt;/code&gt;などにより、結果セットを適切に小さくする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LIMIT&lt;/code&gt;を利用して結果セットを小さくする。&lt;code&gt;ORDER BY&lt;/code&gt;を利用するときにも効果がある&lt;/li&gt;
&lt;li&gt;結果セットをテーブルに書き込む&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;大きすぎる結果セットをテーブルに書き込む場合、パフォーマンスやコストへのインパクトがある。有効期限を設定することで、大きすぎるテーブルが残らないようにするのも良い。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you are sorting a very large number of values, use a LIMIT clause.
&lt;/h3&gt;

&lt;p&gt;大きな結果セットをソートする場合、LIMITを利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ORDER BY&lt;/code&gt;は&lt;code&gt;Resource exceeded&lt;/code&gt;エラーを発生させることがある。これは、&lt;code&gt;ORDER BY&lt;/code&gt;は最終的には1スロットでソート処理を実施しなければならないが、結果セットサイズが1スロットへの割り当て上限をオーバーしてしまうため。&lt;/li&gt;
&lt;li&gt;上記は、LIMITを利用することで回避可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SQLアンチパターン
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-patterns"&gt;原文&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以下のSQLアンチパターンを避けることで、パフォーマンス向上が狙える。&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid self-joins. Use a window function instead.
&lt;/h3&gt;

&lt;p&gt;セルフジョインは避け、可能な限りwindow関数を利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;セルフジョインはレコード数が２倍に膨れ上がり、パフォーマンス劣化につながる&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If your query processes keys that are heavily skewed to a few values, filter your data as early as possible
&lt;/h3&gt;

&lt;p&gt;特定のキーにデータが偏っている場合、できるだけ早くデータをフィルタリングする&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;スロット間でパーティションを共有することはできないため、特定のパーティションサイズが大きくなると、それが原因で遅くなったり、&lt;code&gt;resource exceeded&lt;/code&gt; エラーになってしまう。&lt;/li&gt;
&lt;li&gt;例えばユーザーテーブルで、匿名ユーザーを同じIDで登録している場合、匿名ユーザーIDのレコードが圧倒的に大きくなる&lt;/li&gt;
&lt;li&gt;query planをみた時に、avgとmaxが大きく乖離している場合はこの事象が発生している可能性がある。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;APPROX_TOP_COUNT&lt;/code&gt; を利用することでこの事象が起きているか確認できる。&lt;/li&gt;
&lt;li&gt;JOINした結果、各キーのデータの偏りが出ることもあるため、事前にフィルタリングするなどをした方が良い。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Avoid joins that generate more outputs than inputs. When a CROSS JOIN is required, pre-aggregate your data.
&lt;/h3&gt;

&lt;p&gt;インプットよりも大きなアウトプットを生み出すクエリを避ける。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CROSS JOINをする場合は事前に集計をすることでデータ量を減らす。&lt;/li&gt;
&lt;li&gt;GROUP BY やWindow関数を利用してデータ量を減らす&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Avoid point-specific DML statements (updating or inserting 1 row at a time). Batch your updates and inserts
&lt;/h3&gt;

&lt;p&gt;DMPクエリを実行する場合は、１行ずつではなくまとめて行う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;１行ずつの更新が必要な場合、BigQueryは用途にあっていないのでCloudSQLなどOLTPに向いたものを利用する。&lt;/li&gt;
&lt;li&gt;もしくは、ストリーミングインサートを利用する。&lt;/li&gt;
&lt;li&gt;ステートメントのサイズにも制限があるので、大量のUPDATEがある場合は、１行ずつクエリを並べるのではなくまとめて更新されるようなクエリを書く。&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bigquery</category>
    </item>
    <item>
      <title>BigQueryベストプラクティス (パフォーマンス:1)</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Thu, 30 Apr 2020 01:15:23 +0000</pubDate>
      <link>https://dev.to/__attsun__/bigquery-210e</link>
      <guid>https://dev.to/__attsun__/bigquery-210e</guid>
      <description>&lt;p&gt;公式ドキュメントに記載のある「BigQuery best practices」をまとめてみるシリーズ。&lt;/p&gt;

&lt;p&gt;今回は&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-overview"&gt;パフォーマンス&lt;/a&gt;のプラクティスをまとめます。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;イタリック体はドキュメントに記載のない追加コメント&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ベストプラクティス
&lt;/h1&gt;

&lt;h2&gt;
  
  
  データソースに関するベストプラクティス
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-input"&gt;原文&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Control projection — Query only the columns that you need
&lt;/h3&gt;

&lt;p&gt;SELECT *を避けようという話。既出のため割愛。&lt;/p&gt;

&lt;h3&gt;
  
  
  When querying a partitioned table, use the _PARTITIONTIME pseudo column to filter the partitions
&lt;/h3&gt;

&lt;p&gt;分割テーブルは _PARTITIONTIME 列でフィルタをする。&lt;/p&gt;

&lt;h3&gt;
  
  
  BigQuery performs best when your data is denormalized
&lt;/h3&gt;

&lt;p&gt;スキーマの非正規化を行う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;正規化によるストレージ容量の節約効果は薄い&lt;/li&gt;
&lt;li&gt;正規化してJOINする場合、通信等のオーバーヘッドがあるが、非正規化する場合は個別のスロットで並列化されるためパフォーマンスが向上する。&lt;/li&gt;
&lt;li&gt;非正規化した上でリレーションを保つには、nested field（REPEATEDやSTRUCT）を利用する。&lt;/li&gt;
&lt;li&gt;ただし、以下のような場合は非正規化を避ける

&lt;ul&gt;
&lt;li&gt;スタースキーマにおいてディメンジョンの変更頻度が高い&lt;/li&gt;
&lt;li&gt;OLTPとしての利用（そもそもBigQuery自体が適していないと思うが）&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If query performance is a top priority, do not use an external data source
&lt;/h3&gt;

&lt;p&gt;パフォーマンスが大事なら、外部データソースは利用しない。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud StorageやGoogle Driveをデータソースとして利用できるが、BigQueryにデータを格納するよりもパフォーマンスは悪くなる&lt;/li&gt;
&lt;li&gt;外部データソースは以下のケースで利用する

&lt;ul&gt;
&lt;li&gt;ETL&lt;/li&gt;
&lt;li&gt;頻繁に変更されるデータ&lt;/li&gt;
&lt;li&gt;定期的なデータ取り込み&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When querying wildcard tables, use the most granular prefix possible
&lt;/h3&gt;

&lt;p&gt;複数テーブルに対してワイルドカードを用いたクエリをする場合は、できる限り絞り込んだ表現を利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;例えばdata_2010のような末尾が年度になっているテーブルがあるとして、2010年台のデータのみが欲しいのであれば、FROM data_201*は、FROM data_*よりも対象テーブルが少ないため好ましい。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  スロット間のデータ移動（shuffle）に関するベストプラクティス
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-performance-communication"&gt;原文&lt;/a&gt;&lt;br&gt;
&lt;em&gt;中身は少しタイトルとあっていないかも。JOINとシャーディングの話が中心&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduce the amount of data that is processed before a JOIN clause
&lt;/h3&gt;

&lt;p&gt;JOINの前に、データ量を削減する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JOINはshuffle（データの移動とマージ）が行われるため、shuffleが実行される以前にデータ量をwhere区などで削減することでパフォーマンス改善につながります。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use WITH clauses primarily for readability
&lt;/h3&gt;

&lt;p&gt;With句はリーダビリティのためだけに利用する。マテリアライズされるわけではないので、参照するたびにクエリが実行されます。&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not use tables sharded by date (also called date-named tables) in place of time-partitioned tables
&lt;/h3&gt;

&lt;p&gt;日付ごとにテーブルを作るのではなく、&lt;a href="https://cloud.google.com/bigquery/docs/partitioned-tables"&gt;パーティション分割テーブル&lt;/a&gt;を利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;日付ごとにテーブルを作るアプローチは、以下のオーバーヘッドがある。

&lt;ul&gt;
&lt;li&gt;個別のテーブルごとにメタデータを保持する&lt;/li&gt;
&lt;li&gt;クエリ実行時に個別のテーブルごとに権限を確認する必要がある&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;_ちなみに、日付分割されたテーブルで、読み込むテーブルを緻密に絞るには&lt;code&gt;_TABLE_SUFFIX&lt;/code&gt;擬似列を利用する。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Avoid creating too many table shards. If you are sharding tables by date, use time-partitioned tables instead.
&lt;/h3&gt;

&lt;p&gt;１個上で紹介したものと同じ。)&lt;/p&gt;

</description>
      <category>bigquery</category>
    </item>
    <item>
      <title>BigQueryベストプラクティス (コスト管理)</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Thu, 23 Apr 2020 01:36:35 +0000</pubDate>
      <link>https://dev.to/__attsun__/bigquery-38ic</link>
      <guid>https://dev.to/__attsun__/bigquery-38ic</guid>
      <description>&lt;p&gt;公式ドキュメントに記載のある「BigQuery best practices」をまとめてみるシリーズ。&lt;br&gt;
今回は&lt;a href="https://cloud.google.com/bigquery/docs/best-practices-costs"&gt;コスト管理&lt;/a&gt;のプラクティスをまとめます。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;イタリック体はドキュメントに記載のない追加コメント&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SELECT *&lt;/code&gt;ではなく、必要なカラムのみを指定することで、読み込むデータ量を減らす&lt;/li&gt;
&lt;li&gt;データを試しに見たいだけならpreviewr利用する。&lt;/li&gt;
&lt;li&gt;クエリ実行前にコストを確認する&lt;/li&gt;
&lt;li&gt;LIMIT句ではコストを絞ることができない。&lt;/li&gt;
&lt;li&gt;請求データを可視化しコストを管理する&lt;/li&gt;
&lt;li&gt;パーティショ分割テーブルを利用する&lt;/li&gt;
&lt;li&gt;複数のステージがあるクエリ（SELECTした結果を別のクエリで参照するなど）は中間結果を保存する&lt;/li&gt;
&lt;li&gt;サイズの大きなテーブルを作る時は、有効期限を設定する。&lt;/li&gt;
&lt;li&gt;ストリーミングインサートはすぐに利用したいデータにのみ利用する。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ベストプラクティス
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Query only the columns that you need.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;SELECT *&lt;/code&gt;ではなく、必要なカラムのみを指定することで、読み込むデータ量を減らす&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;全カラムに対してフルスキャンが行われる&lt;/li&gt;
&lt;li&gt;データを実験的に眺めたいだけならpreviewや&lt;code&gt;bq head&lt;/code&gt;を利用しよう&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LIMIT&lt;/code&gt;では読み込むデータ量を減らすことはできない。&lt;code&gt;LIMIT&lt;/code&gt;なくても&lt;code&gt;LIMIT 1&lt;/code&gt;でも全く同じデータ量が処理される。&lt;code&gt;INFORMATION_SCHEMA.JOBS_BY_XXX.total_bytes_processed&lt;/code&gt;で確認可能。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SELECT * EXCEPT(...)&lt;/code&gt;は有効なので、一部のカラムのみ除外したい場合は利用しよう&lt;/li&gt;
&lt;li&gt;行を絞って全カラムを読み込みたい時は、そのサブセットのみを持った新しいテーブルを作るか、パーティション分割テーブルを利用しよう&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Don't run queries to explore or preview table data.
&lt;/h3&gt;

&lt;p&gt;データを試しにみるのならpreviewr利用する。&lt;br&gt;
（既出のため割愛）&lt;/p&gt;

&lt;h3&gt;
  
  
  Before running queries, preview them to estimate costs.
&lt;/h3&gt;

&lt;p&gt;クエリ実行前にコストを確認する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BigQueryコンソールは、処理予定のデータ量をクエリ実行前に表示してくれる&lt;/li&gt;
&lt;li&gt;CLIなら&lt;code&gt;bq query --dry_run&lt;/code&gt;で取得可能&lt;/li&gt;
&lt;li&gt;データ量からコストを計算するには、&lt;a href="https://cloud.google.com/products/calculator/"&gt;Pricing Calculator&lt;/a&gt;が利用可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use the maximum bytes billed setting to limit query costs.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Maximum bytes billed&lt;/code&gt;を指定することで高額なクエリ実行を抑制する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Maximum bytes billed&lt;/code&gt;を設定すれば、それ以上のデータ量を処理するクエリは実行できなくなるので、意図せぬ事故を防ぐことができる。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use a LIMIT clause as a method of cost control.
&lt;/h3&gt;

&lt;p&gt;LIMIT句ではコストを絞ることができない。&lt;br&gt;
（既出のため割愛）&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a dashboard to view your billing data so you can make adjustments to your BigQuery usage. Also consider streaming your audit logs to BigQuery so you can analyze usage patterns.
&lt;/h3&gt;

&lt;p&gt;ダッシュボードでコストを管理する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://support.google.com/cloud/answer/7233314?hl=en"&gt;請求データをエクスポート&lt;/a&gt;して、&lt;a href="https://dev.toVisualize%20GCP%20billing%20using%20BigQuery%20and%20Google%20Data%20Studio"&gt;BigQueryにロードすることでコストダッシュボードを作る&lt;/a&gt;ことができる&lt;/li&gt;
&lt;li&gt;&lt;em&gt;データ量の監視であれば、 &lt;code&gt;INFORMATION_SCHEMA.JOBS_BY_XXX.total_bytes_processed&lt;/code&gt;を事前準備なしで使える。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Partition your tables by date
&lt;/h3&gt;

&lt;p&gt;パーティショ分割テーブルを利用する&lt;br&gt;
（既出のため割愛）&lt;/p&gt;

&lt;h3&gt;
  
  
  If possible, materialize your query results in stages
&lt;/h3&gt;

&lt;p&gt;複数のステージがあるクエリ（SELECTした結果を別のクエリで参照するなど）は中間結果を中間テーブルに保存する&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;複数のステージがあるクエリ（SELECTした結果を別のクエリで参照するなど）の場合、毎回全クエリが実行される。&lt;/li&gt;
&lt;li&gt;効率化するには、中間結果テーブルを作る&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you are writing large query results to a destination table, use the default table expiration time to remove the data when it's no longer needed.
&lt;/h3&gt;

&lt;p&gt;サイズの大きなテーブルを作る時は、有効期限を設定する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;クエリだけでなくストレージにもコストが発生するので、一時的にしか利用しない大きなテーブルには有効期限を設定する。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use streaming inserts only if your data must be immediately available
&lt;/h3&gt;

&lt;p&gt;ストリーミングインサートはすぐに利用したいデータにのみ利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LOAD jobによるデータロードは無料で実行可能だが、ストリーミングインサートには費用が発生する。&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bigquery</category>
    </item>
    <item>
      <title>Data Catalog Tagについて調べた（2020/04/10）</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Sun, 12 Apr 2020 15:53:24 +0000</pubDate>
      <link>https://dev.to/__attsun__/data-catalog-tag-2020-04-10-2ag5</link>
      <guid>https://dev.to/__attsun__/data-catalog-tag-2020-04-10-2ag5</guid>
      <description>&lt;h3&gt;
  
  
  調査の意図
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;カラムの統計値など、メタデータの拡充と管理がしたい&lt;/li&gt;
&lt;li&gt;LyftのamundsenやLinkedinのdatahubのようなものはデカすぎるかつ、将来的にはGCPのData Catalogが同等の機能を有するので、できれば避けたい

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://mindtide.hatenablog.com"&gt;コチラ&lt;/a&gt; に詳しくまとめられていた。ありがたい&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;data catalogのtagを使うと任意のメタデータを設定できそうなので調べてみる&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tag
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;型ありのメタデータをテーブルやカラムに付与可能&lt;/li&gt;
&lt;li&gt;tag templateを設定しないと付与できない&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tag template
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;templateを作った上で、tableもしくはcolumnに付与する&lt;/li&gt;
&lt;li&gt;複数のテンプレートを付与できる&lt;/li&gt;
&lt;li&gt;テンプレートはあとでフィールド追加・削除可能&lt;/li&gt;
&lt;li&gt;テンプレートはあとでREQUIRED制約を外すことが可能

&lt;ul&gt;
&lt;li&gt;逆は不可能&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;削除は、テンプレート付与済みのテーブル・カラムにも影響を与える&lt;/li&gt;
&lt;li&gt;設定した値は、catalogの対象テーブル上でのみ閲覧可能。グラフ化などもないので、可視化はかなり弱い&lt;/li&gt;
&lt;li&gt;APIで操作可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  一旦の結論
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data Catalogを、LyftのamundsenやLinkedinのdatahubのような本格的なメタデータ管理として使うのはまだ難しそう。&lt;/li&gt;
&lt;li&gt;Data Catalogにメタデータを集中しつつ、メタデータクローラーとビューアを簡易なもので別建てで作るのが妥当か&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>datacataloggcp</category>
    </item>
    <item>
      <title>GoogleのProfessional Data Engineer資格を取得するまでの記録</title>
      <dc:creator>Atsumi</dc:creator>
      <pubDate>Thu, 26 Mar 2020 04:18:50 +0000</pubDate>
      <link>https://dev.to/__attsun__/google-professional-data-engineer-1ebp</link>
      <guid>https://dev.to/__attsun__/google-professional-data-engineer-1ebp</guid>
      <description>&lt;h1&gt;
  
  
  受験者（私）の経験値について
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;仕事でGCPを3年ほど利用している&lt;/li&gt;
&lt;li&gt;主に利用しているのはGKE / GAE / Datastore / Cloud Storage / Firebase Realtime Database / Pubsub / CloudSQL / BigQuery / IAMあたり。&lt;/li&gt;
&lt;li&gt;AWSも2,3年ほど経験しており、EMRでSparkジョブを利用したりk-meansを使った簡単な機械学習処理を経験&lt;/li&gt;
&lt;li&gt;Spark Streaming、Kafka、HBaseあたりは検証で経験したくらい&lt;/li&gt;
&lt;li&gt;Apache BeamはStrataに行った時に１日集中セッションみたいなやつを受けたのでなんとなくコンセプトは理解している&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;総じて、データを利用したアプリケーションには馴染みがある経歴です。とはいえ、ものすごく精通しているわけではないですし、ML系の経験は薄いです。&lt;/p&gt;

&lt;h1&gt;
  
  
  勉強期間
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;だいたい2週間くらい。&lt;/li&gt;
&lt;li&gt;平均したら1日1,2時間程度？&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  試験概要
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;コチラ。

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/certification/data-engineer?hl=ja"&gt;https://cloud.google.com/certification/data-engineer?hl=ja&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;試験時間：2時間&lt;/li&gt;
&lt;li&gt;問題：選択式で50問&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;今年に入って試験内容が若干変わったらしく、ケーススタディがなくなってます。（勉強期間中は古いページがまだ見える状態だったが、今は見えなくなっている）&lt;/p&gt;

&lt;h1&gt;
  
  
  勉強方法・内容
&lt;/h1&gt;

&lt;h2&gt;
  
  
  情報収拾
&lt;/h2&gt;

&lt;p&gt;以下を眺めて概要を把握します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公式サイト（上記）&lt;/li&gt;
&lt;li&gt;過去に受験した方々が残してくれた記録

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/nii_yan/items/c301d91dbc168036441a"&gt;https://qiita.com/nii_yan/items/c301d91dbc168036441a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yomon.hatenablog.com/entry/2018/06/18/GCP_Professional_Data_Engineer%E3%81%AB%E5%90%88%E6%A0%BC%E3%81%97%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%AE%E3%81%A7%E5%8B%89%E5%BC%B7%E6%B3%95%E7%AD%89%E6%9B%B8%E3%81%8F"&gt;https://yomon.hatenablog.com/entry/2018/06/18/GCP_Professional_Data_Engineerに合格してきたので勉強法等書く&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.brainpad.co.jp/entry/2018/11/28/112907"&gt;http://blog.brainpad.co.jp/entry/2018/11/28/112907&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  学習ツール
&lt;/h2&gt;

&lt;p&gt;主に利用したのは以下。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;qwiklab&lt;/li&gt;
&lt;li&gt;公式ドキュメント&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/dp/B07R39RLSQ/"&gt;スケーラブルデータサイエンス データエンジニアのための実践Google Cloud Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;模擬試験&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;「courseraがいい」という情報もありましたが、私は利用しませんでした。&lt;br&gt;
その代わり、&lt;a href="https://www.qwiklabs.com/?locale=ja"&gt;qwiklab&lt;/a&gt;の1ヶ月サブスクリプションを利用しました。手軽に手を動かしながら学べそうだったからです。&lt;/p&gt;

&lt;h3&gt;
  
  
  qwiklabについて
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;30分〜90分くらいで終わる学習テーマが数多く用意されています。&lt;/li&gt;
&lt;li&gt;サービスの基本や、サービスを組み合わせた発展的なものなど、様々なコースが用意されています。

&lt;ul&gt;
&lt;li&gt;（例）「&lt;a href="https://www.qwiklabs.com/focuses/581?parent=catalog"&gt;Cloud ML Engine: Qwik Start&lt;/a&gt;」&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;利用を開始すると、そのコースの制限時間だけ有効になるGCPアカウントが発行されますので、実際に手を動かしながら学ぶことができます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;私はMonthly Subscriptionのプラン（$55）を利用しました。最初はサブスクの存在に気づかず、コースごとに料金を払っていたので勿体無いことしました・・。&lt;/p&gt;

&lt;h4&gt;
  
  
  qwiklabで利用したコース
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.qwiklabs.com/quests/34"&gt;Baseline: Data, ML, AI&lt;/a&gt;をほぼ全部&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.qwiklabs.com/quests/25"&gt;データエンジニアリング&lt;/a&gt;をほぼ全部&lt;/li&gt;
&lt;li&gt;その他、あまり知識のない細かいやつを色々

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qwiklabs.com/focuses/600?parent=catalog"&gt;Data Loss Prevention: Qwik Start - JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qwiklabs.com/focuses/1779?parent=catalog"&gt;AutoML Vision でクラウド内の雲の画像を分類する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qwiklabs.com/focuses/580?parent=catalog"&gt;Bigtable: Qwik Start - Hbase Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qwiklabs.com/focuses/1713?parent=catalog"&gt;Cloud KMS の使い方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;実際に動かしながら学べるのは良いですね！Dataprepはすげーなと思いました。&lt;/p&gt;

&lt;h3&gt;
  
  
  公式ドキュメント
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;各サービスの「コンセプト」の欄をしっかり読み込む。（これ一番大事かも）&lt;/li&gt;
&lt;li&gt;サービス同士・機能同士の比較をきっちり理解しておく。

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/products/databases/?hl=ja"&gt;各データベース系サービスの比較表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/security/encryption-at-rest/?hl=ja"&gt;データ暗号化方法の比較&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/storage/docs/storage-classes?hl=ja"&gt;Cloud Storageでの、ストレージクラスの比較&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/ml-engine/docs/tensorflow/online-vs-batch-prediction?hl=ja"&gt;AI Platformにおける、オンライン予測とバッチ予測&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/interconnect/docs/how-to/choose-type?hl=ja"&gt;Dedicated InterconnectとPartner Interconnectの比較&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;実際にどのように利用するかイメージを作るためにユースケースを見ておく。

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/solutions/data-lifecycle-cloud-platform"&gt;データライフサイクル&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/solutions/building-real-time-inventory-systems-retail?hl=ja"&gt;小売業向けのリアルタイムインベントリシステムの構築&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;その他、&lt;a href="https://cloud.google.com/docs/tutorials?hl=ja#big%20data"&gt;このページ&lt;/a&gt;から色々探せます&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  スケーラブルデータサイエンス データエンジニアのための実践Google Cloud Platform
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GCPの細かい使い方を解説した本ではないのですが、データを収集し、分析し、システムに組み込む、という一連の流れをGCPのスタックを利用して行うという内容であるため、実際にどう使うのかのイメージが付けれると思います。&lt;/li&gt;
&lt;li&gt;受験対策としてはマストではないと思いますが、データ活用を学ぶ上で非常に良い本です。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  模擬試験
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/certification/practice-exam/data-engineer?hl=ja"&gt;https://cloud.google.com/certification/practice-exam/data-engineer?hl=ja&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20問の模擬試験が受けられます。&lt;/li&gt;
&lt;li&gt;本試験に比べると簡単です。&lt;/li&gt;
&lt;li&gt;終了後、回答ともに参考リンクを示してくれます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;私は勉強を始めた頃に行い、半分ちょっとくらいの正解率でした。&lt;/p&gt;

&lt;h1&gt;
  
  
  試験当日
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;30分前には会場についているようにしましょう

&lt;ul&gt;
&lt;li&gt;周囲から慎重さに定評のある（はず）の私ですが、電車を乗り間違えるという失態を犯しましたw&lt;/li&gt;
&lt;li&gt;早めに到着するスケジュールで動いていたため、ことなきを得ました。慣れない場所に行くときは気をつけましょう。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;身分証や受験者IDを忘れないようにしましょう&lt;/li&gt;
&lt;li&gt;持ち込みは一切できません&lt;/li&gt;
&lt;li&gt;問題は結構細かいことも聞かれて難しかったです。絶対の自信を持って回答できたのは半分ちょっとくらい。全然検討つかない、という問題はほぼなかったです。&lt;/li&gt;
&lt;li&gt;秋葉原の試験センターには、雑音シャットアウト用のヘッドホンがありましたが、サイズがきつく頭が痛くなったので外しました&lt;/li&gt;
&lt;li&gt;試験終了後、すぐに「合格」という結果が出ました。3日後くらいにメールでも来ました。&lt;/li&gt;
&lt;li&gt;景品としてパーカーかリュックが頂けるようですが、パーカーは在庫切れでした。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以上です！&lt;/p&gt;

</description>
      <category>gcp</category>
    </item>
  </channel>
</rss>
