Kubernetesの学習環境としてsnapのmicrok8sは良さそう

f:id:yassan0627:20190424062319p:plain

って @jyoshise さんがつぶやいてたので、ほんまかねぇと思って、snapだし良いかってくらいのノリで入れてみた。

続きを読む

HueからHiveやImpalaの実行時にリソースプールを変更したい問題

f:id:yassan0627:20190305110112p:plain

分析用のクラスタでの運用の話。

クラスタへのデータ投入やETLなどのジョブと分析用のジョブを共存共栄したいという要望がある。 基本的に分析系のジョブは重たくなりやすいので、他に影響与えないように隔離したい。

beelineを使う場合は、以下のようにすると、リソースプールを例えば root.analysts として実行出来るのだけれど、、、

beeline -u jdbc:hive2://hiveserver2:10000/ -n analysts -f test.sql --hiveconf mapred.job.queue.name=root.analysts

ちなみに、impalaの場合は以下の感じ。

impala-shell -i hostname:portnum -B -q "set REQUEST_POOL=root.analysts; select * from hoge;"

ただし、リソースプールの指定には、下図のように動的リソースプールの設定も必要で、そこに指定したものだけが指定出来た。
f:id:yassan0627:20190305133710p:plain
※↑超適当です

本題。
今回は、Hueから実行した場合にも同様にリソースプールを別にしたい。

続きを読む

Cloudera Manager APIってAmbariと比較してどうなんだろ?

社内ブログがあるのでそっちには毎日書いてるんだけど、せっかくなんでこっちにも書いてみることにした。 もともとメモなんだし、もっと雑に描いてもいいかなぁと。

Cloudera Manager API の話

Cloudera Manager API Client というのがあるなぁってのは分かってたんですが、どうせライセンスがーとかと思ってたら、どうやら認識違いしてた。 エンタープライズライセンス無くても使えるよね?

APIの詳細は、 ここ

試しに、Cloudera Manager(以下、CM)のAPIのVersionを調べる

$ curl -X GET -u "CMアカウント名:パスワード" -i http://CMドメイン:7180/api/version
HTTP/1.1 200 OK
Expires: Thu, 01-Jan-1970 00:00:00 GMT
;

v19

おお。使える。

/api/version/api/v19/clusters にすると管理クラスタ一覧とれたり出来た。

もちょっと見るとQiitaにこんな記事が。

Cloudera Manager API を使ったクラスタ構築 - Qiita

CMのアカウントがいるので、管理アカウントを晒せないけど、機能制限したユーザ(作れるのかな?)を用意できれば、生きてるNameNodeを取得とか出来そうなので、DistCpでリモート側のNNがどこか調べられるなぁと。

ただ、その場合、CMをメンテのために止めたりなどが出来なくなるので手間が増える。

Qiitaの記事にあるような、管理系の利用を考慮するだけの方が良いかもしれない。

なかなか三方良しってのは難しい、、、

Ambari使って自動化って話は、ちょろちょろ聞くのだけど、Cloudera Manager使って自動化がどうのって話はほぼ聞かないけどどうなんでしょね。

Ambariとの比較はまたこんど(ぁ

Rancher Meetup #06 in Osakaでデータ分析基盤とk8s・Rancher絡めてLTしました

f:id:yassan0627:20190119013033p:plain

活動拠点は京都なのですが、大阪のコアメンバ不在もあって、神戸方面のメンバと一緒になって大阪で開催しました。
一緒にやってくれる人募集してます。

rancherjp.connpass.com

最初は、 去年のアドカレネタを膨らまして発表する予定だったんですが、どうしても気になってしまって結局、直前で変更。

yassan.hatenablog.jp

発表スライドは以下です。

www.slideshare.net

ホントは動かしたりもしたかったのですが、調査するのに時間がかかって、掘っても掘っても色々出てくる。。。
ただ、自分の仕事もそうだけど、興味のある分野もあってどんどん調べていくのでまとまらないこと。。。

データエンジニア方面からのCloudNative方面へのフォローの何かの足しになれば良いかなぁ思います。
後、同じ境遇の人とつながって色々話がしたい!

他の方はこちら。

www.slideshare.net speakerdeck.com

京都もやるのでお楽しみ?に。

HiveとImpalaのネストしたカラムのpushdown(行や列方向のフィルタ)に関するまとめ

f:id:yassan0627:20190107065817p:plain

結論

2019/01/07時点で Hive または Impala において、ネストしたカラムに対するpushdownは対応が済んでいない。

きっかけ

CDH5.14にて、Hiveのクエリが激遅いって事で、実行計画見て、これpushdown出来てないんじゃね?って事で調べる事にした。

っと、ありがたい事に回答頂いていたのですが、この辺きっかけで自分でも調べてみた。

Pushdownについて

HDFS上からSQLライクにデータを取り出すには、HiveやImpalaを使うのですが(他にも PrestoとかDrillとかもあるけど)、
でかいテーブルでフルスキャンするとデータ量が半端なくなるので、特定のカラムだけとか、特定の行だけと、フィルタして取り出します。

その辺りのフィルタの事をPushdownと言います。
Pushdownについては、以下のスライド及びBlogが参考になります。

www.koyamada-numazu.com

また、Hive及びImpalaには、1カラムに複数の値を保持できる Complex型と呼ばれる型が存在します。
そして、Complex型には、Array、Struct、Mapがあります。

cf. Hive - Complex Types
cf. Impala - Complex Types

今回は、PostgreSQLMySQLで言うところのJSON型の様に扱える Struct型に絞った話。 Struct型を使うことで、アプリログなど後から要素の数を柔軟に増減出来るようになります。さらに、Struct型のカラムにさらにStruct型を入れ込む事も出来きます。

Struct型のメリットとしては、「複数のテーブルを結合してまとめておいて、それをStruct型のカラムとしておくことで、結合コストを減らす事が出来る」という事。
ただし、その場合、pushdownに対応していないと、不要なカラムまでStrcut型に含めるのでデータが冗長になる、つまり、データサイズが増えてパースする時間が生じる(結合しなくても良いカラムまで含むので)。

なので、クエリ内で使える事とpushdown出来るかは別の話。 select句やWhere句・Group by句で、Struct型の要素を指定してクエリを書いた場合、その要素だけを取り出せている(pushdown出来ている)と期待しますが、実は違います。

クエリの実行計画は大事。必ず見て欲しいです。

クエリの頭に EXPLAIN または EXPLAIN EXTENDED を付けると確認出来ます。
Projection Pushdown または Predicate Pushdown に未対応な場合、select句(Projection) または where句(Predicate)にて、ネストしたカラムを1個、2個と要素を増やしても取得するデータサイズが変わっていない事が分かります。

それでは前置き長くなったので本題。

以下、前提として、2019/01/07時点のCDHにおけるHiveまたはImpalaを調査した結果に基づいています。

HiveでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~

前提: Hiveで対応している 列指向なデータフォーマット ORCかParquet を対象にしています
結論: ネストしたカラム Complex型に対する pushdownはまだ未対応(なのでまるととってパースしてる)

実際にはこの事は、HiveのJIRAにも以下の様に ORCは HIVE-19103 、 Parquetは HIVE-14826 から現状の状況が確認出来ます。
[HIVE-19103] Nested structure Projection Push Down in Hive with ORC - ASF JIRA
[HIVE-14826] Support vectorization for Parquet - ASF JIRA

ただし、Where句(predicate)なら、今後、新しいVer.ので行けるようになるかも。
[ORC-323] Predicate push down for nested fields - ASF JIRA

ImpalaでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~

前提: Impalaで対応している 列指向なデータフォーマット ORCかParquet を対象にしています
結論: ネストしたカラム Complex型に対する pushdownはまだ未対応(なのでまるととってパースしてる)

Impalaの公式ドキュメントには、Complex型に対する記載が以下のようにあります。
Complex Types (Impala 2.3 or higher only)

Impalaについては、基本的にParquetによる対応は進んでいますが、ORCについてはまだまだな状況です。
IMPALA-5717 にて対応はしたように見えますが、同Issueのコメントを見ると以下のようにまだまだ課題が残っています。
[IMPALA-5717] Support for ORC format files - ASF JIRA

更に、以下の IMPALA-6503 の通り、 Complex型への対応がまだ残っているようです。
[IMPALA-6503] Support reading complex types from ORC format files - ASF JIRA

まとめ

CDHの場合、パッチが適用されるので実際の本家のバージョンと対応状況が異なるかもです。
最新のCDH6系でHive及びImpalaで実行計画を試してみた訳ではないので、「いやいや対応してるよ」というものがあれば教えてください。

以上です。

DockerライクなUXでCloud Nativeな体験が出来るらしいRioを試してみる

qiita.com

遅れてしまいましたが、この記事は、 MicroAd Advent Calendar 2018 の16日目の記事です。

はじめに

本当は、 Rancher Labsの RKE を試す記事にしようかなぁと思っていたが、すでに他社の別の人 1 がやっているのを観測してしまったので、どうせなら、 同じく気になっていた Rio に変更しました。

とは言え、
febc-yamamoto.hatenablog.jp
上記の記事とも被りますが、そんな事を言いだしたら永久に何も出来ないので、まずは、 「個人的な興味として」 触りたい(大事)。

って事で続きます。

Rioって何?

rancher.com

Rancher Labsの新しい開発プロジェクトで、開発には、 Rancher LabsのChief Architect & Co-founderDarren Shepherd(@ibuildthecloud)さん が関わっています。

github.com

Rioのコンセプトは

  1. Simple, fun, end-to-end container experience
  2. Cloud Native Container Distribution

Rio is a user-oriented end-to-end container solution with a focus on keeping containers simple and combating the current trend of complexity. It's kept fun and simple though it's familiar and opinionated user experience. Additionally, Rio is a "Cloud Native Container Distribution" meaning it includes built-in Cloud Native technologies such as Kubernetes, Istio, Containerd, etc. so that the user need not be an expert in installing, using, and maintaining these systems.

www.youtube.com

という事で、利用者が使いやすく、シンプルで楽しいCloud Nativeなコンテナソリューションだそうで、
今後は、ストレージに Rancher Labsの Longhorn も予定しているとの事で気になります。 また、Rioのコマンドは、昔のdockerコマンドのようなもの2が多く見受けられ、取っつきやすい感じはあります。

ただ、まだ、 Early Preview なので、未実装なところも多く残っています。

コンセプト

Rioのコンセプトは Concepts にある通り、 ServiceStackProjectで構成されています。

まず、個々のコンテナを組み合わせて1つのServiceを構成し、
その複数をまとめたStackがあります。ServiceStackが異なれば名前が被ってもOK。
また、Stack単位にアクセス出来る・出来ないを制御するのがProject(最初はWorkspaceと呼んでいました)となります。

例えば、下図の様な使い方が考えられます。

f:id:yassan0627:20181217232440p:plain

ServiceStackなど端々に、Rancher v1系の面影を感じますね。

実際にお試ししてみる

インストールには、スタンドアローンk8s上で使う、2つモードがありますが、今回は、スタンドアローンを選択します。

実行環境は、GCPを利用し、以下の構成で行いました。

  • Ubuntu 18.04 LTS
  • GCE(vCPU x 4、メモリ 15 GB)
  • Rio v0.0.3

GCEでインスタンスの用意

GCE3インスタンスを「vCPU x 4、メモリ 15 GB」のスペックで用意。 OSは「Ubuntu 18.04 LTS」

※お試しなので、お安く上げるために、「可用性ポリシー」の項目を「プリエンプティブ ON」にします。
 これで、約$0.044/hour(us-east1)となります(お小遣い制の私にも優しい)。

Rioのインストール

Releases · rancher/rio より、実行ファイルをダウンロードして、展開し、PATHの通ったところに展開したものをコピー

# Rioをダウンロード
curl -L -o rio.tar.gz https://github.com/rancher/rio/releases/download/v0.0.3/rio-v0.0.3-linux-amd64.tar.gz

# 展開
tar xvf rio.tar.gz

# PATHの通った場所にコピー
sudo cp rio-v0.0.3-linux-amd64/rio /usr/local/bin/

Rio Serverの起動

yassan@rio01:~$ sudo rio server
INFO[0000] Starting Rio v0.0.3                          
INFO[0006] Creating CRD gateways.networking.istio.io    
INFO[0006] Creating CRD virtualservices.networking.istio.io 
INFO[0006] Waiting for CRD virtualservices.networking.istio.io to become available 
INFO[0007] Done waiting for CRD virtualservices.networking.istio.io to become available 
INFO[0007] Waiting for CRD gateways.networking.istio.io to become available 
INFO[0007] Done waiting for CRD gateways.networking.istio.io to become available 
INFO[0007] Creating CRD listenconfigs.space.cattle.io   
INFO[0007] Creating CRD services.rio.cattle.io          
INFO[0007] Creating CRD configs.rio.cattle.io           
INFO[0007] Waiting for CRD listenconfigs.space.cattle.io to become available 
INFO[0007] Creating CRD routesets.rio.cattle.io         
INFO[0007] Creating CRD volumes.rio.cattle.io           
INFO[0007] Creating CRD stacks.rio.cattle.io            
INFO[0008] Done waiting for CRD listenconfigs.space.cattle.io to become available 
INFO[0008] Listening on :7443                           
INFO[0008] Listening on :7080                           
INFO[0008] Client token is available at /var/lib/rancher/rio/server/client-token 
INFO[0008] Node token is available at /var/lib/rancher/rio/server/node-token 
INFO[0008] To use CLI: rio login -s https://XXXX:7443 -t XXXX::admin:XXXX 
INFO[0008] To join node to cluster: rio agent -s https://XXXX:7443 -t XXXX::node:XXXX 
INFO[0009] Agent starting, logging to /var/lib/rancher/rio/agent/agent.log 

これで起動。

起動ログに http: TLS handshake error from 127.0.0.1:44334: remote error: tls: bad certificate なんて出てますが、そっ閉じ。。。

Rio Serverに接続

今回は、スタンドアローンモードで実行するので、Agentのインストールはせずに、直接、起動中のServerへ接続します。 まずは、Serverへ接続しないと何もコマンドを受け付けません(rootでは別)。

接続の方法は、上記のRio Serverへアクセスした際に出ていたログ

 :
INFO[0008] Node token is available at /var/lib/rancher/rio/server/node-token 
INFO[0008] To use CLI: rio login -s https://XXXX:7443 -t XXXX::admin:XXXX     ←←←← ※コレ!
INFO[0008] To join node to cluster: rio agent -s https://XXXX:7443 -t XXXX::node:XXXX 
 :

rio login -s https://XXXX:7443 -t XXXX::admin:XXXX の部分を使います。 別のターミナルを開いて以下を実行。

$ rio login -s https://XXXX:7443 -t XXXX::admin:XXXX
INFO[0000] Log in successful
 :

カナリアリリースを試してみる

RioのREADMEにある Service Mesh をそのまま試してみます。 デプロイするアプリは、curlで叩くとHollo world返してくれる ibuildthecloud/demo を利用しています。

v1のdemoを3つのコンテナでScaleした状態にデプロイします。

yassan@rio01:~$ rio run -p 80/http --name test/svc --scale=3 ibuildthecloud/demo:v1
test-124a4837:svc

状態の確認

yassan@rio01:~$ rio ps
NAME       IMAGE                    CREATED         SCALE       STATE     ENDPOINT                                  DETAIL
test/svc   ibuildthecloud/demo:v1   8 seconds ago   (3/0/0)/3   pending   http://svc.test.g50yg5.lb.rancher.cloud   

と直後ではなっていますが、しばらくすると以下のようになります。

yassan@rio01:~$ rio ps
NAME       IMAGE                    CREATED              SCALE     STATE     ENDPOINT                                  DETAIL
test/svc   ibuildthecloud/demo:v1   About a minute ago   3         active    http://svc.test.g50yg5.lb.rancher.cloud   

ENDPOINTにcurlして状態を見てみます。

yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World

次にv3でデプロイしてみます。

yassan@rio01:~$ rio stage --image=ibuildthecloud/demo:v3 test/svc:v3
test-124a4837:svc

# Serviceの状態を確認(v1とv3の両方が存在しています)
yassan@rio01:~$ rio ps
NAME          IMAGE                    CREATED         SCALE     STATE     ENDPOINT                                     DETAIL
test/svc      ibuildthecloud/demo:v1   2 minutes ago   3         active    http://svc.test.g50yg5.lb.rancher.cloud      
test/svc:v3   ibuildthecloud/demo:v3   2 minutes ago   3         active    http://svc-v3.test.g50yg5.lb.rancher.cloud   
# Serviceの設定を確認
yassan@rio01:~$ rio export test
services:
  svc:
    image: ibuildthecloud/demo:v1
    ports:
    - 80/http
    revisions:
      v3:
        image: ibuildthecloud/demo:v3
        scale: 3
    scale: 3
# v3を確認
yassan@rio01:~$ curl http://svc-v3.test.g50yg5.lb.rancher.cloud
Hello World v3

では、準備が出来たところで、カナリア試します。 v1とv3を半々にしてみますます。

yassan@rio01:~$ rio weight test/svc:v3=50%
test-124a4837:svc

実際にcurlして確認してみます。

yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World v3
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World v3

まぁおおよそ、半々出てますね!

では、v3を完全に反映させます。

yassan@rio01:~$ rio promote test/svc:v3
test-124a4837:svc

# Serviceの状態の確認(v3のENDPOINTがv1のときのものに変わってますね)
yassan@rio01:~$ rio ps
NAME       IMAGE                    CREATED         SCALE     STATE     ENDPOINT                                  DETAIL
test/svc   ibuildthecloud/demo:v3   5 minutes ago   3         active    http://svc.test.g50yg5.lb.rancher.cloud   

では、curlでも確認してみます。

yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World v3
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World v3
yassan@rio01:~$ curl http://svc.test.g50yg5.lb.rancher.cloud
Hello World v3

ちゃんと反映出来ています。
如何でしたでしょうか。簡単なコマンドで実行が可能になっています。
本当なら、上図に描いたような構成を作ってみて、アクセス制御などもお試ししたいところですが、今回はここまで。

最後に

Rioは如何でしたでしょうか?

実は、Rio自体は内部にk8sを利用しています4
また、rio/vendor.confからも分かるように、k8s以外にも様々なものを内包しており、単体でここまで出来るのは面白い試みだと思います。

まだまだ、実装途中ではありますが、今後が楽しみです。

以上、16日目の記事でした。

CloudGarageを使ってお手軽にRedmineのModern UX化プロジェクト「Project Opal」を試してみる

f:id:yassan0627:20181209115833p:plain

adventar.org adventar.org

この記事は
 #CloudGarage Advent Calendar 2018 - Adventar の 9日目 及び
 Redmine Advent Calendar 2018 の 10日目
の記事です!

Redmine大阪 という、Redmine勉強会でコアスタッフをしている やっさん🍶(@yassan168) です。
また、NHNテコラス株式会社が提供する定額型パブリッククラウド CloudGarage で、 開発者支援プログラム(Dev Assist Program) を受けています。

DAPは、無償で、メモリ:1GB / CPU:1コア / SSD:50GBのインスタンスを3個利用出来るありがたい制度になっています。
一見、ちょっと足りないかなぁと思いますが、DiskがSSDでDiskアクセスも速く、ネットワークもとても速くパッケージのupdateもあっという間なので十分に使えます(とは言え、K8sなどは厳しいですが。。)
なので、簡単な検証や小規模なサイトならこれで十分まかなえるのでとてもありがたいです。

前置きはこの辺にして、CloudGarageを使って、RedmineのUXをModern化しようとするProjectである「Project Opal」をお試ししてみます。

github.com

実行環境

Opalのテーマの用意

現状、そのままでは利用できません。 テーマをcloneして、CSSを生成する必要があります。

色やフォントの設定元となる stylesheets/global/#config-map.sass を必要に応じて変更後、 stylesheets/application.sass からCSSを生成する必要があります。 SASS→CSSの生成は、 説明にあった通り、 Koala を使いました。

KoalaをDLってGUIを起動後、cloneしたproject-opalのディレクトリをKoalaへD&DすればOK。 その後、 stylesheets/application.sass を選択して、コンパイルすると、CSSが生成されます。

f:id:yassan0627:20181209181926g:plain

また、Koalaを利用するとディレクトリのトップに koala-config.json を生成するので、 下図のように、 dest にパスを指定するとそこに生成したCSSを生成します。

f:id:yassan0627:20181209181815p:plain

そこに、 faviconfontsimages をコピーし、そのフォルダごと、 Redmineのthemeディレクトリに配置すればOK。

Project Opal について

@m4xiJo さんが立ち上げ、有志で構成される Redmineの外観のモダン化を目的としたプロジェクトで、フロントエンドの機能を用いて拡張しやすく、FlatでCleanな外観にする事をゴールにしています。 主に、 Discordの Redmineサーバ で議論されています。
今回、このProjectに参加することになったので紹介します(とは言え、フロントエンドはからっきしなのですが)。

まだまだなところはありますが、これからどんどんブラッシュアップしていくと思います!
また、参加してくれる人を募集しているので、 Discordの Redmineサーバ までよろしくお願いします。

特徴

  1. トップバーの固定に変更
  2. ナビゲーションタブをSticky Navigationに変更 → How To Create a Sticky Navbar
  3. 検索バーをSticky Navbarの用に張り付きするよう変更
  4. SideBarをSticky Navbarの用に張り付きするよう変更
  5. Day mode と Night modeの切り替えボタンの導入
  6. 外部リンクの通知
  7. 外部リンクを開く場合に、警告のポップアップを出す
  8. 絵文字のサポートと(試験的に)クイックサーチを追加
  9. トップバーにクイック検索を配置

上記を踏まえて、詳細を以下に挙げていきます。

twitterなどにもありますが、見たほうが早いです。

Project Opalのテーマの場合、スクロールするとトップバーとナビゲーションタブ、サイドバーが消えずに残っている事が分かります。
これは、チケット一覧だけで無くすべてのUIで同様の動きします。

なので、チケットをスクロールさせた後に、簡単に機能の切り替えが可能なのでとても便利です。
また、トップバー下にあったクイックサーチがトップバーに移管しているので、どれだけチケットスクロールしてもすぐに検索が可能です。

現行のテーマ

f:id:yassan0627:20181209170250g:plain

Project Opal

f:id:yassan0627:20181209170138g:plain

外部リンクへの移動

下のスクリーンキャストから分かるように、外部リンクを踏むと警告のポップアップが出ます。 ただし、現状、jsに直書きになってるので、i18n対応が出来ていません。

f:id:yassan0627:20181209172612g:plain

サイドバーの表示切り替え

Hide Sidebar - Plugins - Redmine で実装しているこの機能が、テーマ側で実現しています。

f:id:yassan0627:20181209173828g:plain

絵文字の導入

こちらは、まだまだ、未完成な点が多いですが、チケットの作成などのタイミングで、Emojiに対応しようとしているようです。

f:id:yassan0627:20181209175950p:plain

最後に

まだまだ、荒削りですが機能としては、今まで欲しかったStickyなUIはとても便利に感じました。 これからが楽しみです。

また、今回試した環境は、 yassan/docker-project-opal に置いているので、実際に試したい方はどうぞ。