サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
wyukawa.hatenablog.com
www.oreilly.co.jp 目次はこちら 第1部 主題 1章 ソフトウェアエンジニアリングとは何か 第2部 文化 2章 チームでうまく仕事をするには 3章 知識共有 4章 公正のためのエンジニアリング 5章 チームリーダー入門 6章 スケールするリーダー 7章 エンジニアリング生産性の計測 第3部 プロセス 8章 スタイルガイドとルール 9章 コードレビュー 10章 ドキュメンテーション 11章 テスト概観 12章 ユニットテスト 13章 テストダブル 14章 大規模テスト 15章 廃止 第4部 ツール 16章 バージョンコントロールとブランチ管理 17章 Code Search 18章 ビルドシステムとビルド哲学 19章 GoogleのコードレビューツールCritique 20章 静的解析 21章 依存関係管理 22章 大規模変更 23章 継続的インテグレーション 24章 継続的
データの活用が当然のことのようになってエンジニア以外でもSQL書いてデータ抽出するのが一般的になってきました。さらにデータサイエンティストの登場により高度な分析もされるようになってきて、顕在化してきたのがHadoopクラスタの無法地帯化とエンジニアの疲弊なんじゃないかと最近思っております。なおHadoopに限らずElasticsearchでも言えたりします。 これって要はユーザと管理者のバランスの問題で、Hadoopエンジニアを採用するのが難しいというのが背景にあります。 SQL書ける人はそれなりにいるけど、インフラ側の人材不足ですね。この状態でデータの民主化が進むとどうなるかというと、 クエリの数が増える -> なかにも重いクエリも結構ある -> 管理者がそれをチェックするのに疲れて放置するようになる -> クラスタの負荷が増えて障害も出るようになる -> クエリ実行にも時間かかるように
fluentdは基本的には安定して動くソフトウェアだけど規模が大きくなってユースケースが増えてくるとトラブルに遭遇することもある。今回は運用周り、例えばトラブルシューティングとかモニタリング周りについてちょっと書いてみたい。 前提として僕の環境ではtd-agentは使わず素のfluentd 0.12系を使っており、xbuildでrubyをインストールし、supervisordでプロセス管理している。 また僕はfluentdクラスタを運用する立場であり、このクラスタに対して社内のメンバーが自由にfluentdを使ってログを送信するという形になっている。 なので末端のfluentdの管理は僕ではなく各自でやってもらうということになっているのだが、そこで問題が出ることもある。 fluentdのバージョン管理問題 例えば、とあるfluent pluginをインストール or アップデートしたらfl
td-agentのprofiling - wyukawa’s blog に書いたようにfluent-plugin-uri_decoderが重いということまではわかりました。 じゃあどうすっかという話なのですが、内部で議論がありRuby 2.4 + CGI.unescape + fluentd filterでいけばいいんじゃね?ということになりやってみました。 sonots先生も言ってるし背中を押されました。 便利そう(ステマ)というのと、URI.decode は obsolete ですね、というのと CGI.unescape なら新しめの ruby で高速化されてるはず、というのと / “td-agentのprofiling - w…” https://t.co/t6R2sTgvWR— そのっつ (Naotoshi Seo) (@sonots) 2017年6月8日 Ruby 2.4 + C
末端ノードでnginxのlogをtailしてparseしてごにょごにょしているtd-agent 2.3.1のCPU使用率が50%ぐらいになっていたので、下記を使ってprofilingしてみた。 https://github.com/sonots/fluent-stackprof なおtd-agentのモニタリングには https://github.com/matsumana/td-agent_exporter を使いました。 いままでちゃんとモニタリングしてなくてし始めて気づいたけどピーク時は普通にCPU使用率100%いってた。。。 profiling対象マシンでstackprofをinstall /usr/sbin/td-agent-gem install stackprofin_debug_agentを有効化するために下記をtd-agent.confに追加してtd-agentを再起動す
題記の通りです。 fluent-plugin-elasticsearch 1.9.3からElasticsearch 5.3に書き込んでから下記のようなエラーがたまに出てるのに気付きました。 Could not push log to Elasticsearch: {...{"index"=>{"_index"=>"hoge-2017.03.31", "_type"=>"fluentd", "_id"=>"...", "status"=>429, "error"=>{"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$7@1aa442ab on EsThreadPoolExecutor[bulk, que
Workflow Engines Meetup #1 - connpass 関係者の皆様おつかれさまでした。ありがとうございました。 スライドはこちら Azkaban from wyukawa Azkabanの紹介とうちのログ解析基盤でのユースケースを話しました。 Azkabanの開発がもっと活発になってほしいなあという話をしたら、oza_x86さんに「開発を活発にするには、今まで実行したジョブの数をMLに送るといい。開発者がテンション上げてくれる可能性がある」と言われたのでMLに投げときました。 https://groups.google.com/forum/?fromgroups#!topic/azkaban-dev/-LRHvS_GjQw
Javaの検査例外の仕組みは理解はできるけど、結果的にはあまりうまくいかなかったかなというのが個人的な見解です。理由は例外をcatchさせても無視されることが多いから。 下記の本にもそれに近い見解が述べられていた気がするけど忘れた。 Java: The Good Parts 作者: Jim Waldo,矢野勉,笹井崇司出版社/メーカー: オライリージャパン発売日: 2011/02/24メディア: 大型本購入: 3人 クリック: 148回この商品を含むブログ (37件) を見る 僕がSIerにいた頃は、開発者に例外をcatchさせてはいけないと言われたものでした。 共通チームが共通部品やフレームワークを整備して、他チームがそれを使って開発することが多いわけですが、その場合に個々の開発者が例外をcatchする必要がないように整備するのが一般的でした。 例えばStruts 1のActionのex
うちの環境ではkafkaに入ってるログをkafka-fluentd-consumer 0.3.0でconsumeしたのちにfluent-plugin-elasticsearch 1.9.0経由でElasticsearchになげるということをしています。 fluent-plugin-elasticsearchは8プロセス動いていて各プロセスがメモリを5〜8GB使っている状態でした。マシンのメモリは64GBだったので割とメモリがかつかつな状態だったせいか、以下のようなログをはいてkafka-fluentd-consumerが落ちるという状況が発生していました。 failed; error='Cannot allocate memory' (errno=12) # # Native memory allocation (mmap) failed to map 555745280 bytes fo
手元でカジュアルに運用しているElasticsearch 2.4(2.4.1だったかも)をえいやと5.0.1に上書きアップグレードしていろいろはまったのでメモっておく。 その前にElasticsearch 5がどんな感じなのかはwyukawa's tumblr, johtaniさんとElasticsearchについて話しました Guest ...を聞くと良いと思います。まあ宣伝です。 まあこういうのは2つクラスタ用意してblue green deploymentするのが安全だと思います。 ただどっちにしろクライアントの対応状況にも気をつけたほうが良いです。REST API使ってるやつならだいたい大丈夫だと思いますが、Java系だと互換性が無いんじゃないかな。 僕の環境ではfluent-plugin-elasticsearchから書き込んでますが、アップグレード作業中はデータを止めたほうが良
http://hadoopsummit.org/tokyo チケット代が約4万円で高いと噂になったHadoop Summit Tokyo 2016に行ってきました。 ただ海外ではこのぐらいの値段は普通らしく、むしろ日本が異常に安すぎるという。 そのしわ寄せがイベント運営者にいってしまっているのが現状なので、世界基準を知る良い機会だったかも。 僕は2日間とも最初から参加しました。 基調講演を除くと聞いたセッションは下記の通り。 10/26 Real-time Analytics in Financial: Use Case, Architecture and Challenges Path to 400M Members: LinkedIn’s Data Powered Journey Hadoop 3.0 in a Nutshell Apache Eagle - Monitor Hadoo
Prometheusのストレージ周りに関してちょっと調べたのでメモっておく。 間違っているところや補足すべきものがあれば教えてもらえると嬉しいです。 公式ドキュメントはこちら https://prometheus.io/docs/operating/storage 他に参考になりそうな資料としてはこの辺 Prometheus Storage from Fabian Reinartz https://promcon.io/2016-berlin/talks/the-prometheus-time-series-database 簡単に説明するとchunkという1024bytesの固定長データをもとに処理しておりインデックスはLevelDBに保持している。 メモリにデータを保持して高速化をはかりつつ予期せぬ停止によるデータロストを最小限にするため定期的にディスクに書き出している。HBaseのよ
fluentdからfluent-plugin-elasticsearchを使ってElasticsearchに書き込む部分でたびたびfluentdが詰まって苦労してたけど最近は落ち着いてきたのでその辺を備忘録としてメモっています。 最初はfluentdからElasticsearchに1プロセスで直接書き込んでいたけどなにかのイベント等でトラフィックがはねるとバッファ溢れがおきてました。なおこのときElasticsearch自体は特に問題は起きていません。 num_threads増やしたりbuffer_chunk_limit, buffer_queue_limit, flush_intervalあたりを調整したりというのをやっていたけど(実際にやったのは僕じゃないけど)、それでも厳しいのでプロセス分離してfluentd A -> fluentd B1,B2 -> Elasticsearchとい
Prometehus, Grafanaでモニタリングできるのはもうわかったので監視をどうするかというとAlertmanagerを使うことになります。 Prometehus本体に比べればAlertmanagerはまだ成熟してないと思うけど、使う価値は十分にあると個人的にあると思ってます。 その理由は2つあって、Prometehusで収集したメトリクスに対してアラートを設定できることと、アラート通知をまとめることができるということ。 1番目はまあわかりますよね。GangliaでモニタリングしてNagiosで監視とかだとツールが分かれているのでやりづらい。Gangliaでモニタリング結果に対してNagiosでアラート通知できないからね。 2番目が今日最も書きたかったこと。 監視はナイーブにやると、いったんアラートがなったときに対処しない限り延々とアラートがなり続けることになります。 例えばあるプ
Prometheus Casual Talks #1 - connpass 発表者、参加者の皆様おつかれさまでした。ありがとうございました。 Prometheusは日本ではあんまり使われていないと思うのでそんなに人集まらないと思ってたんですが、connpassに公開したその日にすぐ定員はうまるぐらい人気でした。 ただ97人の申し込みに対して実際に来たのは66人で、入退室の面倒くささを考えると今後はdotsを使うのが正しい気がしてきました。 参加者がどういうモニタリング、監視ソフトを使っているのか興味があったので、 事前に任意で「現在業務で使っているモニタリング、監視ソフトは何ですか?」という複数回答可のアンケートを実施したのですがその結果が下記です。 Zabbix 66 Nagios 48 Cloudwatch 34 Kibana 33 Elasticsearch 28 Cacti 26
僕は今見ている社内のログ分析基盤に数多くのOSSプロダクトを使っています。 具体的に言うと、Fluentdでログ収集してHadoopに書き込んでAzkaban経由でHiveバッチを動かしてデータを加工してPresto, Prestogres経由でみたりしています。 また最近はKafkaやElasticsearch, Kibanaといったものも使っていますし、Prometheus, Grafanaを使ってモニタリングするようになっています。 このように数多くのOSSプロダクトを使っている理由は、部品一つ一つを自前実装していたら時間がいくらあっても足りないからです。OSSプロダクトを活用することにより、レバレッジを効かせることができます。 そしてまたOSS界隈の進化のスピードが速いので、仮に自前実装したとしてもすぐに陳腐化してしまう危険性がある。であれば最初からOSSプロダクトを使って巨人の肩
fluentdはRubyで実装されていることもあり複数CPUを使えないので、トラフィックが増えてきた場合などはポートを分けて複数プロセスで起動することが一般的です。 なのでマシンごとのCPU使用率を見てもfluentdの状況がどうなのか判断することは難しいです。 ちなみにJavaだとそういうことをする必要がないしJMXもあるのでfluentdが特殊なミドルウェアなのかなという気がします。 fluentd以外でユースケースを思いつかない。 そこでfluentdのプロセスごとのCPU使用率をモニタリングしたいわけですが、どうやるかというのが今回のテーマです。 やっかいなことにfluentdはsupervisorとworkerの2プロセスあってモニタリングしたいのはworkerです。まずはworkerのpidを求めないといけないわけですが、その辺の話は省略します。 process_nameがある
題記のようなことを考えていて、レポーティング、モニタリング、監視で使うストレージは全部統一されているほうが当然運用が楽だと思うのですが、現状だと統一できなくて用途ごとに分けてHadoop, Prometheus, Elasticsearchに格納するというのが僕の今のところの見解です。 僕は日頃の仕事はログ分析基盤を構築、運用をしつつデータ加工バッチを書いたりしています。 各サービスのPV, UUといったメトリクスを日々レポーティングするのであればアクセスログ、アプリケーションログ、各サービスのマスターデータ(例:ユーザ情報、商品マスタ)などをHadoopにぶっ込んでHiveでdailyで集計すればことたります。 Hadoopの良いところはSchema on readでとりあえずデータをぶっ込んでおいて後で解析できるところです。しかも容量やCPUパワーが足りなくなったら台数ふやぜば簡単にス
現状のモニタリング、監視の仕組みにあまり満足していない部分があって、別のツールないかなあと思ってたらふとしたきっかけでPrometheusを知りました。これちょっと面白そうなんで書いときます。 https://prometheus.io 日本語の記事だと【入門】PrometheusでサーバやDockerコンテナのリソース監視 | Pocketstudio.jp log3が参考になります。 ちなみに現状の不満点は何かと言えば、下記の通りです。 モニタリングと監視が完全に分かれている HDD使用率などの汎用的なメトリクスをモニタリングするツール(例:Kurado)とミドルウェア、アプリケーション固有のメトリクスをモニタリングするツール(例:Growthforecast)が分かれている Prometheusはモニタリングと監視が統合されたツールで各種メトリクスも統一的に扱えます。ただし監視に関し
ちまたではAirflow(https://github.com/airbnb/airflow)が話題のようですが、Azkaban(http://azkaban.github.io/)を使っている身としてはやはりAzkabanについて書かねばならないと思ったので書きます。別にAzkabanを使ってほしいという意味ではないです。むしろAirflowの運用エントリとか読みたいです。 AzkabanはJavaで実装されたジョブ管理ツールです。開発が若干停滞気味ではありますが、細々と進んでいます。 特徴としては、下記の通りです。 インストールが簡単(バイナリは古いものしか無いのでソースビルドが必要だがgradlewなので簡単) ジョブの依存関係をグラフィカルに見る事ができる。 APIがある ジョブが失敗した時でもボタン一つで失敗したジョブだけ再実行できる TTLがあるけどジョブの実行ログをブラウザか
最近ふと思うことはIT仕事にはざっくり以下の四種類あるなということ。 一つの会社で四種類の仕事を提供している場合もあります。 第一象限の超エンジニアリング系 技術的優位性がそのままビジネスメリットに結びつくもの。 技術的にチャレンジする部分も多い。 具体例をあげると、検索会社のエンジニアが検索の性能を上げるとか、データ分析サービスを提供している会社のエンジニアがクエリの性能を上げるとか、純粋にエンジニアリングの技術が必要でかつそれが会社の利益に直結するタイプの仕事。企業が自分のビジネスに関連のあるOSSのコミッタを雇っているケースもそのエンジニアはこのタイプの仕事をしていると僕は思っています。 IT業界においてこのタイプの仕事は少ないですが、このような仕事を多く提供している会社が良い会社であり、必然的に良いエンジニアが多く集まるし給料も高い傾向にあると思います。 第二象限のR&D系 第一象
約1年間Prestoを運用していて気づいたことを書いてみようと思う。 Prestoが素晴らしいOSSプロダクトであることは間違いなくて、Hiveを使っている人はインストールして損は無いと思う。 メリットは下記の通り Hiveに比べるとオンメモリで処理するので高速でアドホッククエリに向いている 安定している。 ストレージを持たないアーキテクチャなのでアップデートが簡単 開発が活発。最近は以前に比べるとバージョンアップのスピードは落ちてきたがそれでも3週間に1回はバージョンアップしている。 バグ報告すると数日で修正されたバージョンがリリースされる。 開発がオープン。pull requestも受け付けておりコードレビューが丁寧 コードが奇麗でモダンJavaの代表だと勝手に思ってる 最近の変更を見る限りPrestoは安定性を重視しているように見え、これは僕のような管理者にとっては運用負荷が少なくな
以前2種類のログ解析基盤 - wyukawa’s blogで書いたログ解析基盤のうち2つ目のプランナーよりのシステムが現在どうなっているかを書いてみたいと思います。 ちなみに1つ目のエンジニアよりのシステムの方も更新はあって、Fluentd+Norikra+Elasticsearch+Kibanaによるリアルタイムモニタリングを始めたり、メルカリでのNorikraの活用、 Mackerelを添えてを真似て、Norikraにクエリを登録したらGrowthForecastに自動でグラフが出来るようにしたり、Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetupと少し似ている、Norikraにクエリを登録してログに特定のキーワードがあったらHipChatに通知するようにしたり、といったことをしています。 2つ目のプランナーよりのシステムの全体像はこんな感じで
僕はHive, Pythonでバッチ処理を書いてAzkabanでジョブ管理するシステムを構築、運用した経験が2年ほどあるので今日はバッチ処理、ジョブ管理について書いてみようと思います。 僕の経験上Hadoop特有の部分、例えばテスト環境が作りづらいとかバッチサーバーはジョブをsubmitするだけなので負荷はそんなにかからないとか、はあるけれど割と汎用的なのではないかと思います。そもそもバッチ処理、ジョブ管理について書かれたものはほとんど見た事がないので参考になれば嬉しいし、こういう良い方法もあるよ!とかあれば是非ブログ等に書いてほしいと思っております。 最初に言っておくとバッチ処理、ジョブ管理において重要なのは障害時のリカバリのしやすさです。正常時はまあいいでしょ。 なので例えば引数に日付を持てないようなバッチ書いたら辛いですし、LL言語で書く方がコンパイル、パッケージングとか楽です。CP
4日間のNetezza研修に行ってきたのでNetezzaのアーキテクチャについて書いてみる。 Netezzaの全体像はこんな感じです。 SMP hostというのがクエリを受け付けてparseして最適化してプランを作ります。SMP hostのDiskはDRBDで二重化されています。 プランはSnippetという単位になりそれが各SPUにばらまかれて並列処理されます。 各SPUでC++コードの生成、コンパイル、実行という処理を行いますが、2回目以降はコンパイル済みのオブジェクトコードがキャッシュされるので早くなります。 SPUはSnippet processing unitの略でCPU, FPGA, Memoryを持ちます。 FPGAで解凍処理や行、列の絞り込みを行うことによって性能向上をはかります。 CPUの仕事を減らしてハード側でなるべく処理させるという感じでしょうか。 テーブルを作るとき
僕は様々なOSSプロダクトを使ってシステムを構築しているけれど、自分なりにぼんやりと考えているOSSプロダクトとのつきあい方について書いてみる。 どのようなシステムを作るにせよ、それが一定以上の規模になるのであればOSSプロダクトを使わずに全部自前で実装するのはもはや現実的ではないです。例えばDBが必要だからってDB実装しますか? ただこれがHTTPクライアントライブラリぐらいになるとちょっと微妙になってきて既存のライブラリが使いにくいから自作するってケースはもしかしたらあるかもしれないです。僕はそんなスキルないので自作しないですけどね。ただ既存ライブラリをラップして使いやすいAPIを提供するとかならあるかも。 商用製品だったり内製プロダクトだとぐぐれないし、ドキュメントとかソースが無くて情報共有しづらいことが多いし、またそれを使って学んで他に役立つか微妙なのでエンジニアのモチベーションも
僕は仕事では2種類のログ解析基盤を見ています。 1つ目はどちらかというとエンジニアよりの解析基盤でサービス側のエンジニアがShib, ShibUIを通して好きにクエリを投げることができます。ただしtableをcreateしたりdropしたりinsertしたりはできません。selectのみです。データの更新作業は別途cronのhive batchで行います。データはFluentd経由で各サービスのサーバーから収集します。こっちのシステムは古くからあって僕は引き継いだだけなので見ているとはいってもそんなにやることは無いですし、語れることも少ないです。 2つ目は約1年前に僕が一から構築したシステムでプランナーよりのシステムになってます。僕のチーム内のエンジニアだけがrawデータを触ったり更新したりすることができて、プランナーはレポートを通して加工されたデータを見る形になります。なので1つ目のシス
Prestoのコードを読んでいるとairliftなるパッケージにお目にかかることがあります。 GitHubのorganizationにairliftというものがあってこれの配下にいろいろなプロジェクトがあって、ここにairliftのソースがあります。 https://github.com/airlift 例えば https://github.com/airlift/airlift 配下はRESTサービスを作るためのフレームワークが整備されています。 https://github.com/airlift/airlift/tree/master/http-server はJettyをGuice風味にラップした使ったhttp serverです。 https://github.com/airlift/airlift/tree/master/http-client はそれのクライアント版です。 Pr
https://github.com/wyukawa/yanagishima インストール方法と使い方はREADMEを見てください。 目指したのはMySQL WorkbenchのPresto版です。 テーブルやパーティションをマウスで指定して右クリックしてselect実行が出来ます。 名前は茅ヶ崎にある柳島からとりました。深い意味は無いです。 コードもUIもまあグダグダな感じではありますが、ひとまずリリースすることが重要だと思っているのでリリースしました。社内でもチーム内で使い始めました。 presto-cliとazkabanとshibを参考にして作ってます。 サーバーサイドはGuice+Jettyで、クライアントサイドはjQueryです。 開発作業のほとんどがJavaScriptをいじることになって、これはもしかしてサーバーサイドもJavaScriptで書いた方が言語も統一出来て良かった
次のページ
このページを最初にブックマークしてみませんか?
『wyukawa's diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く