Takeshi Arabiki
自己紹介
SRE とデータエンジニアリングとアプリケーション開発を足して 2(not 3!)で割ったような役割のチームでテックリードとプレイングマネージャーを足して 2 で割ったようなことをしているエンジニア。主に Rails / AWS / MySQL / Presto / Fluentd / Cassandra / Kafka。R言語上級ハンドブック共著者。
関連 URL
- @a_bicky
- abicky
- abicky
- Speaker Deck a_bicky
- クックパッド開発者ブログ執筆エントリー
- 社内インタビュー
主なスキル
Rails
そこそこの規模の Rails アプリケーションの開発に 8 年程度従事している。ただし、Vue.js や React.js 等、モダンな JS フレームワークはまともに触ったことがない。Vue.js は多少コードレビューができる程度。Rails とは言っても、Rack アプリケーションよりもバックグラウンドジョブ等のアプリケーション開発が多い。
また、大半の不安定な system spec は直すことができる。
cf. Rails アプリケーションの不安定なテストを撲滅したい 〜system spec のデバッグ方法とテストを不安定にさせる要因〜
Ruby
Ruby 歴 8 年ぐらい。Ruby コミュニティには全然顔を出さないので、その界隈で話題になっている最先端な情報は把握していないが、一番早く書ける言語であり、OSS で不具合を見つけたら Pull Request を送るだけのことはできる。
以下、特筆すべき Pull Request
- fluentd v0.14 の stable release のブロッカーになっていた deadlock 問題を解消した PR
- bootsnap を使うと起動時に稀にエラーになる問題を解消した PR
- ruby-kafka に機能追加を出した PR
- Datadog のライブラリに機能追加を出した PR
ridgepole は PR を何個も出していたら、かつての同僚ということもあってかコミット権をもらえたが、最近は全然コントリビュートできていない。
いくつか自作の gem もある
- ActiveRecord::LockWaitTimeout, ActiveRecord::Deadlocked, ActiveRecord::ConnectionTimeoutError が起きた時に原因調査に役立つ情報を表示する gem を作った
- ruby-kafka の consumer group で instance type や availability zone によって特定の partition の lag が大きくなる問題を解消する gem を作った
- Avro でスキーマ管理されたデータを BigQuery で取り込めるデータに変換する
- fluent-plugin-mysql-select-insert
Ruby のアプリケーションを運用する上ではメモリ管理周りの知識も必要なので、その辺もそこそこ理解しているつもり。
MySQL
MySQL がどのように動いているかや、パフォーマンスを出すための SQL のチューニングやインデックスの張り方についてはそこそこ詳しいはず。以下、主な執筆記事。
- MySQL で複合インデックスを作成する際には必ず Explain の key_len を確認すべきという話 - あらびき日記
- Rails Developers Meetup 2018 で「MySQL/InnoDB の裏側」を発表しました - あらびき日記
- 論理型の設定値を RDB に保存する場合の選択肢と各々のメリット・デメリット - あらびき日記
- MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ
AWS
4 年以上 ECS を使っているので、ECS と EC2 のノウハウはけっこう持っているはず。
あとは S3, SNS, SQS, Lambda, Route53, EMR, EventBridge 辺りを組み合わせたアーキテクチャだったらすぐ構築できると思う。
Savings Plans, Spot instance を使ったコスト削減や、アーキテクチャの改良によるコスト削減も得意。
Datadog
監視サービスを CloudWatch Alarm から Datadog に移行し、実運用に乗せるところまでを行った経験があるので、Datadog の辛いところをどう解消したかなどは色々語れる知識がある。以下はその例。
ただし、Datadog は監視用途にしか使ってないので、APM, Logs 等他のサービスについてはノウハウがない。
Terraform
AWS のリソース、Datadog のモニター等を Terraform で管理した経験があるので、Terraform を使ったインフラ構築等はサクッとできるはず。
Fluentd
そこそこの規模のデータを扱う aggregator の運用経験が 4 年以上あり、運用で問題が起きた時にソースコードを読み解いて Pull Request を出せる程度には理解している。
特に、v0.14 の安定バージョンのブロッカーになっていたバグを直したのは自分である。
We got a bug report about output plugin deadlock with several plugins. @abicky fixed this bug and several users tested the patch on their environment. Many thanks for working on this issue.
cf. Fluentd v0.14.22 has been released | Fluentd
Fluentd 入門 〜運用に必要な基礎知識〜 はその時の産物。
Presto/Trino
4 年以上は自分が中心になって運用した経験があるので、安定化やパフォーマンスチューニングに関するノウハウは国内だとけっこう持っている方だと思う。Pull Request を送るほどの Java の知識はないが、connector にちょっと手を入れることはできるし、挙動を理解する際にどの辺のコードを読めば良いかは主要部分に関しては把握している。
Amazon Elastic MapReduce (EMR) ではじめる Presto/Trino 入門のように入門者向けの記事や、Presto における Service Discovery の動作原理のように運用者向けの記事も執筆している。
対外発表には次のようなものがある
- Repro Tech Meetup で「Repro における Presto の安定化・パフォーマンス改善の歩み」を発表しました
- Repro における Presto Cassandra Connector 改造秘話 / Presto Conference Tokyo 2020
Go
Go で書かれているサービスをコードレビューすることがたまにあるのと、簡単な処理であれば Go で書くこともある。次のように、Go の習得も兼ねて Go 製の運用ツールの開発経験もある
ただし、普段読み書きする機会はほとんどないので、Ruby に比べると開発速度はかなり劣る。
Java
書くことはほとんどないが、Presto, Cassandra, Kafka, Kafka Streams 等、運用している OSS のコードは挙動を理解するために頻繁に読むことがあるし、普段 Kafka Streams アプリケーションのコードレビューもしている。
以下、Java で書かれたソースコードを読んだりブレークポイントを設定したりして挙動を理解した例
- Stateful Kafka Streams アプリケーションで consumer が増減すると意図しない偏りが発生する理由 〜 StreamsPartitionAssignor はいかにタスクを割り当てるのか 〜 - あらびき日記
- Presto における Service Discovery の動作原理 - あらびき日記
- Docker のログを columnify で Athena (Presto) に特化した Parquet にする - あらびき日記
- Cassandra でレプリケーションストラテジーを変更するとデータが消失する - あらびき日記
- Hive on Tez で Parquet を Snappy で圧縮すると起きる Container is running beyond physical memory limits. を解消する - あらびき日記
- Sloppy Phrase Search の slop とは - あらびき日記
BigQuery
パフォーマンスが出ない場合やメモリエラーが起きた時に原因を調査して解消したり、数百行規模の分析クエリを書いて複雑めの集計を行うこともできる。
Kafka
2 年以上 Kafka broker を運用しているし、ruby-kafka のほぼ全てのコードを読んだ上で ruby-kafka を使った producer アプリケーションも consumer アプリケーションも書いたことがあるし、Kafka Streams をソースコードレベルで理解した上で Kafka Streams アプリケーションのコードレビューをできるし、librdkafka もトラブルがあればソースコードレベルで調査できる。
- Stateful Kafka Streams アプリケーションで consumer が増減すると意図しない偏りが発生する理由 〜 StreamsPartitionAssignor はいかにタスクを割り当てるのか 〜 - あらびき日記
- rdkafka-ruby で Local: Broker transport failure (transport) が起きる場合の対処方法 - あらびき日記
また、ruby-kafka には積極的にコントリビュートしている
Cassandra
3 年以上の運用経験があり、書籍を読んだりソースコードを読んだり手元で動かしたりして色々ノウハウが溜まっている。
- Cassandra でレプリケーションストラテジーを変更するとデータが消失する - あらびき日記
- Cassandra C/C++ Driver を使うと Cassandra で Connection reset by peer という INFO ログが出る - あらびき日記
言語
日本語
ネイティブ
英語
カランメソッドを全ステージ修了したり、2 年以上、週 2 回 1.5 時間の英会話を続けているので、1 対 1 であればある程度コミュニケーションが取れる(元々英語は苦手なので、勉強している割にはできない方かもしれない)
- TOEIC L&R 935 (2021 年 8 月)
- Listening 455 (CEFR B2)
- Reading 480 (CEFR C1)
- duolingo english test 105 (CEFR B2)
執筆歴
- R言語上級ハンドブック (2013年)
登壇歴
- 2020年
- 2019年
- 2018年
- 2015年
- 2013年
- R による文書分類入門 (Tokyo.R #31)
- 2012年
- HTML5 Canvas で学ぶアフィン変換 (SWF 研究会#2@東京)
- Rのスコープとフレームと環境と (Tokyo.Lang.R #0)
- 2011年
- twitteRで快適Rライフ! (Japan.R #2)
- RではじめるTwitter解析 (2011年度 データ解析環境Rの整備と利用)
- R版Getopt::Longを作ってみた (Tsukuba.R#9)
- Rデータフレーム自由自在 (Tsukuba.R#9)
- 文字列カーネルSVMによる辞書なしツイート分類 (第7回自然言語処理勉強会)
- Rデバッグあれこれ (Tokyo.R #16)
- 2011年
- TwitterのデータをRであれこれ (Osaka.R #4)