Kubernetesの学習環境としてsnapのmicrok8sは良さそう
MacとかWindowsとかでminikube動かすよりも、Linuxでmicrok8s動かすほうが100倍快適だと思うのでk8sいじり倒したい人は普段使いのLaptopをLinuxにするべき https://t.co/I3PG8ukd9s
— junichi yoshise (@jyoshise) April 23, 2019
って @jyoshise さんがつぶやいてたので、ほんまかねぇと思って、snapだし良いかってくらいのノリで入れてみた。
続きを読むHueからHiveやImpalaの実行時にリソースプールを変更したい問題
分析用のクラスタでの運用の話。
クラスタへのデータ投入や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;"
ただし、リソースプールの指定には、下図のように動的リソースプールの設定も必要で、そこに指定したものだけが指定出来た。
※↑超適当です
本題。
今回は、Hueから実行した場合にも同様にリソースプールを別にしたい。
Cloudera Manager APIってAmbariと比較してどうなんだろ?
社内ブログがあるのでそっちには毎日書いてるんだけど、せっかくなんでこっちにも書いてみることにした。 もともとメモなんだし、もっと雑に描いてもいいかなぁと。
Cloudera Manager API の話
Cloudera Manager API Client というのがあるなぁってのは分かってたんですが、どうせライセンスがーとかと思ってたら、どうやら認識違いしてた。 エンタープライズライセンス無くても使えるよね?
試しに、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しました
活動拠点は京都なのですが、大阪のコアメンバ不在もあって、神戸方面のメンバと一緒になって大阪で開催しました。
一緒にやってくれる人募集してます。
最初は、 去年のアドカレネタを膨らまして発表する予定だったんですが、どうしても気になってしまって結局、直前で変更。
発表スライドは以下です。
www.slideshare.net
ホントは動かしたりもしたかったのですが、調査するのに時間がかかって、掘っても掘っても色々出てくる。。。
ただ、自分の仕事もそうだけど、興味のある分野もあってどんどん調べていくのでまとまらないこと。。。
データエンジニア方面からのCloudNative方面へのフォローの何かの足しになれば良いかなぁ思います。
後、同じ境遇の人とつながって色々話がしたい!
他の方はこちら。
www.slideshare.net speakerdeck.com
京都もやるのでお楽しみ?に。
HiveとImpalaのネストしたカラムのpushdown(行や列方向のフィルタ)に関するまとめ
- 結論
- きっかけ
- Pushdownについて
- HiveでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~
- ImpalaでのネストしたカラムのPushdwonについて ~Complex型(Struct型)の要素のPushdown~
- まとめ
結論
2019/01/07時点で Hive または Impala において、ネストしたカラムに対するpushdownは対応が済んでいない。
きっかけ
CDH5.14にて、Hiveのクエリが激遅いって事で、実行計画見て、これpushdown出来てないんじゃね?って事で調べる事にした。
複雑型に対するSELECT句(projection)のpushdownはまだ未対応ですね(なのでまるととってパースしてる)https://t.co/tUGEJpdwY7
— あさぬー (@hayanige) December 13, 2018
WHERE句(predicate)のpushdownは最近できるようになったかも・・・?https://t.co/FHMgBZby9H
っと、ありがたい事に回答頂いていたのですが、この辺きっかけで自分でも調べてみた。
Pushdownについて
HDFS上からSQLライクにデータを取り出すには、HiveやImpalaを使うのですが(他にも PrestoとかDrillとかもあるけど)、
でかいテーブルでフルスキャンするとデータ量が半端なくなるので、特定のカラムだけとか、特定の行だけと、フィルタして取り出します。
その辺りのフィルタの事をPushdownと言います。
Pushdownについては、以下のスライド及びBlogが参考になります。
また、Hive及びImpalaには、1カラムに複数の値を保持できる Complex型と呼ばれる型が存在します。
そして、Complex型には、Array、Struct、Mapがあります。
cf. Hive - Complex Types
cf. Impala - Complex Types
今回は、PostgreSQLやMySQLで言うところの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を試してみる
遅れてしまいましたが、この記事は、 MicroAd Advent Calendar 2018 の16日目の記事です。
はじめに
本当は、 Rancher Labsの RKE を試す記事にしようかなぁと思っていたが、すでに他社の別の人 1 がやっているのを観測してしまったので、どうせなら、 同じく気になっていた Rio に変更しました。
とは言え、
febc-yamamoto.hatenablog.jp
上記の記事とも被りますが、そんな事を言いだしたら永久に何も出来ないので、まずは、 「個人的な興味として」 触りたい(大事)。
って事で続きます。
Rioって何?
Rancher Labsの新しい開発プロジェクトで、開発には、 Rancher LabsのChief Architect & Co-founder の Darren Shepherd(@ibuildthecloud)さん が関わっています。
Rioのコンセプトは
- Simple, fun, end-to-end container experience
- 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.
という事で、利用者が使いやすく、シンプルで楽しいCloud Nativeなコンテナソリューションだそうで、
今後は、ストレージに Rancher Labsの Longhorn も予定しているとの事で気になります。
また、Rioのコマンドは、昔のdockerコマンドのようなもの2が多く見受けられ、取っつきやすい感じはあります。
ただ、まだ、 Early Preview
なので、未実装なところも多く残っています。
コンセプト
Rioのコンセプトは Concepts にある通り、 Service
、Stack
、Project
で構成されています。
まず、個々のコンテナを組み合わせて1つのService
を構成し、
その複数をまとめたStack
があります。Service
はStack
が異なれば名前が被ってもOK。
また、Stack
単位にアクセス出来る・出来ないを制御するのがProject
(最初はWorkspace
と呼んでいました)となります。
例えば、下図の様な使い方が考えられます。
Service
やStack
など端々に、Rancher v1系の面影を感じますね。
実際にお試ししてみる
インストールには、スタンドアローンとk8s上で使う、2つモードがありますが、今回は、スタンドアローンを選択します。
実行環境は、GCPを利用し、以下の構成で行いました。
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」を試してみる
この記事は
#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」をお試ししてみます。
実行環境
CloudGarageのインスタンス
インスタン上にdocker-compose使って起動
- 利用しているdocker-imageは sameersbn/redmine - Docker Hub 及び sameersbn/postgresql - Docker Hub となります。 利用方法は、以下の記事が参考になります yassan.hatenablog.jp
project-opalのthemeは、 redmine-cp/project-opal からCSSを生成したものを上記のDockerから参照して利用
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が生成されます。
また、Koalaを利用するとディレクトリのトップに koala-config.json
を生成するので、 下図のように、 dest
にパスを指定するとそこに生成したCSSを生成します。
そこに、 favicon
や fonts
、 images
をコピーし、そのフォルダごと、 Redmineのthemeディレクトリに配置すればOK。
Project Opal について
@m4xiJo さんが立ち上げ、有志で構成される Redmineの外観のモダン化を目的としたプロジェクトで、フロントエンドの機能を用いて拡張しやすく、FlatでCleanな外観にする事をゴールにしています。
主に、 Discordの Redmineサーバ で議論されています。
今回、このProjectに参加することになったので紹介します(とは言え、フロントエンドはからっきしなのですが)。
まだまだなところはありますが、これからどんどんブラッシュアップしていくと思います!
また、参加してくれる人を募集しているので、 Discordの Redmineサーバ までよろしくお願いします。
特徴
- トップバーの固定に変更
- ナビゲーションタブをSticky Navigationに変更 → How To Create a Sticky Navbar
- 検索バーをSticky Navbarの用に張り付きするよう変更
- SideBarをSticky Navbarの用に張り付きするよう変更
- Day mode と Night modeの切り替えボタンの導入
- 外部リンクの通知
- 外部リンクを開く場合に、警告のポップアップを出す
- 絵文字のサポートと(試験的に)クイックサーチを追加
- トップバーにクイック検索を配置
上記を踏まえて、詳細を以下に挙げていきます。
Sticky Navigationへ変更
twitterなどにもありますが、見たほうが早いです。
Project Opalのテーマの場合、スクロールするとトップバーとナビゲーションタブ、サイドバーが消えずに残っている事が分かります。
これは、チケット一覧だけで無くすべてのUIで同様の動きします。
なので、チケットをスクロールさせた後に、簡単に機能の切り替えが可能なのでとても便利です。
また、トップバー下にあったクイックサーチがトップバーに移管しているので、どれだけチケットスクロールしてもすぐに検索が可能です。
現行のテーマ
Project Opal
外部リンクへの移動
下のスクリーンキャストから分かるように、外部リンクを踏むと警告のポップアップが出ます。 ただし、現状、jsに直書きになってるので、i18n対応が出来ていません。
サイドバーの表示切り替え
Hide Sidebar - Plugins - Redmine で実装しているこの機能が、テーマ側で実現しています。
絵文字の導入
こちらは、まだまだ、未完成な点が多いですが、チケットの作成などのタイミングで、Emojiに対応しようとしているようです。
最後に
まだまだ、荒削りですが機能としては、今まで欲しかったStickyなUIはとても便利に感じました。 これからが楽しみです。
また、今回試した環境は、 yassan/docker-project-opal に置いているので、実際に試したい方はどうぞ。