uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

prestoのrpmパッケージのファイルサイズを削減する

Overview

presto-server-rpmで生成されるrpmパッケージ/tar.gzは現在700MBを超えています(v316ベース)。
一般的な環境であればprestoのコネクターは1つか2つぐらいしか使っていないと思います。
その他の利用していないコネクターを削除したrpm/tar.gzを作成すれば、 PrestoをDocker環境で利用しているのであればDockerコンテナのサイズが削減されデプロイの高速化などが期待できます。

rpm/tar.gzの中身を確認する

まずは、現在のデフォルトの状態でrpm/tar.gzをビルドして内訳をみてみましょう。

 ❯ du -hs presto-server-rpm/target/presto-server-rpm-316-SNAPSHOT.x86_64.rpm presto-server/target/presto-server-316-SNAPSHOT.tar.gz
704M    presto-server-rpm/target/presto-server-rpm-316-SNAPSHOT.x86_64.rpm
704M    presto-server/target/presto-server-316-SNAPSHOT.tar.gz

次に、tar.gzファイルを展開してどのコネクターが容量を占めているか確認してみます。 今回はサイズの大きい上位10件を表示してみます。

% gdu presto-server-316-SNAPSHOT/plugin/* | sort -nr | gnumfmt --to=iec --format "%5fM" --to-unit=K |head -n 10
  118M presto-server-316-SNAPSHOT/plugin/phoenix
  115M presto-server-316-SNAPSHOT/plugin/hive-hadoop2
  111M presto-server-316-SNAPSHOT/plugin/raptor
   51M presto-server-316-SNAPSHOT/plugin/accumulo
   40M presto-server-316-SNAPSHOT/plugin/presto-elasticsearch
   32M presto-server-316-SNAPSHOT/plugin/kafka
   25M presto-server-316-SNAPSHOT/plugin/geospatial
   23M presto-server-316-SNAPSHOT/plugin/ml
   21M presto-server-316-SNAPSHOT/plugin/kudu
   19M presto-server-316-SNAPSHOT/plugin/cassandra

phoenix, raptorなどが100MB超を占めています。 今回はこれらのコネクターrpm/tar.gzを除外してみます。

presto.xmlを編集する

具体的にどのファイルを変更すれば不要なコネクターrpmに入らないかというとpresto.xmlを編集します。

How can I exclude 1 particular plugin in final presto build - Google グループ

今回の変更点はこちらです。

diff --git presto-server/src/main/provisio/presto.xml presto-server/src/main/provisio/presto.xml
index aa9282ea69..9f065b0b06 100644
--- presto-server/src/main/provisio/presto.xml
+++ presto-server/src/main/provisio/presto.xml
@@ -50,60 +50,12 @@
         </artifact>
     </artifactSet>
 
-    <artifactSet to="plugin/cassandra">
-        <artifact id="${project.groupId}:presto-cassandra:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/example-http">
-        <artifact id="${project.groupId}:presto-example-http:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
     <artifactSet to="plugin/hive-hadoop2">
         <artifact id="${project.groupId}:presto-hive-hadoop2:zip:${project.version}">
             <unpack />
         </artifact>
     </artifactSet>
 
-    <artifactSet to="plugin/memory">
-        <artifact id="${project.groupId}:presto-memory:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/blackhole">
-        <artifact id="${project.groupId}:presto-blackhole:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/kafka">
-        <artifact id="${project.groupId}:presto-kafka:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/kudu">
-        <artifact id="${project.groupId}:presto-kudu:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/atop">
-        <artifact id="${project.groupId}:presto-atop:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/ml">
-        <artifact id="${project.groupId}:presto-ml:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
     <artifactSet to="plugin/geospatial">
         <artifact id="${project.groupId}:presto-geospatial:zip:${project.version}">
             <unpack />
@@ -116,42 +68,6 @@
         </artifact>
     </artifactSet>
 
-    <artifactSet to="plugin/phoenix">
-        <artifact id="${project.groupId}:presto-phoenix:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/postgresql">
-        <artifact id="${project.groupId}:presto-postgresql:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/redshift">
-        <artifact id="${project.groupId}:presto-redshift:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/sqlserver">
-        <artifact id="${project.groupId}:presto-sqlserver:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/raptor">
-        <artifact id="${project.groupId}:presto-raptor-legacy:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/redis">
-        <artifact id="${project.groupId}:presto-redis:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
     <artifactSet to="plugin/tpch">
         <artifact id="${project.groupId}:presto-tpch:zip:${project.version}">
             <unpack />
@@ -170,33 +86,9 @@
         </artifact>
     </artifactSet>
 
-    <artifactSet to="plugin/mongodb">
-        <artifact id="${project.groupId}:presto-mongodb:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/localfile">
-        <artifact id="${project.groupId}:presto-local-file:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
-    <artifactSet to="plugin/accumulo">
-        <artifact id="${project.groupId}:presto-accumulo:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
-
     <artifactSet to="plugin/presto-thrift">
         <artifact id="${project.groupId}:presto-thrift:zip:${project.version}">
             <unpack />
         </artifact>
     </artifactSet>
-
-    <artifactSet to="plugin/presto-elasticsearch">
-        <artifact id="${project.groupId}:presto-elasticsearch:zip:${project.version}">
-            <unpack />
-        </artifact>
-    </artifactSet>
 </runtime>

今回は phoenix 以外にも不要なプラグインも削除しています。
いくつか自分が使っていないプラグインを削除してどれぐらいファイルサイズを削除できるかみてみましょう。

$ ./mvnw clean install package -DskipTests -Dair.check.skip-all=true -pl presto-server,presto-server-rpm

全モジュールを再ビルドすると20分ぐらいかかるのでpresto-server,presto-server-rpmモジュールだけを指定してmavenビルドします。

$ du -hs presto-server-rpm/target/presto-server-rpm-316-SNAPSHOT.x86_64.rpm presto-server/target/presto-server-316-SNAPSHOT.tar.gz
256M    presto-server-rpm/target/presto-server-rpm-316-SNAPSHOT.x86_64.rpm
256M    presto-server/target/presto-server-316-SNAPSHOT.tar.gz

期待通り、rpm/tar.gzのサイズが小さくなっていますね。 今回の変更で半分以下のファイルサイズまで容量を削減出来ました。 一応、ファイルを展開して中身を確認してみましょう。

% gdu presto-server-316-SNAPSHOT/plugin/* | sort -nr | gnumfmt --to=iec --format "%5fM" --to-unit=K |head -n 10
  115M presto-server-316-SNAPSHOT/plugin/hive-hadoop2
   25M presto-server-316-SNAPSHOT/plugin/geospatial
   17M presto-server-316-SNAPSHOT/plugin/presto-thrift
   14M presto-server-316-SNAPSHOT/plugin/resource-group-managers
   13M presto-server-316-SNAPSHOT/plugin/mysql
   11M presto-server-316-SNAPSHOT/plugin/jmx
   11M presto-server-316-SNAPSHOT/plugin/session-property-managers
    9M presto-server-316-SNAPSHOT/plugin/password-authenticators
    6M presto-server-316-SNAPSHOT/plugin/tpcds
    5M presto-server-316-SNAPSHOT/plugin/tpch

しっかり、指定したモジュールのプラグインだけが残っています。

このようにして不要なコネクターを削除することで不要なファイルサイズを削減出来ました。

まとめ

Dockerでprestoを使うならこういった形でコンテナサイズを削減してデプロイを高速化しておくと良いでしょう。

Ansible始めてました。

昨年秋ぐらいから必要にかられてAnsibleを始めて今日までいろいろ書いたので振り返りをしようと思います。

まず、Ansibleを始める前はchefを業務で触っていてInfrastructure as a Code的なものは分かった状態でAnsibleを触りました。

入門書として自分はオライリーの初めてのAnsibleを買いました。

初めてのAnsible

初めてのAnsible

本書で紹介されているAnsibleは1.x系と現在の最新版である2.7とはメジャーバージョンが違うもので説明が進んでいきます。 最初はメジャーバージョン違いを気にして購入を躊躇したのですが一通り読んだあとにこの点を振り返ると特に支障はなかったというのが自分の実感です。当然、2.xで導入された機能はほとんど紹介されていないのでそこは公式ドキュメントを読んで補完する必要がありますがAnsibleのドキュメントはまとまりがありよく書けているのでドキュメントがなく使い方が分からないということにはならないでしょう。

そして、一通り読破しつつAnsibleを日常のパッケージ更新などのオペレーションに取りいてその過程で枝葉となる機能を少しずつ身につけていきました。 公式ドキュメントがわかりやすく書かれているので"Ansible + <やりたいこと>"でググって公式ドキュメントをヒットさせて学んでいくのが自分の学び方です。 docs.ansible.com

このような状態で一月ほど過ごした次は新規で構築するシステムをChefからAnsibleに全面的に置き換えるという作業を行いました。
新システムのプロビジョニングのために監視系を含め10以上のAnsible Roleを作成し3つのコンポーネントをセットアップしました。
同じことをChefでやろうとするとAnsibleの数倍以上の時間とコード量になったであろうことを思うとこの時に本当にAnsibleを導入して良かったと思いました。

Chefと比較した時にAnsibleの良いところは最初のハードルが低いところです。 Chefの場合はChef Serverがあってそこにクックブックをアップロードし対象サーバーをブートストラップしてknifeコマンドでロールや環境を設定してやっとプロビジョニングが出来るのに対して、Ansibleは作業対象サーバーを記載したinventoryファイルと作業内容を記載したplaybook yamlの2ファイルで始められるという違いがあります。 このたった2ファイルから始められるというポイントが時間がないけど少しだけやってみようかという気持ちにさせるのとプレイブックがただのyamlで一切コードを書く必要がなく新たに言語を覚える必要もないというのがAnsibleのメリットだと思います。

自分は初めChefからAnsibleに移行するのを躊躇していましたが今ではさっさとAnsibleに移行しておけば良かったと逆に後悔するぐらいに気持ちでいます。

さらに、今年に入ってからは通常のサーバー・オペレーションに加えて、PackerでのAWS AMIのプロビジョニングにも使うようになりました。
この利用方法はサーバーでプレイブックを実行し一通り検証したあとにpackerのjsonコードを少し足すだけでAMIが足すことが出来るのでシェルスクリプトなどを使うよりも冪等性やデバッグの容易性で有益でした。

2019年も2月になりましたが今年Ansibleを始める人の助けになればと思って自分が最近導入したときの学び方をまとめてみました。

paypayブームに乗ってPS4 Proを買った

www.jp.playstation.com www.biccamera.com

paypay.ne.jp

12/6から始まったPS4のキャンペーンと12/4からのpaypayの20%還元キャンペーン(40,20,10回に1回タダ)を併用してPS4 Proを購入した。

しかも今 PS4/ PS4 Proを買うとソフトが2本タダでダウンロード出来る特典つき。 store.playstation.com

今夏ちょっと迷ったあげくに買わなかったPS4だがこれだけ買う理由が揃ったら買うしかなかった。 もらったダウンロード・コードでスパイダーマンGRAVITY DAZEをもらっておいた。 store.playstation.com store.playstation.com

GRAVITY DAZEは今月無料で出来るんだけど今月は他のゲームやるだろうし買ったほうがオトクな感じがした。

余談で、購入したあとで箱にクーポンコードがついてなくてクーポンコードもらうためだけに店を再訪するってトラブルもあったけどいい買い物が出来た。

完全ワイヤレスなイヤホンを買ってみた

Aamzonのタイムセールで上の商品を買った。

まだ3日目ぐらいなのですべてを把握してないが今のところの感想を書いてみる。

  • 充電ケースに入れておけば意外となくさない。前にBluetoothのイヤホンをなくしたことがあるので完全ワイヤレスにすることでもっとなくしやすくなるかと思ったけどそんなことはなかった
  • 1回の稼働時間が4時間で思ったよりは持つ
  • ケースの充電がマイクロUSBなのが不満。AndroidケータイがUSB Type-Cなので端末の種類を揃えたかった。。。

あとはタッチしたときの操作などがまだ分かってないのでそろそろその辺を読んでいこうと思う。

Bluetoothのワイヤレスイヤホンを買った

[フォーカル(Focal)]Spark Wireless Black (スパーク・ワイヤレス・黒)

[フォーカル(Focal)]Spark Wireless Black (スパーク・ワイヤレス・黒)

最近、Bluetoothのワイヤレス・イヤホンを買って使っている。 ジムで運動するときに普通のイヤホンだとケーブルがからまったりケータイ電話をもつ必要があったりと面倒くさくなってきたのでワイヤレスのものにチェンジした。

使用感はほとんど問題なしBluetoothの接続に時々問題がある。 原因がプレイヤー側かイヤホン側か切り分けは出来てないが人混みなどで多数の電波があるようなところだと音飛びが激しい印象。

また、自分は音質にそこまでこだわりがないのでこれで十分問題なし。

あと意外と充電が面倒くさい。充電する際の端子がmicro USBで自分の持ってるものだとPS Vitaと家で使ってるヘッドホンぐらいしか利用してないやつ。携帯電話とMacbook ProがUSB Type-Cで充電できるのでイヤホンもそれなら良かったんだけど現在の主流はほとんどmicro USBなのでもうしばらくは複数の端子使っていく必要がありそう。

Bluetoothイヤホンに一切の不満がないってわけではないがいい買い物したと思って積極的に使っていきたいという所存。

Essential Phone PH-1への機種変更を検討中

store.google.com

昨日Pixel3について詳細が発表されましたが価格がiPhoneよりは安いが一番安いもので9.5万円からとなかなかいいお値段という印象を持ちました。7.5〜8万円台なら即決で買っただろうが2年程度で買い換えるスマホに9.5万円はちょっと高いなということで別の機種も検討しようとTwitterのタイムラインを眺めていた。 するとEssential Phone PH-1を何人かが代替として検討しているのを見かけた。 自分も過去にEssential Phoneを買うか検討したことがあったのでこの機会に改めて調査してみたところなんとタイミングが良いことにIIJがEssential Phone 購入キャンペーンを打っていることに気づいた。

www.iijmio.jp

キャンペーンの内容はEssential Phone PH-1を購入したらAmazonギフト券1万円がもらえるキャンペーンなので4.6万円+消費税 - 1万円で実質4万円程度新機種を購入出来るものだった。4万で1年前の機種に機種変更出来ることに自分はかなり魅了された。

ityarou.com nattonn01.hatenablog.com www.gizmodo.jp

レビューをみても評判も悪くないのでこれは真剣にPixel3をやめてPH-1に乗り換えを検討するレベルかなと。 Pixel3との差額5.5万円で何が出来るか考えると今回はEssential Phone買って周辺機器も揃えたほうが随分とコスパが良いように思い真剣に購入を検討中です。

自分と同じことを考えているのが日本中で何人かいるだろうし品切れにならないうちに早めに決断を下したいなと思う秋の夜でした。

3分間DNS基礎講座を読んだ。

3分間DNS基礎講座

3分間DNS基礎講座

3分間DNS基礎講座:書籍案内|技術評論社

DNS周りで有耶無耶にしてきた知識を簡単に復習したいというう意味合いで本書を読んだ。 DNSの仕組み、レコードの種別、やりとりされるデータの中身などエンジニアが利用者として必要になる知識を覚えたいのであればこの本を読むだけで十二分な知識が得られる。

bind, unboundのような具体的なDNSサーバーの運用に関しては全く書かれていないのでそういったものを期待するならオライリーDNS本を読むのが良い。

また、個人的に印象に残ったのがTCPのウインドウサイズやフロー制御にもふれている部分があってそれを学べる本があったのは意外だった。

シリーズの他の本は電子版が出ているんだがこの本だけ電子版になっておらず身近な本屋さんにもなかったためブックオフで見つけてきた。 本書の後半でFTP, Telnetに関してふれられているがモダンな環境では使われるものではないのでその部分を簡素化・再編して電子版が出版されてもいいように感じた。