2021.09.18 テ勢麻雀の記憶

 この記事は2021.09.21 に記憶を探りつつ書いてるので事実と違うこと書いてるかもしれんが許して。

 この日の麻雀は、何半荘やったかは覚えとらんのやけど、1位をけっこうとれて合計+90でおえることがでけた。嶺上開花であがることはできんかったんやけど、カンチャン待ちでリーチしてたのがけっこうあがれたんよな。自分含めて3人リーチしてる状況でもカンチャン待ちの最後の1枚をツモったんは熱かった。みんなが「嘘やろ!?」「これに負けるか!」って悔しがってたのみたんはなんともいえん嬉しさがあったな。まぁ自分もめっさ驚いてたわ。テンパイ即リーが最強かもしれん。

 天気は台風が近づいてたこともありけっこう荒れてて、目的地に向かうための電車は各駅停車しか動いていないという状況。いつもの出発時間と比べて1時間ほど早くに出たものの間に合うかわからんって感じやった。それでも臨時急行が設けられ、それにタイミングよく乗れたこともあり、集合時間に間に合うことができた。あとになって思い返すと、この日は運がいい日やったから間に合ったんかもしれんとすら思う。

 雀荘について体温チェック。デコを見せてはかる体温計で35.9℃とか低めの数値を他の人が出してるの見て「みんな低ない?」ってコメントしてたら自分は34℃やってオーナーさんが驚いとったな。自分ゾンビかな?まぁ以前も34℃を叩き出したことはあったからみんなからは「また!?」って感じに言われとったな。自分のおでこは冷えピタでも内蔵しとるんやろか。

 この日はテイルズオブアライズが発売されてから1週間ほどしかたっていないこともあり、話題は最初からアライズのことでもちきり。この時点でクリアしているのは自分だけだったので「自分の機嫌を損ねるとポロッとネタバレしてしまうかもしれん」とプレッシャーをかけまくったな。まぁここでみんなとの確執を作るのも嫌だったので自分なりに発言には気をつけるようにしていたつもりではおったんやけど実際どうやったんやろ?自分よりもつっしーの方がポロっと言うてしまってたようにも思うが。

 みんなのプレイ進行度合いを確認して、パーティメンバーが6人揃ったところまであたりなら話して良いってことになって、アライズの気に入ってるところとか話しながら麻雀してた。長い技名とかをすでに覚えてるあらさんとつっしーはすげぇなって思いながら聞いてたわ。クリアしてるからすでに何度も聞いたはずやのに、自分はあやふやにしか覚えとらんかった。特にあらさんはティオハリムを気に入った様子で、イベントのセリフを通して暗唱しとったな。今後もあらさんからはティオハリムのワンシーン再現が聞けそうで楽しみ。自分も含めみんな話すのに夢中になって、麻雀の方はけっこう注意散漫やった気がする。なかでも顕著やったんはしっぽらさんかな。よく「なんも考えてなかった」って発言してた気がするわ。テ勢雀士にはテイルズの話題を振ることで集中力を落とすことが効果的。

 アライズから引用した言い回しで今回印象に残ってるのは「壁を壊す」と「石付き」あたりかな。「壁を壊す」はアライズのなかでもけっこうネタとして使われてることもあってか汎用性が高いと思う。今後も危険な牌を捨てるときとかに何度もみんなから聞かれる言葉となるんやろな。「石付き」はすでにWiki入りされとるけど、何かしらマウントをとれたときに蔑称として使う感じになるやろか。レナ人が「石付きと麻雀してくる」と言ったときには他のレナ人から「仲いいのか悪いのかわからん」と言われること必至。

 けっこうたくさん話したはずやねんけど、数日経つとやっぱ思い出せんもんやな。次回はみんなアライズをクリア済みのはずやしネタバレ解禁でもっといろいろ話が膨らむやろうし楽しみやな。テ勢雀士たちは新たにアライズからどんな引用を生み出すのかも期待が高まる。むしろ自分はわりとやりきってしもうたから、覚えとるか不安やわ。

自称スクラムマスターとの遭遇と学び

 久々に書きます。あまりにも自分にとって衝撃だったので、今後同様のことが発生した場合にうまく対応するため、振り返って改善点を洗い出すことを目的として書いています。自身の経験をもとに書いてはいますが、自身の印象・記憶をもとに書かれているものであるため事実と異なる内容が含まれている可能性がありますのでご了承ください。

こんなスクラムマスターからは逃げよう

 結論から先に書きますが、以下の項目に複数該当するような自称スクラムマスターからは逃げましょう。おそらく自身の抱えるタスクのための時間は搾取され、不要な責任を背負うことになります。よほどやっていることに意味を見出していない限りは、可能な限り早くに逃げる決断をおすすめいたします。

  1. チーム状況について観察・理解・課題発見する前に「スクラムをやりたい」と言い出す
  2. チームにスクラムを導入するにしてはスクラムマスターとしての知見が乏しく、他にサポートできる人もいない
  3. スクラムマスターとしてやることよりも、スクラムマスターという役割を理由にやらないことを列挙する
  4. 技術領域において手を動かさない(障害対応時に他の人が手を動かしているのを見てるだけ)
  5. 改善を目的としてメンバーのやることを増やすが、減らすことを考えない(○○について考える会を定期的にやりましょうなど)
  6. 提案される改善策に対して「効果が見込めない」と反論されても「とりあえずやってみましょう」と強行する

 細かい点を言い出すときりがないので際立った点のみを上げています。詳細についてつらつらと以下に書いていきます。

背景

 自身が所属しているチームについてまずは簡単に説明します。とあるプロダクトを開発・運用しているチームで、プロダクトを構成する3つの要素ごとにグループが分けられているようなチームでした(UI, API, インフラなど)。それぞれのグループにだいたい4,5人のメンバーがおり、プロジェクトマネージャーとチームのリーダーがグループ全体を見ているような構成となります。グループ内の人によっては複数のグループをまたいで担当するような人もいます。

 ある日、リーダーが交代になると同時にチームの体制を変えるという話が伝えられた。主な変更内容としては以下の4項目。変更の目的は既存の体制の抱える課題を解消することになります。

  1. プロジェクトマネージャーの責任負担が大きいので、プロジェクトマネージャーをなくす
  2. コンポーネントごとに分けたことでグループをまたいだ案件の進行について課題がでてきたため、コンポーネントごとに分けていたものをやめて大きな案件をベースに2つのグループに分ける(各グループに各コンポーネントを見れる人がそれぞれ所属する)
  3. グループごとに開発サイクルに差があり全体の進捗度合いが見えにくいため、全体でスクラムをベースとした共通の開発サイクルを導入し、プロジェクトマネージャーだった人がスクラムマスターを担当する
  4. みんながすべてのコンポーネントについて理解を深めプロダクト全体を把握できるメンバーを増やす

 体制変更については新リーダーとスクラムマスターの相談によって大枠を決め、この宣言のあと1ヶ月ほどの期間で他のメンバーとの話し合いで詳細を詰めていくとのこと。

 このチーム自体は5年近く続いている状態ですが、メンバーの入れ替わりが激しく、最初からチームに所属していたのは前リーダーを含めて2, 3人程度。自分もこのチームに所属したのは約1年前で、ひとつのコンポーネントを運用するにあたり人が足りないから来てほしい、グループの状態を立て直して欲しいという助っ人としての参画でした。参画してからは運用を担当するコンポーネントのグループ内でのコミュニケーションがほとんどだったため、他のグループの状態やチーム全体の状態についてはあまり把握できておらず、上記の課題を伝えられても「知らなかった」という感想と、所属グループの状態がようやく安定してきた時期でもあったので「変更が必要なのか?」という疑問が生じていました。

対話期:課題の深堀りで高まる疑念

 体制を変えるという話がされたあと、実際に体制を移行するまでに1ヶ月近い時間があったので、その間にスクラムマスターと新リーダーに体制変更前のチームの課題について詳細を聞いてみた。

Q. プロジェクトマネージャーをなくすとのことだが、責任の所在はどこにいく?

A. メンバー全員が平等に責任を持つ

Q. 各コンポーネントを担当しているグループが担当領域についての責任を持っている状態だったはずだが、プロジェクトマネージャーの責任の負担とは具体的になにか?

A. グループをまたいでの認識を合わせたり優先順位付けがグループによって異なったりしていたので、それによって発生する調整が大変だった

Q. 自分が所属していたグループではそのような課題を認識していないが、自分が気づいていないだけ?

A. 主に他の2グループ間で問題が発生していた

Q. プロジェクトマネージャーがやっていたことは誰が引き継ぐのか

A. 都度メンバーの中から担当者を決める

 プロジェクトマネージャーの責任負担が大きいということについて確認したところ、自分が所属していない2グループ間の調整が負担(2つ目の課題に相当する)でありこれをなくしたいというのが本質的なところだった。問題の2グループだけをまとめればよかったのではないかと提案をしたがその後検討されず、プロジェクトマネージャーが大変だからやめたいと言っているだけではないかと聞くと返答は得られなかった。また、プロジェクトマネージャーがやっていた作業もメンバーに振られるとのことで、メンバーの負担が上がることが予見された。

Q. 開発サイクルを揃えるとのことだが、揃えないことによって具体的にどう問題なのか

A. スクラムを導入するにあたって開発サイクルを揃えたほうがやりやすい

Q. どうしてスクラムが良いと言えるのか?

A. 1グループがスクラムのような開発サイクルを実施していて良さそうに見えるので全体でやろうと判断した

 明らかに手段が目的になっているケースである。自分が所属するグループはスクラムを採用してはいないが、開発サイクルにおいて特に問題などはなく、むしろ成熟してきた時期でもあったため、チームを再編してスクラムを導入するという点についてメリットがあまりなかった。こういった点から、スクラムマスターはチーム全体を見て判断しているというよりも、自身が見ている範囲のみで改善策を提示しており、方法論についても「よさそう」という曖昧な判断基準で決定していると自分には感じられた

 「みんながすべてのコンポーネントについて理解を深めプロダクト全体を把握できるメンバーを増やす」については、長期的に考えれば理想な状態なのだろうということは理解できる。しかし自分は他のコンポーネントに対してあまり興味を持てていない、担当コンポーネントもまだまだ深く知るべきことがあり専念したいと考えていたため、他のコンポーネントに対して知るために時間を取られることが億劫であった。これについては自分自身の身勝手な考えなので、チームとしては学びの時間さえ確保できれば特に問題はないと判断していた。メンバーの入れ替わりが激しい状態が合わせて改善されればより効果は高まるだろう。

 スクラムを導入するにあたって、書籍などでは「みんなが同じ立場で遠慮なく発言できるような信頼感が大事である」といったことがよく書かれているが、自分はスクラムマスターや新リーダーに対してこの時点ですでに信頼を失いつつあった

混沌期:スクラムマスターとの衝突とチーム不和

 疑念は高まりつつも体制変更実施日を迎えた。あまり話したことのないメンバーとやり取りしつつ、約半年間で実施すべきタスクについて各コンポーネントの情報を出し合っていたのだが、ここで問題が生じる。

全体のスケジュール作成と管理を誰がどうやるのか

 これまでは、コンポーネント別の各グループごとにやることをリストアップして予定を作成していた。グループごとにまとめ役となる人がおり、自分もその1人だった。体制変更後はそういったまとめ役はどうする想定なのかとスクラムマスターに聞いてみると

「グループ内で決めてください」

 都度決めるというのはこういうことかと初めて理解した。普段から話をあまりしていない人同士、かつ隣のコンポーネントについてはこれから理解していくという段階でもあるため、率先してまとめ役になる人もいなければ他の人を推薦するという人もいない。スケジュールに関することに限らず、細かい決め事をするときは常に「誰がどのように決定するのか」という点で足踏みした。このように、スケジュール管理や決定することといったプロジェクトマネージャーが今まで実施してきたことが宙ぶらりんの状態になるのだ。

 スクラムマスターに「このような場合はどうすべきか」と訪ねてみると「グループのメンバーが納得行く形でグループ内で決めてください」という返答のみで、スクラムマスターは静観するのみであった。そういうものなのか?と自分でも疑問に思ったのでスクラムに関する記事や書籍を自分でも読んでみたが、自分が見た範囲ではスクラムマスターと合わせてプロジェクトマネージャーのような立場の人がいるケースがほとんどで、重要な決定やメンバーが判断に迷った場合の決定権に責任を持つ立場の人がいた。スクラムマスターにプロジェクトマネージャーを立てたほうが良いのではないかと相談してみたが、「とりあえずプロジェクトマネージャーは無しでやってみましょう」としか返答がなく自分の提案は棄却され、スケジュール管理の面については自分が「このままだとタスクが進まないので一旦自分の方でまとめます」と消極的な理由で立候補して担当することになった。その後も似たような状況に陥ることは何度もあり、これはマズいと思うものは自分が名乗りを上げて作業することになった。結果として、プロジェクトマネージャーがやるような仕事の一部をコンポーネント管理のヘルプとして参画している自分が実施し、時間を取られてしまうこととなった。

 スクラムマスターがスクラムについてどの程度事前知識を得てきたかという点で疑問が湧いたため参考にしている書籍など聞いてみたが「これからみんなと学んでいこうと思っています」という返答のみであり、知識を得ること自体積極的に実施していないことがわかった。さすがにそれはどうなのかと他のメンバーも同席しているミーティングで訴えたところ「スクラムについてチームで学ぶ時間をもうけよう」という提案をされた。共通の参考サイトを事前に見てきて、その場でどうスクラムを導入するのかについて相談するとのこと。すでにチームとして走り出してひと月以上経過している状態でこのような提案が出てくること自体どうかしている。チームの今後に大きな不安を抱いた。そして実際にそのミーティングが開催されたが「読んでは見たものの抽象的な内容が多く具体的にチームに落とし込むことが困難ですね」というまとめになってしまい、「今後も定期的にスクラムをチームに導入するにあたって考える会をやりましょう」という判断となった。このときには自分は、チームの体制の話については極力時間を割かないようにし、担当するコンポーネントの改善に務めることを決めており、この定期的なミーティングに対しても「タスクを消化することを優先するため不参加」と伝えていた。しかしこれが逆に、他のメンバーから「チームの体制改善に対して最初は異議を申し立て荒波を立てたが、最近は積極的ではなくただ荒らしただけ」という評価を受けてしまう。

静寂期:表面上はチームが上手く回る

 体制変更直後は荒れたものの、やることを決めてしまえば各自が着々とそれらを進めるのみとなったため、チームの体制について話す機会は少なくなった。この段階になって体制変更によってもたらされたメリットがひとつ見えてきた。

 複数のコンポーネントをまたいだ大きめの案件を進めていく中で、以前の体制であればコンポーネント間の確認においてかなり時間が経過してから認識違いが発覚するといった問題が発生していたが、体制を変更してからはコンポーネント間の確認をする機会が多くなり、認識違いをかなり早い段階から検知することができていた。体制変更の目的のひとつでもあった課題解消が目に見える形となって現れたのだ。

 自分が担当するものと異なる領域のメンバーと接する機会ができて思うようになったのは、この優れたメンバーがいるからこのチームは現状を保っていられるのだということ。細かい決めごとや以前はプロジェクトマネージャーがやっていたことを、自分だけではなくメンバーが分担してやるようになっていったことで、自身の領域のタスクをこなしながら、チームが上手く回るように尽力していた。

 メンバーが尽力している中で、スクラムマスターが積極的にチームのために行動を起こしているのかというと、自分が見える範囲では特に仕事をしているようには見えなかった。スクラムマスターに率直にそのことを聞いてみたところ「自分はあまり関与せずチームが成熟するのを静観しようとしている。自律した組織を目指しているので指示などをすると逆効果と考えている」という返答だった。たしかに、メンバー同士で積極性が出てきているようにも見えるが、プロジェクトマネージャーをなくしたことによって宙に浮いているタスクをメンバーの責任感から取りにいっているだけなので、いわばメンバーは尻拭いをしているのだと自分はとらえていた。チーム体制についてこのタイミングで意見してもチームにとってメリットはないと感じたので「そうですか」と返答しただけで話し合いの席から退いた。

再燃期:スクラムマスター動きます

 大きめの案件も終盤に差し掛かり、各コンポーネントの開発が佳境となっている中、スクラムマスターが突如動き出した。

「新しくツールを導入してチーム体制について意見交換しやすいようにしたい」

 タスクの整理などでホワイトボードにポストイットを使って状況を整理する手段があるのだが、それをリモートでもできるようなウェブツールの導入を提案してきた。メンバー内でも使用したことのある人はおらず、ツールについての理解から始めないといけない。スクラムマスターとしての自分の役割はチーム全体の支援であると自身で語っていながら、開発が佳境となっているこのタイミングでその提案はチームにとってマイナスではないかと呆れて、「今は何もしてくれるな」とメッセージを投げていた。

 これも自分の意見は聞き入れてもらえることはなく、ツールを導入しての相談が実施されたものの、数回行われただけでツールの継続利用は見送りとなった。さすがにこの提案には他のメンバーからも不評だったようだ。自分はその会議には参加していないので、どのような話し合いが実際されたのかは知らない。加えて、スクラムマスターが主に主催する会議では議事録をまともにとっていない状態なので、過去のやり取りがどこまで残されているかも定かではなく、今後同じようなやり取りのための無駄な会議が開かれることもリスクとして存在している。

 案件の終盤では部長などの偉い人たちに対して、この案件がこういう形で終わりますので承認してくださいという会議が開かれる。承認が得られなければ指摘された内容に合わせて修正する必要があるため、スケジュールが変更になるという重要な会議。この会議の資料を作成するというタスクがあったのだが、これも今までプロジェクトマネージャーが実施していたので宙に浮いた。過去に同様のタスクを実施した経験があるのは元プロジェクトマネージャーのスクラムマスターのみだったため、スクラムマスターに「みんな開発で大変な状態で他に人もいないので担当できないか」と依頼したが「スクラムマスターの役割ではないのでやらない」という返答だった。せめて雛形だけでも過去のものを参考に用意できないかとこちらから譲歩してみたものの、これに対してもやらないの一点張り。やってもらうために言葉を尽くすことも億劫だったため、しかたなく自分が資料を用意することにした。

 スクラムマスターの「自分はやりません」という主張はこれだけに限ったものではなく、技術領域における重要な判断や、グループ内で決まらなかったことの決定など、とにかく本人が思うスクラムマスターの役割ではないものは徹底して手を動かさなかった。

終わりに

 いきなり終わりになってしまい戸惑うかもしれないが、まだ自分はこのチームから脱出できておらず、日々スクラムマスターからの悪影響をどのようにしてかわすかということを考えさせられている。当然、チームから抜けることも考えてすでに行動に出てはいるものの、まだしばらく時間が必要といった状態です。それでも3ヶ月以内にはなにがなんでも脱出しておきたい。そうでなければ精神的にやんでしまいそうなので。

 スクラムというものについて、おそらく言葉を知っている人の数だけ理解のしかたがあるというほど抽象的なものだと思っている。自分はスクラムというのは「導入するぞ!」と積極的に取り組むものというよりも、2週間程度の開発サイクルを軸として、チームとして繰り返しタスクの洗い出しと担当ぎめ、実施した内容の確認、予定と実績を評価して予定の見直し、振り返りといったことが実施できる状態になっていれば、結果的にスクラムっぽくなっているという考え方でいます。こういった価値観の違いからそもそもこのスクラムマスターに対して批判的であったのではないかと言われると否定はできない。ただ、スクラムマスターを自称する人のアクションについては注意深く見たほうが良いとは思う。その人がどのようにチームを評価し、どういったチームにしたいのかということを事前にしっかりと理解することがうまくやるには必要だ。自分はこの事前の相談が十分に実施できなかったことにより、案件を進ませながら相談するといった時間的にも精神的にも余裕が持てない状況が生まれていた。

 ここまで読んでいただきありがとうございます。かなり勢いに任せて書いたものであるため、理解に苦しむ内容も含まれていると思いますが軽く読み流しちゃってください。不要なチームの不和など、自分のコミュニケーション能力の乏しさによって招いた問題というのもあるので、今回の経験をもとに自身の改善に努めたいと思うばかりです。しかしながら、人の考え方を変えるということは非常に困難なので、自分の取れる手段の中で「逃げる」ということもきちんと選択できるように余裕を持った状態にしておきたい。

荒野のコトブキ飛行隊 総当たり戦記録(2020.08)

2020.06 に実施された荒野のコトブキ飛行隊総当たり戦の戦闘に関する記録

結果としてはグループ内3位。102000 を超える数字を出すことができなければ龍級ランク0での1位は難しい。。。

相手の編成からできるだけ高い得点を得るためにトライアンドエラーを繰り返す必要があるこのイベント。時間の許す限り編成を試すことができるので、相手の編成に対してどのようにすれば優位に戦うことができたかを実験できるよい機会でもある。優位にたたくことができる組み合わせについて記録しておき、今後の演習などにも活用していきたい

ただし今回は龍級ランク0に入ることができたので、スコアボーナスを得るためにできるだけ赤色のキャラクターを使用するようにしている

プレイヤー名については念の為、一部を伏せたり変更したりしている

プレイヤー名編成有利に戦えた編成最高値を出したときの編成
まい○ー第1分隊
狂犬喝采フィオ
野生の嗅覚レンジ
月夜の怪盗ロイグ&美脚一閃リリコ月夜の怪盗ロイグ&美脚一閃リリコ
第2分隊
大切な仲間ダリア
叱咤号令エンマ
晴天に舞う夢アコ&剃刀飛燕ツバキ晴天に舞う夢アコ&剃刀飛燕ツバキ
第3分隊
一心不乱レオナ
夜空に願いをザラ
令嬢の微笑みエル&反撃の班長ナツオ令嬢の微笑みエル&反撃の班長ナツオ
ラインダ○ス第1分隊
晴天に舞う夢アコ
叱咤号令エンマ
月夜の怪盗ロイグ&剃刀飛燕ツバキ
水滴弾けるフィオ&剃刀飛燕ツバキ
水滴弾けるフィオ&剃刀飛燕ツバキ
第2分隊
秘めた思いエリカ
野生の嗅覚レンジ
晴天に舞う夢アコ&反撃の班長ナツオ晴天に舞う夢アコ&反撃の班長ナツオ
第3分隊
雷電魔王クロエ
記憶の糸アカリ
秘めた思いエリカ&死神の狙撃手ローラ
月夜の怪盗ロイグ&美脚一閃リリコ
月夜の怪盗ロイグ&美脚一閃リリコ
snd7***第1分隊
大切な仲間ダリア
夜空に願いをザラ
月夜の怪盗ロイグ&剃刀飛燕ツバキ月夜の怪盗ロイグ&剃刀飛燕ツバキ
第2分隊
秘めた思いエリカ
怒りの制裁ミント
令嬢の微笑みエル&死神の狙撃手ローラ令嬢の微笑みエル&死神の狙撃手ローラ
第3分隊
荒野と大空キリエ
野生の嗅覚レンジ
晴天に舞う夢アコ&反撃の班長ナツオ晴天に舞う夢アコ&反撃の班長ナツオ
いく○ん第1分隊
涙の大掃除リッタ
夜空に願いをザラ
月夜の怪盗ロイグ&剃刀飛燕ツバキ

晴天に舞う夢アコ&反撃の班長ナツオ
晴天に舞う夢アコ&反撃の班長ナツオ
第2分隊
野生の嗅覚レンジ
秘めた思いエリカ
令嬢の微笑みエル&死神の狙撃手ローラ

令嬢の微笑みエル&剃刀飛燕ツバキ
令嬢の微笑みエル&剃刀飛燕ツバキ
第3分隊
晴天に舞う夢アコ
怒りの制裁ミント
晴天に舞う夢アコ&反撃の班長ナツオ

月夜の怪盗ロイグ&美脚一閃リリコ
月夜の怪盗ロイグ&美脚一閃リリコ
改紫電第1分隊
弾ける水滴フィオ
反撃の班長ナツオ
晴天に舞う夢アコ&反撃の班長ナツオ晴天に舞う夢アコ&反撃の班長ナツオ
第2分隊
美しき輝きリガル
パンケーキキリエ
月夜の怪盗ロイグ&剃刀飛燕ツバキ月夜の怪盗ロイグ&剃刀飛燕ツバキ
第3分隊
晴天に舞う夢アコ
美脚一閃リリコ
令嬢の微笑みエル&死神の狙撃手ローラ令嬢の微笑みエル&死神の狙撃手ローラ
わ○さ第1分隊
晴天に舞う夢アコ
大切な仲間ダリア
令嬢の微笑みエル&死神の狙撃手ローラ令嬢の微笑みエル&死神の狙撃手ローラ
第2分隊
荒野と大空キリエ
野生の嗅覚レンジ
晴天に舞う夢アコ&反撃の班長ナツオ晴天に舞う夢アコ&反撃の班長ナツオ
第3分隊
ただいま!ガーベラ
孤高の闇医者カラン
月夜の怪盗ロイグ&剃刀飛燕ツバキ月夜の怪盗ロイグ&剃刀飛燕ツバキ
くん○ろう第1分隊
祈りの操舵士アンナ
月夜の怪盗ロイグ
令嬢の微笑みエル&反撃の班長ナツオ令嬢の微笑みエル&反撃の班長ナツオ
第2分隊
大切な仲間ダリア
野生の嗅覚レンジ
月夜の怪盗ロイグ&剃刀飛燕ツバキ月夜の怪盗ロイグ&剃刀飛燕ツバキ
第3分隊
晴天に舞う夢アコ
野生の嗅覚レンジ
晴天に舞う夢アコ&死神の狙撃手ローラ晴天に舞う夢アコ&死神の狙撃手ローラ
ペドロ○田第1分隊
ただいま!ガーベラ
恋のおみくじ屋リリコ
月夜の怪盗ロイグ&美脚一閃リリコ
令嬢の微笑みエル&剃刀飛燕ツバキ
令嬢の微笑みエル&剃刀飛燕ツバキ
第2分隊
一心不乱レオナ
夜空に願いをザラ
令嬢の微笑みエル&剃刀飛燕ツバキ
晴天に舞う夢アコ&反撃の班長ナツオ
晴天に舞う夢アコ&反撃の班長ナツオ
第3分隊
雷電魔王クロエ
野生の嗅覚レンジ
晴天に舞う夢アコ&反撃の班長ナツオ
月夜の怪盗ロイグ&美脚一閃リリコ
月夜の怪盗ロイグ&美脚一閃リリコ
た○す第1分隊
荒野と大空キリエ
野生の嗅覚レンジ
晴天に舞う夢アコ&反撃の班長ナツオ
晴天に舞う夢アコ&美脚一閃リリコ
晴天に舞う夢アコ&美脚一閃リリコ
第2分隊
姉は強しリッタ
叱咤号令エンマ
令嬢の微笑みエル&剃刀飛燕ツバキ令嬢の微笑みエル&剃刀飛燕ツバキ
第3分隊
雷電魔王クロエ
大切な仲間ダリア
月夜の怪盗ロイグ&反撃の班長ナツオ月夜の怪盗ロイグ&反撃の班長ナツオ

荒野のコトブキ飛行隊 総当たり戦記録(2020.06)

2020.06 に実施された荒野のコトブキ飛行隊総当たり戦の戦闘に関する記録

自身の結果を先にいうと、龍級ランク1のグループで1位となることができた。グループが決まる直前に演習で300位よりも下になってしまったため、龍級ランク0に挑むことができなかったのが悔やまれる

相手の編成からできるだけ高い得点を得るためにトライアンドエラーを繰り返す必要があるこのイベント。時間の許す限り編成を試すことができるので、相手の編成に対してどのようにすれば優位に戦うことができたかを実験できるよい機会でもある。優位にたたくことができる組み合わせについて記録しておき、今後の演習などにも活用していきたい

プレイヤー名については念の為、一部を伏せたり変更したりしている

プレイヤー名編成有利に戦えた編成最高値を出したときの編成
夜刀○第1分隊
雷電魔王クロエ
悪女の報復シアラ
大切なダリア&怒りの制裁ミント
大切なダリア&反撃の班長ナツオ
祈りの操舵士アンナ&歓びの操舵士マリア
祈りの操舵士アンナ&歓びの操舵士マリア
第2分隊
飛行機投げチカ
闇からの叫びエリカ
祈りの操舵士アンナ&恋のおみくじ屋リリコ
雷電魔王クロエ&夜空に願いをザラ
雷電魔王クロエ&恋のおみくじ屋リリコ
雷電魔王クロエ&恋のおみくじ屋リリコ
第3分隊
華麗なる変装ロイグ
野生の嗅覚レンジ
雷電魔王クロエ&夜空に願いをザラ
涙の大掃除リッタ&反撃の班長ナツオ
荒野と大空キリエ&恋のおみくじ屋リリコ
荒野と大空キリエ&夜空に願いをザラ
荒野と大空キリエ&夜空に願いをザラ
Dra○on第1分隊
令嬢の微笑みエル
野生の嗅覚レンジ
雷電魔王クロエ&夜空に願いをザラ雷電魔王クロエ
夜空に願いをザラ
第2分隊
一機団結ユーカ
熱血事件記者サクラ
大切な仲間ダリア&恋のおみくじ屋リリコ
荒野と大空キリエ&恋のおみくじ屋リリコ
荒野と大空キリエ
恋のおみくじ屋リリコ
第3分隊
ただいま!ガーベラ
怒りの制裁ミント
荒野と大空キリエ&反撃の班長ナツオ
いねむり姫ヘレン&反撃の班長ナツオ
大切な仲間ダリア&反撃の班長ナツオ
大切な仲間ダリア
反撃の班長ナツオ
あや○ん第1分隊
太陽の誘惑エンマ
叱咤号令エンマ
雷電魔王クロエ&夜空に願いをザラ雷電魔王クロエ
夜空に願いをザラ
第2分隊
夜風に吹かれてイサカ
味覚の怪盗モア
荒野と大空キリエ&恋のおみくじ屋リリコ荒野と大空キリエ
恋のおみくじ屋リリコ
第3分隊
飛行機投げチカ
夜空に願いをザラ
祈りの操舵士アンナ&歓びの操舵士マリア祈りの操舵士アンナ
歓びの操舵士マリア
YO○E第1分隊
秘めた思いエリカ
穏やかな風ベル
荒野と大空キリエ&恋のおみくじ屋リリコ荒野と大空キリエ
恋のおみくじ屋リリコ
第2分隊
いねむり姫ヘレン
怒りの制裁ミント
雷電魔王クロエ&夜空に願いをザラ雷電魔王クロエ
夜空に願いをザラ
第3分隊
妖艶なる怪盗ロイグ
野生の嗅覚レンジ
大切な仲間ダリア&反撃の班長ナツオ大切な仲間ダリア
反撃の班長ナツオ
ぴ○やま第1分隊
涙の大掃除リッタ
夜空に願いをザラ
荒野と大空キリエ&恋のおみくじ屋リリコ荒野と大空キリエ
恋のおみくじ屋リリコ
第2分隊
烈火の如くキリエ
悪女の報復シアラ
雷電魔王クロエ&怒りの制裁ミント
雷電魔王クロエ&夜空に願いをザラ
雷電魔王クロエ&夜空に願いをザラ
第3分隊
雷電魔王クロエ
心の氷塊シノ
大切な仲間ダリア&夜空に願いをザラ
祈りの操舵士アンナ&歓びの操舵士マリア
祈りの操舵士アンナ&歓びの操舵士マリア
○つし第1分隊
祈りの操舵士アンナ
夜空に願いをザラ
大切な仲間ダリア&恋のおみくじ屋リリコ
荒野と大空キリエ&夜空に願いをザラ
荒野と大空キリエ&反撃の班長ナツオ
荒野と大空キリエ
夜空に願いをザラ
第2分隊
秘めた思いエリカ
涙の大掃除リッタ
雷電魔王クロエ&夜空に願いをザラ
大切な仲間ダリア&恋のおみくじ屋リリコ
雷電魔王クロエ&恋のおみくじ屋リリコ
大切な仲間ダリア
恋のおみくじ屋リリコ
第3分隊
真夜中の悪戯シアラ
夢を抱いてアコ
恐怖の蜘蛛屋敷レミ&反撃の班長ナツオ
恐怖の蜘蛛屋敷レミ&夜空に願いをザラ
恐怖の蜘蛛屋敷レミ
反撃の班長ナツオ
B○ll第1分隊
雷電魔王クロエ
狂犬喝采フィオ
祈りの操舵士アンナ&歓びの操舵士マリア
涙の大掃除リッタ&美脚一閃リリコ
涙の大掃除リッタ&恋のおみくじ屋リリコ
祈りの操舵士アンナ&歓びの操舵士マリア
祈りの操舵士アンナ&歓びの操舵士マリア
第2分隊
姉は強しリッタ
悪女の報復シアラ
恐怖の蜘蛛屋敷レミ&怒りの制裁ミント
恐怖の蜘蛛屋敷レミ&夜空に願いをザラ
涙の大掃除リッタ&恋のおみくじ屋リリコ
涙の大掃除リッタ&恋のおみくじ屋リリコ
第3分隊
祈りの操舵士アンナ
虚像の魔王ニコ
祈りの操舵士アンナ&歓びの操舵士マリア
涙の大掃除リッタ&反撃の班長ナツオ
美脚一閃リリコ&反撃の班長ナツオ
美脚一閃リリコ&反撃の班長ナツオ
○ム第1分隊
荒野と大空キリエ
怒りの制裁ミント
荒野と大空キリエ&反撃の班長ナツオ
涙の大掃除リッタ&美脚一閃リリコ
涙の大掃除リッタ&悪女の報復シアラ
涙の大掃除リッタ&悪女の報復シアラ
第2分隊
魅惑の踊り子ザラ
不思議な遭遇ガーベラ
雷電魔王クロエ&恋のおみくじ屋リリコ雷電魔王クロエ&恋のおみくじ屋リリコ
第3分隊
晴天に舞う夢アコ
竜巻疾風ホタル
祈りの操舵士アンナ&歓びの操舵士マリア
祈りの操舵士アンナ&反撃の班長ナツオ
祈りの操舵士アンナ&反撃の班長ナツオ
○乱雲第1分隊
祈りの操舵士アンナ
歓びの操舵士マリア
荒野と大空キリエ&反撃の班長ナツオ荒野と大空キリエ
反撃の班長ナツオ
第2分隊
大切な仲間ダリア
怒りの制裁ミント
妖艶なる怪盗ロイグ&恋のおみくじ屋リリコ妖艶なる怪盗ロイグ
恋のおみくじ屋リリコ
第3分隊
烈火の如しキリエ
熱血事件記者サクラ
雷電魔王クロエ&夜空に願いをザラ雷電魔王クロエ
夜空に願いをザラ

荒野のコトブキ飛行隊 (新)大争奪戦の戦い方

まえがき

同盟間対戦の新規イベントとして始まった大争奪戦ですが、初回終了後は開発側で見直しが入るほどにプレイヤーの不満を集めてしまい、なんとも残念な形となってしまった。特に、空いた時間に手軽にプレイできるという点に魅力を感じていたプレイヤーから拘束時間が長いという不満が多かったように見受けられる。個人的には同盟内のやり取りが活発になって楽しかったです。

以前の大争奪戦についての記事はこちらになりますので興味があれば御覧ください

あれから4ヶ月近く経った2020年6月、一部仕様を変更した形で大争奪戦が再開された!自分は6/6 22時の枠で参加したので、このときの内容も踏まえつつどのように戦うかについて考えていこうと思う

前提

考察するにあたり以下の状態を前提として話をすすめる。これらに沿わない状況の場合は参考程度に見ていただければと思います。

  • 所属同盟には25~30名が所属しておりその9割ほどがアクティブアカウント
  • 対戦相手となる他の2同盟が結託していない
  • 同盟内のやり取りはゲーム中の掲示板のみ

また、同盟内で高い統率が取れている場合(状況別で戦闘方針が詳細に決められているなど)は以降に書かれている内容が適切ではない可能性がありますのでご注意ください

結論

テキスト読むのしんどいよという方向けに、個人的な戦い方の結論を先に箇条書きにしておくので、ここだけ読んでもらっても大丈夫です。このように考えた経緯も知りたいという方はそのまま読み進めてください。

  1. 参加人数をできるだけ揃える
  2. AP, CPは積極的に消費していく
  3. イベント終了11分前に防衛拠点を落とす
  4. 防衛拠点有利色より中継拠点有利色を優先して編成を組む
  5. 相手同盟の中継拠点と隣接する自同盟の中継拠点に積極的に編成配置をする(NPCをできるだけ戦わせない)
【Amazon.co.jp限定】荒野のコトブキ飛行隊 Blu-ray BOX(上下巻セット/発売日順次お届け)(セット購入特典:描き下ろし全巻収納BOX(キリエ・チカ・隼一型【キリエ機】)+コトブキ飛行隊フラッグ(B1サイズ)付き)

仕様の変更内容について

前回の仕様と比較して異なる点で、戦い方にに大きく影響がありそうな点は以下の通り

項目初回時の仕様新仕様
イベント開催期間36時間1時間
AP回復間隔・回復量6時間毎に+305分毎に+15
AP初期値3015
AP最大値6075
中継拠点の準備中時間30分1分
防衛拠点の準備中時間60分10分
中継地点の獲得争奪ポイント1500ポイント1000ポイント
防衛拠点の獲得争奪ポイント10000ポイント7500ポイント

また、中継拠点に出撃する際にAPを30消費してすべての色のパイロットに能力上昇効果50%を付与する”ブースト”を使用することができます(もともとの有利色能力上昇効果は重複しない)。どうしても倒せそうにない空域がある場合はブーストを使用して挑むといったことが可能となる。これは育成が間に合っていないプレイヤーへの救済措置と考えられるので、使用しないで済むならそれに越したことはない

大争奪戦の争奪ポイントについて整理

前回の記事と同様に、まずは大争奪戦の勝利条件となる争奪ポイントについて整理する

勝利条件について

3同盟と争う大争奪戦は争奪ポイントによって同盟の順位が決められる。この争奪ポイントが変動するタイミングは以下の2つある。

  1. プレイヤーの行動による争奪ポイントの加算
  2. 拠点獲得による争奪ポイントの移動

この2種の争奪ポイントの合計で相手同盟を上回ることができれば見事1位を獲得することができる。1. のポイントについては自動目以内でコントロールできる範囲では約54,000ポイント得ることはでき、ここまで獲得することは非常に困難であるものの、自同盟からの攻撃で8割勝つようにいどめば 43,200 ポイントは十分に狙える

また、拠点獲得による争奪ポイントはすべての拠点を確保した場合、初期ポイントに加えて54,000ポイント獲得できる。この内半分以上(3,0000ポイント)を4つの防衛拠点のポイントが占めるため、防衛拠点を確保した状態でいかにしてゲーム終了に持ち込むかというのが戦略のポイントとなる

プレイヤーの行動による争奪ポイントについて

プレイヤーの行動による争奪ポイントは、以下のような3種のポイントが合算されたもの

  • 自同盟のAP消費の行動により獲得できるポイントは多くて約54,700ポイント
  • 自同盟の編成配置により獲得できるポイントは最大で750ポイント
  • 相手同盟の行動により獲得できるポイントは多くて54,000ポイント

相手同盟の行動については制御ができないため、自同盟のAP消費による行動でできるだけ負けないように振る舞うというのがセオリーになってくるだろう。同盟内で強いプレイヤーは、相手同盟の中でも強い相手をできるだけ倒し、他のメンバーが倒しやすい相手を残してあげることで、同盟全体の争奪ポイントの向上が見込める

以下は数値の根拠であるが、未確認の部分もあるため正しい数値と異なるかもしれません

1プレイヤーあたり獲得できるAPは最大180, 30名で5,400
  初期値30 + 5分毎に15 × 11回 = 180

すべての中継拠点出撃で勝利した場合に獲得できる争奪ポイント
 5400AP ÷ 10(1回あたりの消費AP) × 100ポイント = 54000ポイント

相手同盟の防衛拠点への出撃で獲得できる争奪ポイント(1度にすべて撃墜した場合)
(100ポイント + 42(撃墜数) × 2ポイント) × 4 = 736ポイント

自同盟で配置が可能な編成数
 30人 × 5編成 = 150編成
配置により獲得できるポイントの最大値は
 150編成 × 5ポイント = 750ポイント

相手同盟からの攻撃に対してすべて相手が敗北となった場合
 5400AP × 2チーム ÷ 10(1回あたりの消費AP) × 50ポイント = 54000ポイント
ただし、自同盟の攻撃がすべて勝利とするためには
相手同盟に中継拠点を取り返してもらわないと攻撃対象がなくなるため
相手同盟の攻撃がすべて敗北となることはありえない

一度確保した相手同盟の防衛拠点を相手同盟に取り返され
再度取り返す場合に加算される撃墜数によるポイントは複雑になるため今は考えない

自同盟の防衛拠点の防衛により得られるポイントについて今回は攻撃されなかったとして計算しない

NPCの自動配置によりポイントが発生しないものとしている
配置の変更のたびにポイントが発生しないものとしている

拠点獲得による争奪ポイントの移動について

プレイヤーの行動によって得られる争奪ポイントの加算とは異なり、相手同盟拠点の確保はポイントの移動となるため、相手の争奪ポイントを減らす事ができる。また、1拠点あたりのポイント変動が大きいため、ゲーム終了時にどのように拠点を確保した状態にするかが重要になる

特に、防衛拠点は1つで7中継拠点を超える点数が移動するため、相手同盟の防衛拠点を、ゲーム終了時にいかにして確保するかが大争奪戦の大きなポイントとなる

仮に、相手同盟のすべての拠点を確保できた場合のポイントは54,000ポイントとなる

24中継拠点 × 1,000ポイント = 24,000ポイント
4防衛拠点 × 7,500ポイント = 30,000ポイント

参加人数をできるだけ揃える

言うまでもないことではあるが参加人数は多いほど同盟内で活用できるAPが増えるため当然有利となる。3同盟がすべてのAPを使い切り、すべての出撃で勝利したと仮定すると、プレイヤーの行動による争奪ポイントは参加人数が多い方が高くなる。

また、操作する人数が少ないと、空域への編成配置を行うプレイヤーが偏ってしまい、CPの消費が偏るといったデメリットもある。防衛拠点を攻めたいときにCPがたりなくて攻められないといった状況が生まれやすい。

AP, CPは積極的に消費していく

これは2020年6月6日に実際にプレイしたことでわかったことではあるが、同じ同盟内のプレイヤーの中には様子見をしているうちに戦況が目まぐるしく変わり、APを消費しきれなかったという声をイベント終了後に聞いた。かく言う自分も、APは消費しきっていたものの、CPは100以上余らせてしまう状態となっていた。

AP の最大値を超えてしまいそうになった場合は、どの中継地点でも良いので勝てそうな空域に出撃させて消費しておこう。APを消費できなかった場合、1APあたり10ポイント分の損失が発生すると考えよう。

CPは防衛拠点での挑戦待機時間リセットに積極的に使えおう

CPについては、防衛拠点を落とすために積極的に消費することをおすすめしたい。CPの利用用途としては以下の2つ

  1. 防衛配備(10CP)
  2. 防衛拠点での挑戦待機時間リセット(30CP)

CPは仕様上、よく攻められる(中継拠点で狙われる)プレイヤーに多く集まる傾向がある。再配置も多く発生するとは思うが、それよりも防衛拠点での挑戦待機時間リセットに活用するのが良いだろう。防衛拠点を確保できれば中継拠点7つ分以上のポイントが稼ぐことができる。そのため、中継拠点への配置を後回しにしてでも防衛拠点を落とすためにCPを使っていこう。

イベント終了11分前に防衛拠点を落とす

7,500ポイントが変動する防衛拠点は、イベント終了時には1つでも多く確保した状態でイベント終了を迎えたい。そのためには、イベント終了間際に相手同盟が防衛拠点を攻撃できない状態にすればよい。防衛拠点のステータスの中で、相手同盟からの攻撃を受けない時間帯「準備中」があるので、これを最大限利用する。

防衛拠点を確保したあと10分は準備中のステータスとなり、相手同盟からの攻撃を受け付けない状態となる。イベント終了の11分前に確保することができれば、防衛拠点はほぼ確実に確保した同盟のものとなる

注意したい点として、拠点の状態が「準備中」の場合、獲得争奪ポイントの加算対象外となるため、イベント終了10分前以降に確保してしまうと防衛拠点のポイントは手に入れられない。相手のポイントを下げるという意味では有効なので悪くはないが、できれば自同盟のポイントとするためにも11分前には確保しておきたい

同様に、中継拠点も確保したあと60秒の準備中ステータスがあり相手同盟からの攻撃は受けないので、イベント終了の2分前に確保することでポイントに繋げやすくなる

当然、相手同盟も同様のことを狙ってくるはずなので、防衛拠点に隣接する中継拠点、防衛拠点までの経路は重要な攻撃・防衛のポイントになる

中継拠点有利色を優先して育成する

編成において悩まされるポイントとしては、中継拠点と防衛拠点の有利色、5編成の戦力配分になるかと思います。相手同盟との交戦によりポイントが入るということを考えると、中継拠点有利色のキャラクターを優先的に育成するのをおすすめします

また戦力配分ですが、分散させるよりは防衛として強力な編成を1つ用意するほうが効果的と思います。倒しにくい編成が1つあれば相手はブーストを使わざるを得なくなり、APを消費させることに繋がります。また、相手を倒した場合の争奪ポイントも期待できるでしょう。

相手同盟の中継拠点と隣接する自同盟の中継拠点に積極的に編成配置をする(NPCをできるだけ戦わせない)

上の話と重複しますが、中継拠点の有利色を考慮した編成を用意したら、積極的に相手同盟の中継拠点に隣接する自同盟の中継拠点に配置していきましょう。

相手同盟からの攻撃でたとえ敗北したとしても、争奪ポイントは加算されます。NPCが配置されていた場合、自同盟の合計には争奪ポイントが入るかもしれないですが、個人の争奪ポイントには加算されません。任務や同盟内貢献度ランキングと言った仕組みもあるので、できるだけ配置をおこない、争奪ポイントを獲得しておくと良いと思います。

Figuarts mini 荒野のコトブキ飛行隊 キリエ&隼一型 (キリエ仕様) 約130mm PVC&ABS製 塗装済み可動フィギュア

終わりに

自分も手探りの状態ではあるので、数値など記載内容に誤りがあるかもしれません。もし気づいたことなどありましたら Twitter などでお伝えいただけますと助かります。ここまで読み進めてくださった方、ここまで読んでいただき本当にありがとうございます。ここから先はまた個人的感想についてつらつらと書きます。

密な1時間でした

指定の1時間のみのイベントということもあり、始まる10分前くらいからそわそわしていました。自分は役に立てるだろうか、相手はどれぐらい強いのだろうか、そんな事を考えつつルールを何度も見返したりしていたかと思います。

そしていざ始まってみると、目まぐるしく戦況が変わっていき、自同盟のリーダーも状況把握と指示を出すことにとても苦労していたように感じました。自分もただ待つだけではAPが無駄になってしまうので、攻め落とされたところをすぐに取り返したり、相手防衛拠点までの経路になりそうな中継拠点を攻めたりしていましたが、負けると相手に多くポイントが入ると考えてしまうと、緑で染まった相手に挑むことを避けてしまい味方に負担をかけていたんだろうなと今では思います。

大争奪戦の結果としてはお相手に常に押し込まれる形となり、今はまだ集計中ですが3位になるものと思います。終了間際に防衛拠点が落とされるかどうかが本当に鍵になりますね。

チャットが普段よりも活発になり、同盟内での一体感がより高まったと感じていますが、参加できなかった場合は同盟に負担をかけてしまったなとネガティブに考えてしまうかもしれません。今後もできるだけ参加できるようにスケジュール管理していきたい所存です。

次回の大争奪戦もすぐにやってくるので、今のうちに有利色のキャラクターを一人でも多く育成しておかなければ!

Discord からの音声を OBS にのせて配信する環境の設定

ニコニコ動画で「テイルズオブヴェスペリアしながらテイルズ談義」というゲーム配信をしております

第2回のTOV実況配信において配信環境の設定周りであれこれ苦戦したので、備忘録がてら最終的に落ち着いた設定についてこちらに記録しておく

ハードウェア構成

ハードウェアの構成は以下のように、デスクトップ中のキャプチャボードに Switch からの HDMIケーブルを入力としてPCに映像を取り込むとともに、自分がプレイするためのディスプレイに出力するHDMIケーブルがあります。

キャプチャボードとして使用しているのは”Live Gamer HD 2 – C988″というデスクトップ内に収めるもので、プレイしながらでも録画・配信ができるパススルー出力機能がついています。分配器も考えたのですが、必要になるケーブルが増えるのも雑多になってしまうのでパススルー出力機能があるものを選択しています。実際にSpratoon2なども配信しながらプレイしていますが、気になるような遅延は発生していません。

ソフトウェア構成

続いてソフトウェア的な部分ですが、以下の内容を満たす環境を用意しなければなりません。

  1. 配信映像の入力
    1. ゲームの映像(キャプチャボードからの映像出力)
  2. 配信音声の入力
    1. おだじゅんのマイク入力
    2. しっぽらさんのDiscordからの音声
    3. ゲームの音声(キャプチャボードからの音声出力)
  3. Discord でしっぽらさんにゲーム画面を共有する
  4. デスクトップからの以下の音が配信されないようにする
    1. Discordで共有しているゲームの音声
    2. ブラウザからの音声(ニコニコの配信画面からの音など)

上記の1~3の部分を使用するソフトウェアを用いて図示したものが以下になります

配信に使用しているソフトウェアは OBS です。キャプチャボードに付随してついていたRECentral も使えそうではあるのですが、Discordでゲーム画面を共有した際に映像が乱れてしまったため使用を見送りました。

各種設定について

上記環境を実現するための具体的な設定をOBS, Discord それぞれについて書いておきます

OBSの設定

入力ソースとして4種設定しています。

Discord

PCのスピーカーを入力として設定し、Discordの音声(しっぽらさんの音声)を受け取ることができる状態にしています

映像キャプチャデバイス

ゲームの映像を入力として受け取るための項目になります。キャプチャボードとなる AVerMedia のデバイスが選択されており、ゲームを起動すればOBS上でゲーム画面が確認できる状態であれば問題ないです

マイク

おだじゅんの音声を入力として受け取るための項目になります。ヘッドセットのマイクが選択されている状態です。

ゲーム音

ゲームの音声を入力として受け取るための項目になります。キャプチャボードとなるAVerMedia のデバイスが選択されており、ゲームを起動すると OBSから音声が確認できれば大丈夫

これらはOBSに加える入力でしたが、不要な省くための設定が必要になります。音声ミキサーの項目にある、デスクトップ音声のスピーカーアイコンをクリックし、ミュートの状態(赤くばつ印がついた状態)にしておきます。これにより、PCからの不要な音声を省くことができます

しっぽらさんに Discord の配信機能をつかってゲーム画面をシェアするとき、OBSのゲーム入力を配信することになるのですが、これまでの設定のみでは、ゲーム音が伝わらない状態となっています。ゲーム音を流すために必要な設定を追加します。

音声ミキサーの中にある歯車のマークをどれでもよいのでクリックしてメニュー項目を開き、その中のオーディオの詳細プロパティを開きます

ゲーム音の「音声モニタリング」の項目から「モニターと出力」というのを選びます。

Discord の設定

Discord で設定する項目は「ユーザ設定」の「音声・ビデオ」中にある、「入力デバイス」と「出力デバイス」になります

それぞれを以下の図のように、Default, スピーカーを指定するようにしてください。

やり残していること

ここまでで、満たしたい項目の1~3はできているのですが、実は4の項目は不十分だったりします。Discord からしっぽらさんの音声だけではなく、配信しているゲームの音声も入っているため、ゲーム音が2重になっているのです。配信中ゲーム音が比較的小さくなっていることもありあまり目立たないのですが、じっくり聞くと微妙にエコーが掛かったような違和感のあるゲーム音になっています。Discordのしっぽらさんの音声と、Discordからのゲーム音を分離することができればよいのですが、ひとつのDiscordの出力となってしまっており、分離できないのが現状です

このあたり、まだ課題が残っているので今後の配信の中で解決の糸口を探っていきたいと思います。今後配信を始める誰かの参考にでもなれば幸いです。

TOV実況第2回放送舞台裏

舞台裏はトラブルが起こるたびに書かれるのです。
これが書かれているということは・・・察してくれ(´・ω・`)

前回はしっぽらさんにおだじゅんが操作している画面のシェアができないというトラブルがあり、結局しっぽらさんにはニコニコ動画の配信画面を見てもらいながらテイルズ談義をするという、ほぼ放送事故な状態でした。

今回、同様のトラブルはでなかったので Discord ごしにしっぽらさんはおだじゅんの操作している画面をほぼリアルタイムにみることができたのですが、Discord で話している音声がループして入り続けるという状態に陥りました。さらに、開始してコメントで指摘を受けるまで、おだじゅんの音声は配信されていないという状態。まぁパニックですよね(;゚∀゚)

配信開始前10分程度のやりとりも録画されていたので、また切り出してみました。おだじゅんの音声が入っていないですが、実際はDiscordでみんなとやり取りしています。何を言っているか想像しながら聞いてみてください。前回と同様、おだじゅんとしっぽらさんに加えて、あらさん、つっしーのテイルズ雀士がゲスト参戦しています。

まぁなんとか開始してから数分で状態を改善させることができ、大きなトラブルとなることもなく2回目を終了させることができました。

2回目の内容としては大まかに以下の通り
・花の街ハルルで置いてけぼりカロルくんと改めて合流し「クサッ」で素材集め
・ハルルの樹を治し麗美なアニメーションを拝む
・アスピオでリタと合流し、シャイコス遺跡でリタの名言を拝聴
・エフミドの丘でリタの笑顔の謝罪をめでる

画像

前半は加入したばかりのカロルの言動や仕草、ハルルのアニメーションの話題があり、後半は新しく合流するリタに関する話題が多かったですね。リタの家でエステルが見たものが何なのか知りたい・・・

今回あまり話を広げたり、掘り下げたりすることが前回に比べてできなかったなぁと終わったあとにしっぽらさんとも話していました。まぁ今回出てくる街やダンジョンが、ゲーム以外のメディアであまり舞台として取り上げられていないというのもあり、少し広げにくかったというのも否めません。次回以降はもう少し話を広げていければと思っております。

これでもかというぐらいダウンロードコンテンツでレベルを上げ、戦闘はあまり時間がかからないようにしたつもりですが、それでも時間はかかってしまいました。エフミドの丘を超えたところまで予定してたんですけどね。あっという間に2時間半がすぎてしまった。今度はホーリーボトルも使いつつ、サクサクと話を進めていきたいものです。

視聴してくださった方、コメントしてくださった方、広告してくださった方、皆さん本当にありがとうございます。少しでも楽しんでいただければ幸いです。

次回はみんな大好きガットゥーゾ先生との戦闘から、ラゴウの屋敷あたりを予定しています。パティやおっさんの登場も待ち遠しい。

Druid PDF資料についてのメモ

まえがき

Apache Druid を利用する機会ができたので、まずはドキュメントとか参考資料でインプットを増やしてる。これはその1つの資料として “Druid” A Real-time Analytical Data Store をざっと読んだ際の記録となる

読む目的としては Druid というものがそもそもどういうモチベーションで作られたもので、どういったシチュエーションでパフォーマンスを発揮するものなのか、どういったことが苦手なのかというのを理解すること

資料読メモ

Abstract

  • Druid とは大規模データセットのリアルタイム探索分析のために設計されたオープンソースのデータストア
  • カラム指向のストレージレイアウト、分散型のシェアードナッシングアーキテクチャ、先進的なインデックス構造を組み合わせている
  • 10億行のテーブルを1秒以下のレイテンシで任意に探索できるようになっている
  • この論文では、高速な集約、柔軟なフィルタ、低遅延データインジェストをどのようにサポートしているかを詳細に説明する

1.INTRODUCTION

  • Hadoop は大量なデータを保存しアクセスすることに優れている。これに対して以下の点に難がある
    • どれだけ速くそのデータのアクセスするかについては性能が保証されていない
    • 同時実行時の負荷が大きい場合にパフォーマンスが低下する
    • データを ingest (データの取得・取り込み)してすぐに読めるようにするためには最適化されていない
  • 同時並行性の高い環境(1000人以上のユーザー)でクエリのパフォーマンスとデータの可用性を製品レベルで保証している企業としては、Hadoopではニーズを満たすことができない
  • 当時のオープンソースでは要件を十分に満たすものがないため、オープンソースの分散型カラム指向リアルタイム分析データストアであるDruidを開発することにした

ここで話されているデータの取得(ingestion)というのは、イベント発生からクエリによって集計できるまでの間を指している

2.PROBLEM DEFINITION

  • 以下の要求を満たす必要がある
    • クエリのレイテンシは1秒以内
    • マルチテナントで可用性の高いシステム
    • 同時進行性の高い環境
    • できるだけダウンタイムのない環境
    • ユーザーとアラートシステムが「リアルタイム」でビジネス上の意思決定を行えるようにする

3.ARCHITECTURE

  • Druid は異なるタイプのノードで構成され、異なるノードタイプは互いに独立して動作し、ノード間の相互作用は最小限に抑えられている。これによりクラスタ内の通信障害がデータの可用性に与える影響は最小限になっている
  • Druid という名前はゲームで出てくる Druidクラス(shape-shifter)に由来する

3.1Real-time Nodes

  • data ingest とイベントストリームのクエリの機能をカプセル化しており、このノードを経由してインデックス化されたイベントは、すぐにクエリに利用できまる。
  • 小さな時間範囲のイベントのみを扱い、定期的にこの小さな時間範囲で収集したイベントのバッチをDruid クラスタ内の他のノードに渡す。
  • Druid クラスタとの連携のために Zookeeperを利用しており、Zookeeper にオンライン状態であることと提供するデータについて知らせる
  • すべての着信イベントのためのインメモリインデックスバッファを保持します。これらのインデックスは、イベントがインジェストされるとインクリメンタルに生成され、インデックスは直接クエリ可能
  • ヒープオーバーフローの問題を回避するために、定期的に、または最大行数に達した後に、インメモリインデックスをカラム指向のストレージ形式に変換してディスクに永続化する
  • パーシステッドインデックスをオフヒープメモリにロードして照会できるようにする
  • 定期的に ローカルに永続化されたすべてのインデックスを検索 するバックグラウンドタスクが走り、インデックスをマージして一定時間に ingect したすべてのイベントを含む不変のデータ・ブロックが作成される。これを segment という
  • handoff の段階ではこのセグメントを恒久的なバックアップストレージ(S3, HDFS など Druid では deep storage とよんでいるもの)にアップロードする
図3: リアルタイムノードは、イベントをインメモリインデックスにバッファリングし、定期的にディスクに永続化します。定期的に、永続化されたインデックスはマージされてからハンドオフされます。クエリは、インメモリインデックスとパーシステッドインデックスの両方にヒットします。

3.1.1 Availability and Scalability

  • 耐障害性について
    • ノードがディスク(データ)を失っていない場合は、ディスクから永続化されたインデックスのリロードをし、オフセットからイベントを読み続けることで復旧可能。回復に必要な時間としても数秒程度。
    • 複数のリアルタイムノードがイベントを読み込める単一のエンドポイントとして機能するため、 イベントのレプリケーションを作成することと同義。そのため、 ノードが完全に故障してディスクを失うシナリオでは、レプリケートされたストリームによってデータが失われることはない
  • スケールについて
    • 複数のリアルタイムノードがそれぞれストリームの一部をインジェストするようにデータストリームを分割することができるので、 追加のリアルタイムノードをシームレスに追加することができる。
    • 実績として 約500MB/s(150,000イベント/sまたは2TB/hour)の生データを消費することが可能

3.2 Historical Nodes

  • リアルタイムノードによって作成された segment のロードおよび提供する機能をカプセル化している。多くのワークフローにおいてDruidクラスタにロードされるデータの大部分は不変であるため、ヒストリカルノードがDruidクラスタのメインワーカーとなる
  • ヒストリカルノードは sharednothing アーキテクチャを採用しており、ノード間で競合する単一のポイントは存在しない。機能的には単純で、不変セグメントのロード、ドロップ、サーブのみ。
  • オンライン状態であることと提供しているデータをZookeeperに通知する 。
  • セグメントのロードとドロップの指示は Zookeeper を介して送信され、セグメントがディープストレージ内のどこにあるか、セグメントを処理する方法などの情報が含まれている。
  • セグメントに関する情報がキャッシュに存在しない場合、ヒストリカル・ノードは、ディープ・ストレージからセグメントをダウンロードし始める。 処理が完了すると、セグメントはZookeeper内で通知され問い合わせ可能となる
  • ローカルキャッシュを使用することで、履歴ノードを迅速に更新して再起動することができる。起動時に、ノードはキャッシュを検査し、見つけたデータをすぐに利用可能な状態とする。
  • 不変データのみを扱うため、読み取りの一貫性をサポートすることができ、不変データブロックはまた、単純な並列化モデルを可能にする。ヒストリカルノードは、ブロッキングすることなく不変ブロックを同時にスキャンして集約することもできる。
図5: ヒストリカルノードは、ディープストレージからセグメントをダウンロードします。セグメントは、クエリを実行する前にメモリにロードされている必要があります。

3.2.1 Tiers

  • ヒストリカルノードは異なる階層にグループ化することができ、特定の階層のすべてのノードが同じように構成される。階層ごとに異なるパフォーマンスとフォールトトレランスパラメータを設定できる。
  • 階層化ノードの目的は、優先度の高いセグメントや低いセグメントを重要度に応じて分散できるようにすること

3.2.2 Availability

  • ヒストリカルノードは、セグメントのロードおよびアンロード命令を Zookeeper に依存しており、Zookeeper が使用できなくなると新しいデータを提供したり、古いデータを削除したりすることができなくなるが、クエリーは HTTP で提供されるため、現在提供しているデータに対するクエリー要求に応答することはできる
  • Zookeeper の停止がヒストリカルノードの現在のデータ可用性に影響を与えることはないと書いてあるが、0.18.0 のバージョンでは Zookeeper の停止によりDruid も停止となるように修正されている

3.3 Broker Nodes

  • Broker ノードは、ヒストリカルノードやリアルタイムノードへの問い合わせルータとして動作する
  • Zookeeper で公開されているメタデータを確認し、どのセグメントがクエリ可能で、そのセグメントがどこにあるかを知る
  • クエリが適切なヒストリカルノードまたはリアルタイムノードにヒットするように、受信したクエリをルーティングし、ヒストリカルノードとリアルタイムノードからの部分的な結果をマージして、最終的な統合結果を呼び出し元に返す。

3.3.1 Caching

  • Brokerノードは、LRU [31, 20]の無効化戦略を持つキャッシュを含む。キャッシュはローカルのヒープメモリを使用するか、Memcached [16]のような外部分散型のキー/値ストアを使用することができる
  • キャッシュに存在しない結果については、ヒストリカルノードとリアルタイムノードにクエリを転送する。ヒストリカルノードが結果を返すと、Broker はこれらの結果をセグメントごとにキャッシュし、将来の使用に備える
  • リアルタイムデータは永続的に変化しており、結果をキャッシュすることは信頼性がないため、リアルタイムデータは決してキャッシュされない。リアルタイムデータへのリクエストは常にリアルタイムノードに転送されます。
  • すべてのヒストリカルノードが故障した場合でも、キャッシュに結果が既に存在する場合は結果を返すことができる

3.3.2 Availability

(Zookeeper が死んでも提供できる旨が書かれているが、0.18.0 で Zookeeper と疎通が取れない場合は Druid のプロセスを停止させるようになっているため、このあたりは最新のドキュメントを参考にするのが良さそう)

3.4 Coordinator Nodes

  • コーディネーターノードは、主にヒストリカルノードでのデータ管理や配信を担当しており、ヒストリカルノードに新しいデータのロード、古いデータのドロップ、データの複製、ロードバランスのためのデータの移動を指示する。
  • セグメントに新しいセグメントによって最新とは異なったデータが含まれている場合、その古いセグメントはクラスターから削除される。
  • リーダー選出プロセスを経て、コーディネータ機能を実行する1つのノードを決定し、残りのコーディネータノードは冗長バックアップとして機能する。
  • コーディネータノードは定期的にクラスタの現在の状態を予想されるクラスタの状態と実行時のクラスタの実際の状態を比較して判断する
  • 現在のクラスタ情報のために Zookeeper 接続をもつ。また、追加の運用パラメータや設定を含む MySQL データベースへの接続ももつ
  • MySQL データベースにある重要な情報の 1 つは、ヒストリカルノードがサービスを提供するすべてのセグメントのリストを含むテーブル。このテーブルは、リアルタイムノードなど、セグメントを作成するサービスによって更新される。MySQL データベースには、セグメントがクラスタ内でどのように作成、破棄、複製されるかを管理するルールテーブルも含まれている

3.4.1 Rules

  • ヒストリカルノードのセグメントに対して、どのようにクラスタからロード、ドロップするかを定めたもの。セグメントを異なるヒストリカルノード層にどのように割り当てるか、また、各層にセグメントのレプリケートが何個存在するかも示す
  • セグメントをクラスタから完全に削除するタイミングを示すこともできる(以下は例)
    • 最新の1ヶ月分のセグメントを「ホット」クラスタにロード
    • 最新の1年分のセグメントを「コールド」クラスタにロード
    • 古いセグメントはすべて削除
  • コーディネータノードは、MySQLデータベースのルールテーブルからルールのセットをロードする
    • ルールは特定のデータソースに固有のものでも、デフォルトのルールセットが設定されていてもよい。コーディネータ・ノードは、利用可能なすべてのセグメントを順番にそのセグメントに適用される最初のルールと一致させる

3.4.2 Load Balancing

  • クラスタの負荷が過度に不均衡にならないようにセグメントをクラスタ間で分散させる必要がある。 クラスタ間でセグメントを最適に分配し、バランスをとるために、セグメントデータのソース、再帰性、サイズを考慮に入れたコストベースの最適化手順を開発した(アルゴリズムについてはここでは話さない)

3.4.3 Replication

  • 異なるヒストリカルノードに同じセグメントのコピーをロードするように指示することができる。高いレベルの耐障害性を必要とする場合、レプリカの数を多く設定することができる。
  • 複製されたセグメントはオリジナルと同じように扱われ、同じ負荷分散アルゴリズムに従う。セグメントを複製することで、単一の履歴ノードの障害はDruidクラスタ内で透過的になり、ソフトウェアのアップグレードなどに利用できる。

3.4.4 Availability

  • コーディネータノードは、Zookeeper と MySQLと連携している
    • Zookeeper :クラスタ内にどのような履歴ノードが既に存在しているかを判断しており、Zookeeper が利用できなくなると、コーディネーターはセグメントの割り当て、バランス、およびドロップの指示を送信できなくなるが、これらの操作はデータの可用性には全く影響はない
    • MySQL:MySQL がダウンした場合、MySQL上のセグメントのメタ情報はコーディネータノードから利用できなくなる。しかしこれはデータ自体が利用できないという意味ではない。コーディネータノードがMySQLと通信できなくなると、新しいセグメントの割り当てを停止し、古くなったセグメントを削除する。ブローカーノード、ヒストリカルノード、およびリアルタイムノードは、MySQL が停止している間も照会可能

4. STORAGE FORMAT

  • Druidのデータテーブル(データソースと呼ばれる)は、タイムスタンプの付いたイベントの集合体であり、セグメントのセットに分割され、各セグメントは通常500万~1,000万行になる。正式には、セグメントをある期間に渡るデータの行の集合体と定義する。セグメントはDruidの基本的なストレージユニットを表し、レプリケーションと配布はセグメントレベルで行われる
  • データ分配ポリシー、データ保持ポリシー、および第一レベルのクエリ・プルーニングを簡素化する方法として、常にタイムスタンプ・カラムを必要としている
  • データソースを明確に定義された時間間隔(一般的には1時間または1日)に分割し、さらに他の列の値を分割して、希望のセグメ ントサイズに収めることができる
  • セグメントは、データソースの識別子、データの時間間隔、新しいセグメントが作成されるたびに増加するバージョン文字列によって一意に定まる
  • バージョン文字列はセグメントデータの新しさを示し、バージョンが古いセグメントよりも、バージョンが新しいセグメントの方が(ある時間範囲内で)新しいデータであることを示す
  • セグメントはカラムナーベースで保存される
  • LZF [24] 圧縮アルゴリズムを基本的には使用

4.1 Indices for Filtering Data

  • Druidは、特定のクエリ・フィルタに関連する行のみがスキャンされるように、文字列列用の追加のルックアップ・インデックスを作成する
  • Druid ではビットマップ圧縮アルゴリズムとしてConciseアルゴリズム[10]を使用することを選択した

4.2 Storage Engine

  • Druidのパーシステンスコンポーネントでは、異なるストレージエンジンを接続することができる
  • これらのストレージエンジンは、JVMヒープのような完全なインメモリ構造でデータを保存したり、メモリマップされた構造でデータを保存したりする
  • デフォルトでは、メモリマップされたストレージエンジンが使用されるが、パフォーマンスが必要な場合は、高価ではあるがインメモリ・ストレージ・エンジンを使用することもできる
  • メモリマップド・ストレージ・エンジンを使用する場合、Druid はセグメントをメモリの中に入れたり出したりする際にオペレーテ ィング・システムに依存する
  • メモリマップ型ストレージエンジンを使用した場合の主な欠点は、クエリの実行時に、あるノードの容量を超えて多くのセグメントをメモリにページする必要がある場合、セグメントをメモリ内でページングしたり、メモリ外でページングしたりするためのコストに悩まされる点

5. QUERY API

  • Druidは独自のクエリ言語を持ち、POSTリクエストとしてクエリを受け付ける。ブローカー、ヒストリカル、リアルタイムノードはすべて同じクエリAPIを共有している。
  • POSTリクエストの本文は、様々なクエリパラメータを指定したkey-valueペアを含むJSONオブジェクト。典型的なクエリには、データソース名、結果データの粒度、対象の時間範囲、リクエストのタイプ、集約するメトリクスが含まれ、結果は期間にわたって集約されたメトリクスを含む JSON オブジェクトになる
  • 執筆当初、Druid用の結合クエリはまだ実装されていない(0.18.0 で実装された)。 組織にとって実装コストは投資に見合うものではないという選択をしたため

6. PERFORMANCE

  • 2014年初頭の時点でMetamarketsで運用されているメインの運用クラスタの数値
  • 他のデータベースとの比較のために、TPC-Hデータ上での合成ワークロードの結果も掲載

6.1 Query Performance in Production

  • Druidクエリのパフォーマンスは、発行されるクエリによって大きく変化する
  • 実運用のDruidクラスタにおけるクエリの平均レイテンシを示すために、最もクエリされたデータソースの中から8つを選択し計測した
  • パフォーマンス
    • クエリの平均レイテンシは約550ミリ秒
    • 90%のクエリが1秒未満で返されている
    • 95%のクエリが2秒未満で返されている
    • 99%のクエリが10秒未満で返されている

6.2 Query Benchmarks on TPC-H Data

  • Druid のほうが断然速いという内容以外特に特筆することはなし
  • MySQL側の実行エンジンとして MyISAMを使用してたのは気になる(執筆当時はまだあるが、2020-04 だと InnoDBが主流)

6.3 Data Ingestion Performance

  • Druidのデータインジェストのレイテンシは、インジェストされるデータセットの複雑さに大きく依存する。データの複雑さは、各イベントに含まれるディメンジョンの数、各イベントに含まれるメトリクスの数、およびそれらのメトリクスで実行したい集計の種類によって決まる。
  • 最も基本的なデータセット(タイムスタンプ列のみを持つデータセット)では、800,000イベント/秒/コアの速度でデータをインジェストできますが、現実のデータセットは決してこれほど単純ではない。
  • スループットを、リアルタイムノードがインジェストし、クエリ可能なイベントの数と定義
  • あまりにも多くのイベントがリアルタイムノードに送られた場合、リアルタイムノードがそれらのイベントを受け入れる余裕ができるまで、それらのイベントはブロックされる。本番環境で測定したピークインジェストレイテンシは、Amazon cc2.8xlarge インスタンスを実行している30のディメンションと19のメトリクスを持つデータソースで22914.43イベント/秒/コア

7. DRUID IN PRODUCTION

  • QueryPattern
    • 探索的なユースケースでは、1人のユーザーが発行するクエリの数は多くなる。
    • 探索的なクエリでは、結果を絞り込むために同じ時間範囲のフィルタを段階的に追加することがよくあり、最近のデータの短い時間間隔を探索する傾向がある。
    • レポートを生成するユースケースでは、ユーザーはより長いデータ間隔でクエリを行うが、これらのクエリは一般的に数が少ない
  • Multitenancy
    • 負荷の高い同時実行クエリは、マルチテナントでは問題となりえる。
    • 負荷の高いクエリにより実行できないクエリが出ることへの対応として、クエリの優先順位付けを導入した。
    • 各ヒストリカルノードは、スキャンする必要のあるセグメントに優先順位をつけることができる
    • かなりの量のデータに対するクエリは、レポーティングのユースケースのためのものである傾向があり、優先順位を下げることができる。このユースケースでは、データを探索するときと同じレベルのインタラクティブ性をユーザーは期待していない
  • Node Failures
    • ヒストリカルノードが完全に 失敗して回復しない場合は、セグメントを再割り当てする必要がある。これはつまり、このデータをロードするためには余力が必要になる。
    • 経験から、2つ以上のノードが一度に完全に故障することは非常に稀であり、2つのヒストリカルノードからのデータを完全に再割り当てできるだけの余力をクラスタに残している
  • Data Center Outage
    • 完全なクラスタ停止はありえるが、非常にまれ。
    • 完全停止した場合、ディープストレージがまだ利用可能である限り、過去のノードがディープストレージからすべてのセグメントを再ダウンロードするだけで済むため、クラスタのリカバリ時間はネットワークに依存する
    • 過去の障害では、Amazon AWSのエコシステムで数テラバイトのデータに対して数時間のリカバリータイムが発生した

7.1 Operational Monitoring

  • 各Druidノードは、定期的に一連の運用メトリクスを出力するように設計されている
    • CPU使用率
    • 使用可能なメモリ
    • ディスク容量
    • ガベージコレクション時間
    • ヒープ使用率
    • セグメントスキャン時間
    • キャッシュヒット率
    • データインジェストレイテンシ
    • クエリごとのメトリクス

7.2 Pairing Druid with a Stream Processor

  • Druidは完全に非正規化されたデータストリームしか使用できない
  • 本番環境で完全なビジネスロジックを提供するために、DruidはApache Storm [27]のようなストリームプロセッサとペアにすることができる

7.3 Multiple Data Center Distribution

  • 大規模な停止は、単一ノードだけでなく、データセンター全体にも影響を及ぼす可能性がある
  • Druid コーディネーターノードのティア構成では、セグメントを複数のティアにまたがってレプリケートすることができる。そのため、セグメントは複数のデータセンターにあるヒストリカルノード間で正確に複製することができる。
  • クエリの優先順位を異なる階層に割り当てることができる
  • あるデータセンターのノードをプライマリクラスタとして動作させ別のデータセンターに冗長クラスタを設置することも可能

以下全文日本語訳

1.INTRODUCTION

近年、インターネット技術の普及により、機械が生成するイベントが急増している。これらのイベントは個々には有用な情報がほとんど含まれておらず、価値が低い。大規模なイベントのコレクションから意味を抽出するのに必要な時間とリソースを考えると、多くの企業はこのようなデータを破棄することになります。イベントベースのデータを扱うためのインフラストラクチャは構築されているが(IBMのNetezza[37]、HPのVertica[5]、EMCのGreenplum[29]など)、それらは大部分が高価格で販売されており、余裕のある企業のみを対象としている。数年前、GoogleはMapReduce [11]を同社の 汎用ハードウェアを活用してインターネットのインデックスを作成し、ログを分析する仕組み。Hadoop [36] プロジェクトがすぐに続き から出てきた洞察を主にパターン化したものです。MapReduceの論文。Hadoopは現在、大量のログデータを保存・分析するために多くの組織に導入されています。[…] は、価値の低いイベントストリームを、ビジネスインテリジェンスやA-Bテストなどのさまざまなアプリケーションのための価値の高いアグリゲートに変換する企業を支援することに多くの貢献をしてきました。 Hadoopは、企業が価値の低いイベントストリームを、ビジネスインテリジェンスやA-Bテストなどのさまざまなアプリケーションのための価値の高いアグリゲートに変換するのに多くの貢献をしてきました。

多くの優れたシステムと同様に、Hadoopは新たな問題に目を向けさせてくれました。具体的には、Hadoopは大量のデータを保存し、アクセスを提供することに優れていますが、そのデータにどれだけ素早くアクセスできるかについては、パフォーマンスが保証されていません。さらに、Hadoop は可用性の高いシステムではありますが、同時実行時の負荷が大きい場合にはパフォーマンスが低下します。最後に、Hadoop はデータの保存には適していますが、データをインジェストしてそのデータをすぐに読めるようにするためには最適化されていません。Metamarkets製品の開発の初期段階で、これらの問題に直面し、Hadoopは優れたバックオフィス、バッチ処理、データウェアハウスシステムであることに気付きました。しかし、同時並行性の高い環境(1000人以上のユーザー)でクエリのパフォーマンスとデータの可用性を製品レベルで保証している企業としては、Hadoopは私たちのニーズを満たすことができませんでした。この分野のさまざまなソリューションを検討し、リレーショナルデータベース管理システムとNoSQLアーキテクチャの両方を試した結果、オープンソースの世界には、当社の要件を十分に活用できるものはないという結論に達しました。結局、オープンソースの分散型カラム指向リアルタイム分析データストアであるDruidを開発することになりました。多くの点で、Druidは他のOLAPシステム[30, 35, 22]、対話型クエリシステム[28]、メインメモリデータベース[14]や として広く知られている分散データストア[7, 12, 23]。
分散型やクエリモデルは現時点の検索インフラからアイデアを借りています。[25, 3, 4]。

この論文では、Druid のアーキテクチャについて説明し、ホストされたサービスに電力を供給する(?)常時稼働型の生産システムを作成する際に行われた様々な設計上の決定事項を探り、同様の問題に直面している人に、解決の可能性のある方法についての情報を提供することを試みています。Druidは、複数のテクノロジー企業で本番さながらに展開されています. 本稿の構成は以下の通りである。セクション2で問題について説明し、次に、システムアーキテクチャについて、データがどのようにシステムを流れるかという観点から詳細について話す。次に、データがバイナリに変換される方法と理由について説明します。セクション4でフォーマットを説明し、クエリAPIについてはセクション5で簡単に説明し、性能結果をセクション6で紹介する.最後に セクション7では、本番でDruidを運用していた時の教訓を交えながら 第8節に関連研究を示す。

2.PROBLEM DEFINITION

Druidは元々、大量のトランザクションイベント(ログデータ)をインジェストして探索する問題を解決するために設計されました。
この形式の時系列データは、OLAPワークフローで一般的に見られ、データの性質上、非常に重い追加処理が必要になる傾向があります。次のような場合に使用します。例として、表1に示すデータを考えてみましょう。表1にはウィキペディア上で発生した編集の情報が含まれています。ユーザーが編集するたびに メタデータを含むイベントが生成されます。このメタデータは3つの異なるコンポーネントで構成されています。第一に、編集された時間の timestamp。次に、編集されたページや 編集を行ったユーザーと、そのユーザーの場所といったカラムのセット。最後に編集により追加・削除された文字数といったメトリクス郡(通常は数値)

私たちの目標は、このデータのドリルダウンや集計を迅速に計算することです。サンフランシスコの男性からJustin Bieberのページに何回編集が行われたか」や「カルガリーの人が1ヶ月間に追加した平均文字数は何文字か」といった質問に答えたいと考えています。また、任意の任意のディメンションの組み合わせに対するクエリは、1秒以内のレイテンシーで返すようにしたい。

Druidの必要性は、既存のオープンな RDBMS と NoSQLのキー/値ストアがインタラクティブなアプリケーションに対して低レイテンシでのデータ取得とクエリプラットフォームを提供できなかったことにより促進された[40]。ダッシュボードを支えるデータ・ストアは、その上に構築されたデータ・ビジュアライゼーションがユーザーにインタラクティブな体験を提供できるように、十分な速さでクエリを返す必要がありました。

クエリのレイテンシーのニーズに加えて、マルチテナントで可用性の高いシステムである必要がありました。Metamarkets製品は、高度に同時進行性の高い環境で使用されています。ダウンタイムにはコストがかかり、多くの企業はソフトウェアのアップグレードやネットワーク障害に直面してシステムが利用できなくなった場合、待っている余裕はありません。適切な社内運用管理を行っていないことが多い新興企業のダウンタイムは、ビジネスの成否を左右する可能性があります。

最後に、メタマーケッツが初期に直面したもう一つの課題は、ユーザーとアラートシステムが「リアルタイム」でビジネス上の意思決定を行えるようにすることでした。イベントが作成されてから、そのイベントがクエリ可能な状態になるまでの時間は、関心のある関係者がシステム内の潜在的に破滅的な状況にどれだけ早く対応できるかを決定します。Hadoopのような人気のあるオープンソースのデータウェアハウスシステムでは、私たちが必要とするサブセコンドのデータ取り込みレイテンシを提供することができませんでした。

データの探索、取り込み、可用性の問題は、複数の業界にまたがる。Druidは2012年10月にオープンソース化されて以来、ビデオ、ネットワーク監視、運用監視、オンライン広告分析プラットフォームとして複数の企業に導入されています。

3.ARCHITECTURE

Druidクラスタは異なるタイプのノードで構成され、各ノードタイプは特定のセットを実行するように設計されています。この設計は、懸念事項を分離し、システム全体の複雑さを単純化すると考えています。異なるノードタイプは互いに独立して動作し、ノード間の相互作用は最小限に抑えられています。したがって、クラスタ内の通信障害がデータの可用性に与える影響は最小限に抑えられています。

複雑なデータ分析の問題を解決するために、異なるノードタイプが一緒になって完全に動作するシステムを形成します。Druidという名前は、多くのロールプレイングゲームに登場するDruidクラスに由来しています。これはシェイプシフターで、グループ内で様々な役割を果たすために多くの異なる形態を取ることができます。
Druidクラスタ内のデータの構成と流れを図1に示します。

3.1Real-time Nodes

リアルタイムノードは、インジェストとイベントストリームのクエリの機能をカプセル化しています。これらのノードを経由してインデックス化されたイベントは、すぐにクエリに利用できます。ノードは小さな時間範囲のイベントのみを扱い、定期的にこの小さな時間範囲で収集した不変イベントのバッチを、不変イベントのバッチを扱うことに特化した Druid クラスタ内の他のノードに渡します。リアルタイムノードは、残りの Druid クラスタとの連携のために Zookeeper [19] を利用する。ノードは Zookeeper にオンライン状態であることと提供するデータについて知らせる

リアルタイムノードは、すべての着信イベントのためのインメモリインデックスバッファを保持します。これらのインデックスは、イベントがインジェストされるとインクリメンタルに生成され、インデックスは直接クエリ可能です。Druidは、このJVMヒープベースのバッファに存在するイベントに対するクエリのための行ストアとして動作します。ヒープオーバーフローの問題を回避するために、リアルタイムノードは、定期的に、または最大行数に達した後に、インメモリインデックスをディスクに永続化します。このパーシストプロセスは、インメモリバッファに格納されたデータをセクション4で説明したカラム指向のストレージ形式に変換します。各パーシステッドインデックスは不変であり、リアルタイムノードはパーシステッドインデックスをオフヒープメモリにロードして、まだ照会できるようにします。このプロセスは[33]で詳しく説明されており、図2に示されています。

図2:ノードは起動し、データをインジェストし、永続化し、定期的にデータを渡します。このプロセスは無期限に繰り返されます。異なるリアルタイム・ノード操作の間の期間は、構成可能です。

定期的に、各リアルタイムノードは ローカルに永続化されたすべてのインデックスを検索 するバックグラウンドタスクをスケジュールします。このタスクは、これらのインデックスをマージして、リアルタイム・ノードがある時間の間に摂取したすべてのイベントを含む不変のデータ・ブロックを構築します。このデータブロックを「セグメント」と呼びます。ハンドオフの段階では、リアルタイムノードはこのセグメントを恒久的なバックアップストレージ、一般的にはS3 [12]やHDFS [36]などの分散ファイルシステムにアップロードします。インジェスト、パーシスト、マージ、およびハンドオフの各段階は流動的です。

図3は、リアルタイムノードの動作を示す図である。ノードは13:37に開始し、現在の1時間(13時台)、あるいは次の1時間(14時台)のイベントのみを受け入れます。イベントがインジェストされると、ノードは13:00から14:00までの間隔でデータのセグメントを提供していることを知らせる。10分ごと(持続時間は設定可能)に、ノードはそのインメモリバッファをフラッシュしてディスクに持続させます。1時間の終わり近くになると、ノードは14:00~15:00のイベントを見ることになるでしょう。これが発生すると、ノードは次の時間のデータを提供する準備をし、新しいインメモリインデックスを作成します。その後、ノードは14:00から15:00までのセグメントも提供していることを知らせる。ノードは、13:00から14:00までの永続インデックスをすぐにマージするのではなく、13:00から14:00までのイベントが到着するまで、構成可能なウィンドウ期間を待ちます。このウィンドウ期間は、イベント配信の遅延によるデータ損失のリスクを最小限に抑えます。ウィンドウ期間の終了時に、ノードは13:00から14:00までのすべての永続インデックスを1つの不変セグメントにマージし、セグメントを渡します。このセグメントがロードされ、Druidクラスタ内のどこか他の場所でクエリ可能になると、リアルタイムノードは13:00~14:00の間に収集したデータに関するすべての情報をフラッシュし、このデータを提供していることを知らせないようになる。

図3: リアルタイムノードは、イベントをインメモリインデックスにバッファリングし、定期的にディスクに永続化します。定期的に、永続化されたインデックスはマージされてからハンドオフされます。クエリは、インメモリインデックスとパーシステッドインデックスの両方にヒットします。

3.1.1 Availability and Scalability

リアルタイムノードはデータの消費者であり、データストリームを提供するために対応するプロデューサを必要とします。一般的に、データの耐久性を目的として、図4に示すように、Kafka [21]のようなメッセージバスがプロデューサーとリアルタイムノードの間に配置されています。リアルタイムノードは、メッセージバスからイベントを読み取ることによってデータをインジェストする。イベント作成からイベント消費までの時間は通常数百ミリ秒のオーダーです。

図4:複数のリアルタイムノードが同じメッセージバスから読み出すことができます。各ノードは独自のオフセットを維持します。

図4のメッセージバスの目的は2つある。第一に、メッセージバスは受信イベントのバッファとして機能します。Kafka のようなメッセージバスは、コンシューマ(リアルタイムノード)がイベントストリームの中でどれだけの距離を読んだかを示す位置オフセットを保持しています。コンシューマはこれらのオフセットをプログラムで更新することができます。リアルタイムノードは、メモリ内のバッファをディスクに永続化するたびに、このオフセットを更新します。フェイルアンドリカバリーのシナリオでは、ノードがディスクを失っていない場合、ディスクからすべての永続化されたインデックスをリロードして、最後にコミットしたオフセットからイベントを読み続けることができます。最近コミットしたオフセットからイベントを取り込むことで、ノードのリカバリ時間が大幅に短縮されます。実際には、ノードがこのような障害シナリオから数秒で回復するのを確認している。

メッセージバスの第二の目的は、複数のリアルタイムノードがイベントを読み込める単一のエンドポイントとして機能することです。複数のリアルタイムノードは、バスから同じイベントセットをインジェストし、イベントのレプリケーションを作成することができます。ノードが完全に故障してディスクを失うシナリオでは、レプリケートされたストリームによってデータが失われることはありません。また、単一のインジェストエンドポイントにより、複数のリアルタイムノードがそれぞれストリームの一部をインジェストするようにデータストリームを分割することができます。これにより、追加のリアルタイムノードをシームレスに追加することができます。実際には、このモデルにより、最大規模のプロダクションDruidクラスタでは、約500MB/s(150,000イベント/sまたは2TB/hour)の生データを消費することが可能になりました。

3.2 Historical Nodes

ヒストリカルノードは、 リアルタイムノードによって作成されたデータの不変ブロック(セグメント) のロードおよび提供する機能をカプセル化しています。多くの実世界のワークフローでは、Druidクラスタにロードされるデータの大部分は不変であるため、ヒストリカルノードがDruidクラスタのメインワーカーとなります。ヒストリカルノードはsharednothingアーキテクチャを採用しており、ノード間で競合する単一のポイントは存在しません。ノードはお互いの知識を持たず、操作的には単純で、不変セグメントのロード、ドロップ、サーブの方法を知っているだけです。

リアルタイムノードと同様に、ヒストリカルノードは、そのオンライン状態と提供しているデータをZookeeperに通知する。セグメントのロードとドロップの指示は Zookeeper を介して送信され、セグメントがディープストレージ内のどこにあるか、セグメントを解凍して処理する方法などの情報が含まれています。ヒストリカルノードは、ディープストレージから特定のセグメントをダウンロードする前に、まず、ノードに既に存在するセグメントの情報を保持するローカルキャッシュをチェックします。セグメントに関する情報がキャッシュに存在しない場合、ヒストリカル・ノードは、ディープ・ストレージからセグメントをダウンロードし始める。この処理を図5に示す。処理が完了すると、セグメントはZookeeper内で通知される。この時点で、セグメントは問い合わせ可能です。また、ローカルキャッシュを使用することで、履歴ノードを迅速に更新して再起動することができます。起動時に、ノードはキャッシュを検査し、見つけたデータをすぐに提供します。

図5: ヒストリカルノードは、ディープストレージから不変のセグメントをダウンロードします。セグメントは、クエリを実行する前にメモリにロードされている必要があります。

ヒストリカルノードは不変データのみを扱うため、読み取りの一貫性をサポートすることができます。不変データブロックはまた、単純な並列化モデルを可能にします。ヒストリカルノードは、ブロッキングすることなく、不変ブロックを同時にスキャンして集約することができます。

3.2.1 Tiers

ヒストリカルノードは異なる階層にグループ化することができ、特定の階層のすべてのノードが同じように構成されます。階層ごとに異なるパフォーマンスとフォールトトレランスパラメータを設定できます。階層化ノードの目的は、優先度の高いセグメントや低いセグメントを重要度に応じて分散できるようにすることです。例えば、コア数が多く、メモリ容量が大きい履歴ノードの「ホット」ティアをスピンアップすることが可能です。「ホット」クラスタは、より頻繁にアクセスされるデータをダウンロードするように構成することができます。並列の「コールド」クラスタは、性能の低いバッキングハードウェアを使用して作成することもできます。コールド」クラスタには、アクセス頻度の低いセグメントのみが含まれます。

3.2.2 AVAILABILITY

履歴ノードは、セグメントのロードおよびアンロード命令を Zookeeper に依存しています。Zookeeper が使用できなくなると、ヒストリカルノードは新しいデータを提供したり、古いデータを削除したりすることができなくなりますが、クエリーは HTTP で提供されるため、ヒストリカルノードは現在提供しているデータに対するクエリー要求に応答することができます。つまり、Zookeeper の停止がヒストリカルノードの現在のデータ可用性に影響を与えることはありません。

3.3 Broker Nodes

Broker ノードは、ヒストリカルノードやリアルタイムノードへの問い合わせルータとして動作します。Broker ノードは、Zookeeper で公開されているメタデータを確認し、どのセグメントがクエリ可能で、そのセグメントがどこにあるかを知る。Broker ノードは、クエリが適切なヒストリカルノードまたはリアルタイムノードにヒットするように、受信したクエリをルーティングします。また、Broker ノードは、ヒストリカルノードとリアルタイムノードからの部分的な結果をマージして、最終的な統合結果を呼び出し元に返す。

3.3.1 CACHING

Brokerノードは、LRU [31, 20]の無効化戦略を持つキャッシュを含む。キャッシュはローカルのヒープメモリを使用するか、Memcached [16]のような外部分散型のキー/値ストアを使用することができる。特定のセグメントの結果はすでにキャッシュに存在している可能性があり、再計算の必要はありません。キャッシュに存在しない結果については、ブローカー・ノードが正しいヒストリカルノードとリアルタイムノードにクエリを転送します。ヒストリカルノードが結果を返すと、ブローカはこれらの結果をセグメントごとにキャッシュし、将来の使用に備えます。このプロセスを図6に示します。リアルタイムデータは決してキャッシュされないため、リアルタイムデータへのリクエストは常にリアルタイムノードに転送されます。リアルタイムデータは永続的に変化しており、結果をキャッシュすることは信頼性がありません。

キャッシュは、データ耐久性の追加レベルとしても機能します。すべての履歴ノードが故障した場合でも、キャッシュに結果が既に存在する場合は結果を照会することができます。

図6:結果はセグメントごとにキャッシュされます。クエリは、キャッシュされた結果と、ヒストリカルノードおよびリアルタイムノードで計算された結果を組み合わせます。

3.3.2 AVAILABILITY

Zookeeper が完全に停止した場合でも、データは照会可能である。ブローカーノードが Zookeeper と通信できない場合は、最後に知っているクラスタのビューを使用し、リアルタイムノードとヒストリカルノードにクエリを転送し続けます。ブローカーノードは、クラスタの構造が停止前と同じであることを前提としている。実際には、この可用性モデルにより、Zookeeper の停止を診断している間、Druid クラスタはかなりの期間、クエリを提供し続けることができました。

3.4 Coordinator Nodes

ドルイドのコーディネーターノードは、主にヒストリカルノードでのデータ管理や配信を担当しています。コーディネーターノードは、ヒストリカルノードに新しいデータのロード、古いデータのドロップ、データの複製、ロードバランスのためのデータの移動を指示します。Druidは、安定したビューを維持するために、不変セグメントを管理するためにマルチバージョン同時実行制御スワッピングプロトコルを使用しています。不変セグメントに新しいセグメントによって完全に時代遅れになったデータが含まれている場合、その時代遅れのセグメントはクラスターから削除されます。不変セグメントに新しいセグメントによって完全に時代遅れになったデータが含まれている場合、その時代遅れのセグメントはクラスターから削除されます。 コーディネータノードはリーダー選出プロセスを経て、コーディネータ機能を実行する1つのノードを決定します。残りのコーディネータノードは冗長バックアップとして機能します。

コーディネータノードは定期的に実行され、クラスタの現在の状態を判断します。コーディネータノードは、予想されるクラスタの状態と、実行時のクラスタの実際の状態を比較して判断します。他の Druid ノードと同様に、コーディネータノードは現在のクラスタ情報のために Zookeeper 接続を維持します。コーディネータ・ノードはまた、追加の運用パラメータや設定を含む MySQL データベースへの接続を維持します。MySQL データベースにある重要な情報の 1 つは、履歴ノードがサービスを提供すべきすべてのセグメントのリストを含むテーブルです。このテーブルは、リアルタイムノードなど、セグメントを作成するサービスによって更新することができます。MySQL データベースには、セグメントがクラスタ内でどのように作成、破棄、複製されるかを管理するルールテーブルも含まれています。

3.4.1 Rules

ヒストリカルセグメントをどのようにクラスタからロード、ドロップするかのルールが与えられる。ルールは、セグメントを異なるヒストリカルノード層にどのように割り当てるか、また、各層にセグメントのレプリケートが何個存在するかを示します。ルールはまた、セグメントをクラスタから完全に削除するタイミングを示すこともできます。ルールは通常、一定期間設定されます。例えば、ユーザーはルールを使用して、最新の1ヶ月分のセグメントを「ホット」クラスタにロードし、最新の1年分のセグメントを「コールド」クラスタにロードし、古いセグメントはすべて削除することができます。

コーディネータノードは、MySQLデータベースのルールテーブルからルールのセットをロードします。ルールは、特定のデータソースに固有のものであってもよいし、デフォルトのルールセットが設定されていてもよい。コーディネータ・ノードは、利用可能なすべてのセグメントを循環させ、各セグメントをそのセグメントに適用される最初のルールと一致させます。

3.4.2 LOAD BALANCING

典型的な本番環境では、クエリは数十、あるいは数百のセグメントにヒットすることがよくあります。各ヒストリカルノードのリソースは限られているため、クラスタの負荷が過度に不均衡にならないようにセグメントをクラスタ間で分散させる必要があります。最適な負荷分散を決定するには、クエリのパターンと速度に関する知識が必要です。一般的に、クエリは単一のデータソースの連続する時間間隔にまたがる最近のセグメントをカバーしています。平均的には、より小さなセグメントにアクセスするクエリの方が高速です。

これらのクエリパターンは、最近(直近1周間など)のヒストリカルセグメントをより高い割合で複製し、異なるヒストリカルノードにある時間的に近い大きなセグメントを分散させ、異なるデータソースからセグメントを同じ場所に配置するということを示している。クラスタ間でセグメントを最適に分配し、バランスをとるために、セグメントデータのソース、再帰性、サイズを考慮に入れたコストベースの最適化手順を開発した。アルゴリズムの正確な詳細は本論文の範囲を超えており、将来の文献で議論される可能性がある。

3.4.3 REPLICATION

コーディネータノードは、異なるヒストリカルノードに同じセグメントのコピーをロードするように指示することができます。 ヒストリカルコンピュートクラスタの各層のレプリカの数は、完全に設定可能です。高いレベルの耐障害性を必要とするセットアップでは、レプリカの数を多く設定することができます。複製されたセグメントはオリジナルと同じように扱われ、同じ負荷分散アルゴリズムに従います。セグメントを複製することで、単一の履歴ノードの障害はDruidクラスタ内で透過的になります。私たちはこの特性をソフトウェアのアップグレードに利用しています。シームレスにヒストリカルノードをオフラインにして、それを更新して、それを復活させ、クラスタ内のすべてのヒストリカルノードに対してこのプロセスを繰り返すことができます。過去2年間、ソフトウェア・アップグレードのためにDruidクラスタでダウンタイムを取ったことは一度もありません。

3.4.4 AVAILABILITY

Druid コーディネータノードは、Zookeeper と MySQL を外部依存関係として持っています。コーディネータ ノードは Zookeeper に依存して、クラスタ内にどのような履歴ノードが既に存在しているかを判断します。Zookeeper が利用できなくなると、コーディネーターはセグメントの割り当て、バランス、およびドロップの指示を送信できなくなります。ただし、これらの操作はデータの可用性には全く影響しません。

MySQLとZookeeperの障害に対応するための設計原理は同じ。連携を担当する外部依存関係が失敗した場合、クラスタは現状を維持します。DruidはMySQLを使用して、運用管理情報と、クラスタ内に存在すべきセグメントに関するセグメントメタデータ情報を保存します。MySQLがダウンした場合、この情報はコーディネータノードから利用できなくなります。しかし、これはデータ自体が利用できないという意味ではありません。コーディネータノードがMySQLと通信できなくなると、新しいセグメントの割り当てを停止し、古くなったセグメントを削除します。ブローカーノード、ヒストリカルノード、およびリアルタイムノードは、MySQL が停止している間も照会可能です。

4. STORAGE FORMAT

Druidのデータテーブル(データソースと呼ばれる)は、タイムスタンプの付いたイベントの集合体であり、セグメントのセットに分割されており、各セグメントは通常500万~1,000万行になります。正式には、セグメントをある期間に渡るデータの行の集合体と定義します。セグメントはDruidの基本的なストレージユニットを表し、レプリケーションと配布はセグメントレベルで行われます。

Druidは、データ分配ポリシー、データ保持ポリシー、および第一レベルのクエリ・プルーニングを簡素化する方法として、常にタイムスタンプ・カラムを必要としています。Druidは、データソースを明確に定義された時間間隔(一般的には1時間または1日)に分割し、さらに他の列の値を分割して、希望のセグメ ントサイズを達成することができます。セグメントを分割する時間の粒度は、データ量と時間範囲の関数です。1年に渡るタイムスタンプを持つデータセットは1日単位で、1日に渡るタイムスタンプを持つデータセットは1時間単位で分割するのが良いでしょう。

セグメントは、データソースの識別子、データの時間間隔、新しいセグメントが作成されるたびに増加するバージョン文字列によって一意に定まる。バージョン文字列は、セグメントデータの新しさを示します。バージョンが古いセグメントよりも、バージョンが後のセグメントの方が(ある時間範囲内で)新しいデータを表示します。読み込み操作は常に、特定の時間範囲のデータに、その時間範囲の最新のバージョン識別子を持つセグメントからアクセスします。

Druidのセグメントは、カラム志向で保存されます。Druidがイベントストリームの集約に最適であることを考えると(Druidに入るすべてのデータはタイムスタンプを持っていなければなりません)、集約情報を行ではなく列として保存することの利点は十分に文書化されています[1]。列ストレージでは、必要なものだけを実際にロードしてスキャンするため、CPUの使用効率が向上します。行指向のデータストアでは、行に関連付けられたすべての列が集約の一部としてスキャンされなければなりません。追加のスキャン時間は、以下のような重大なパフォーマンスの低下をもたらす可能性があります。

Druidには、様々なデータ形式を表現するための複数のカラムタイプがあります。カラムの種類に応じて、メモリやディスクにカラムを格納するコストを削減するために、さまざまな圧縮方法が使用されます。表1の例では、ページ、ユーザー、性別、および都市の列は文字列のみを含んでいます。文字列を直接格納することは不必要にコストがかかるため、文字列の列は代わりに辞書エンコードすることができます。辞書エンコーディングはデータを圧縮するための一般的な方法であり、PowerDrill [17]のような他のデータストアでも使用されています。

このマッピングにより、ページ列を整数の配列として表現することができ、配列のインデックスは元のデータセットの行に対応します。ページ列については、以下のように一意なページを表現することができます。結果として得られる整数配列は,それ自体が圧縮方式に非常に適しています.エンコーディングの上にある一般的な圧縮アルゴリズムは,カラムストアでは非常に一般的です.Druid は LZF [24] 圧縮アルゴリズムを使用しています。同様の圧縮方法を数値列にも適用することができます。例えば、表1の追加された文字と削除された文字の列は、個々の配列として表現することもできます。この場合、辞書表現とは対照的に生の値を圧縮します。

4.1 Indices for Filtering Data

多くの現実のOLAPワークフローでは、クエリは、ディメンジョン指定のセットが満たされているメトリクスセットの集約された結果に対して発行されます。例えば、”サンフランシスコの男性ユーザーがウィキペディアの編集を行った数は?” このクエリは、ディメンション値のブール式に基づいて、表1のWikipediaデータセットをフィルタリングする。多くの実世界のデータセットでは、ディメンジョンの列には文字列が含まれ、メトリックの列には数値が含まれています。Druidは、特定のクエリ・フィルタに関連する行のみがスキャンされるように、文字列列用の追加のルックアップ・インデックスを作成します。

表1のページ欄を考えてみましょう。表1の各ユニークなページについて、特定のページがどの表の行で見られるかを示す何らかの表現を形成することができます。この情報は,配列のインデックスが行を表すバイナリ配列に格納することができます.特定のページが特定の行にある場合、その配列インデックスは1とマークされます。(Table1 の例で)ジャスティン・ビーバーは0行目と1行目に見られる。 この列の値と行のインデックスの対応付けは、転置インデックスを形成する[39]。Justin BieberとKe$haのどちらの行が含まれているかを知るには、2つの配列をORすることができます。

大きなビットマップに対してブール演算を実行するアプローチ セットは検索エンジンでよく使われています。OLAPのためのビットマップインデックス ワークロードについては、[32]で詳しく説明しています。ビットマップ圧縮アルゴリズムは、よく定義された研究分野であり[2, 44, 42]、多くの場合、実行長エンコーディングを利用します。DruidはConciseアルゴリズム[10]を使用することを選択しました。図7は、整数配列を使用した場合とConcise圧縮を使用した場合のバイト数を示しています。結果はcc2.8xlargeシステム上で生成され、シングルスレッド、2Gヒープ、512mのヤングジェン、各実行間に強制GCを使用しました。データセットは、Twitter garden hose [41]のデータストリームから収集した1日分のデータです。データセットには、2,272,295行、様々なカーディナリティの12次元が含まれています。追加の比較として、我々はまた、圧縮を最大化するためにデータセットの行をリゾートしました

図7:Integer配列のサイズとConcise集合のサイズの比較

ソートされていないケースでは、Conciseの合計サイズは53,451,144バイト、整数配列の合計サイズは127,248,520バイトでした。全体として、Concise圧縮セットは整数配列よりも約42%小さくなっています。ソートされたケースでは、Concise圧縮の合計サイズは43,832,884バイト、整数配列の合計サイズは127,248,520バイトでした。興味深いのは、ソート後、グローバル圧縮は最小限にしか増加しなかったことです。

4.2 Storage Engine

Druidのパーシステンスコンポーネントでは、Dynamo [12]と同様に、異なるストレージエンジンを接続することができます。これらのストレージエンジンは、JVMヒープのような完全なインメモリ構造でデータを保存したり、メモリマップされた構造でデータを保存したりします。ストレージエンジンをスワップする機能により、特定のアプリケーションの仕様に応じて Druid を構成することができます。インメモリ・ストレージ・エンジンは、メモリ・マップド・ストレージ・エンジンよりも運用上高価ですが、パフォーマン スが重要な場合には、より良い代替手段となります。デフォルトでは、メモリマップされたストレージエンジンが使用されます。

メモリマップド・ストレージ・エンジンを使用する場合、Druid はセグメントをメモリの中に入れたり出したりする際にオペレーテ ィング・システムに依存します。セグメントはメモリにロードされていないとスキャンできないことを考えると、メモリマップされたストレージエンジンを使用することで、最近のセグメントはメモリに保持され、クエリーされなかったセグメントはページアウトされることになります。メモリマップ型ストレージエンジンを使用した場合の主な欠点は、クエリの実行時に、あるノードの容量を超えて多くのセグメントをメモリにページする必要がある場合です。この場合、クエリのパフォーマンスは、セグメントをメモリ内でページングしたり、メモリ外でページングしたりするためのコストに悩まされます。

5. QUERY API

Druidは独自のクエリ言語を持ち、POSTリクエストとしてクエリを受け付けます。ブローカー、ヒストリカル、リアルタイムノードはすべて同じクエリAPIを共有しています。

POSTリクエストの本文は、様々なクエリパラメータを指定したkey-valueペアを含むJSONオブジェクトです。典型的なクエリには、データソース名、結果データの粒度、関心のある時間範囲、リクエストのタイプ、集約するメトリクスが含まれます。結果は、期間にわたって集約されたメトリクスを含む JSON オブジェクトにもなります。

ほとんどの問い合わせタイプはフィルタセットもサポートしています。フィルタ・セットは、ディメンジョン名と値のペアのブール演算式です。ディメンジョンと値の任意の数および組み合わせを指定できます。フィルタ・セットが提供されると、フィルタ・セットに関連するデータのサブセットのみがスキャンされます。複雑な入れ子になったフィルタセットを扱うことができるため、Druidは任意の深さのデータを掘り下げることができます。

正確なクエリ構文は、クエリの種類と要求された情報によって異なります。1週間のデータを対象としたサンプルカウントクエリは以下のようになります。

{
 "queryType" : "timeseries",
 "dataSource" : "wikipedia",
 "intervals" : "2013-01-01/2013-01-08",
 "filter" : {
              "type" : "selector",
              "dimension" : "page",
              "value" : "Ke$ha"
            },
 "granularity" : "day",
 "aggregations" : [{"type":"count", "name":"rows"}] 
} 

上記のクエリは、2013-01-01から2013-01-08までのWikipediaデータソース内の行数のカウントを返しますが、”page “ディメンジョンの値が “Ke$ha “に等しい行のみにフィルタリングされています。結果は日ごとにバケット化され、以下の形式のJSON配列となる。

 [ {
     "timestamp": "2012-01-01T00:00:00.000Z",
     "result": {"rows":393298}
 },
 {
     "timestamp": "2012-01-02T00:00:00.000Z",
     "result": {"rows":382932}
 },
 ...
 {
     "timestamp": "2012-01-07T00:00:00.000Z",
     "result": {"rows": 1337}
 } ] 

Druidは、浮動小数点型や整数型の和、最小値、最大値、そしてカーディナリティ推定や近似分位推定などの複雑な集計を含む多くのタイプの集計をサポートしています。集約の結果は,他の集計を形成するために数式で組み合わせることができる.クエリAPIについて完全に説明することはこの論文の範囲を超えていますが、より多くの情報はオンラインで見ることができます。

この記事を書いている時点では、Druid用の結合クエリはまだ実装されていません。これは、エンジニアリングリソースの割り当てと 技術的なメリットに基づいて決定されるよりも、ケースの決定に基づいて決定されます。確かに、Druidのストレージ形式では、結合の実装が可能になります(ディメンジョンとして含まれる列の忠実度が損なわれることはありません)し、その実装は数ヶ月に一度の会話になっています。これまでのところ、私たちの組織にとって実装コストは投資に見合うものではないという選択をしてきました。この決定の理由は、一般的には2つあります。

  1. ジョインクエリのスケーリングは、私たちの専門的な経験では、分散データベースでの作業のボトルネックとなっています。
  2. 機能の増分は、同時進行性の高い、結合負荷の高いワークロードを管理する際に予想される問題よりも価値が低いと考えられます。

結合クエリとは、基本的には、2つ以上の データに基づいて、共有されたキーのセットに基づいて結合クエリを実行します。私たちが知っている結合クエリの主な高レベル戦略は、ハッシュベースの戦略か ソートされたマージ戦略です。ハッシュベースの戦略では、1つのデータセット以外のすべてのデータセットがハッシュテーブルのように見えるものとして利用可能であることが必要で、検索操作は「プライマリ」ストリームのすべての行に対してこのハッシュテーブルに対して実行されます。ソートマージ戦略は、各ストリームが結合キーでソートされていることを前提としているため、ストリームのインクリメンタルな結合が可能です。しかし、これらの戦略のそれぞれは、ソートされた順番かハッシュテーブル形式のいずれかで、いくつかのストリームを実体化する必要があります。

結合のすべての側面が非常に大きなテーブル(10億レコード以上)である場合、事前結合ストリームを実現するには、複雑な分散メモリ管理が必要になります。メモリ管理の複雑さは、高度に同時進行するマルチテナントのワークロードを対象としているという事実によってのみ増幅されます。これは、私たちが知る限りでは、学術的に活発な研究課題であり、スケーラブルな方法で解決することに貢献したいと考えています。

6. PERFORMANCE

Druidはいくつかの組織で運用されていますが、そのパフォーマンスを実証するために、2014年初頭の時点でMetamarketsで運用されているメインの運用クラスタの実世界の数値を共有することにしました。他のデータベースとの比較のために、TPC-Hデータ上での合成ワークロードの結果も掲載しています。

6.1 Query Performance in Production

Druidクエリのパフォーマンスは、発行されるクエリによって大きく変化します。例えば、与えられたメトリックに基づいて高カーディナリティディメンジョンの値をソートすることは、時間範囲内の単純なカウントよりもはるかに高価です。実運用のDruidクラスタにおけるクエリの平均レイテンシを示すために、表2に記載されているように、最もクエリされたデータソースの中から8つを選択しました。

Table2: データソースの特徴

クエリの約30%は異なるタイプのメトリクスやフィルタを含む標準的な集約であり、クエリの60%は集約された1つ以上のディメンション上でグループごとに順序付けられており、クエリの10%は検索クエリとメタデータ検索クエリである。アグリゲートクエリでスキャンされるカラム数は、ほぼ指数関数的な分布に従います。単一のカラムを含むクエリは非常に頻繁に発生し、すべてのカラムを含むクエリは非常にまれです。

結果についてのいくつかの注意事項。

  • 結果は、私たちのプロダクション・クラスタの「ホット」ティアからのものです。この結果は、当社の生産クラスタ内の「ホット」層での結果です。階層には約 50 のデータソースがあり、数百人のユーザーがクエリを発行していました。
  • ホット」な ティアと約10TBのセグメントをロードしています。合わせて。このティアには約500億のDruidの列があります。すべての データソースは表示されません。
  • ホットティアはインテル® Xeon® E5-2670 プロセッサーを使用しており、以下の構成になっています。1302個の処理スレッドと672個の総コア(ハイパースレッド)で構成されています。
  • メモリマップされたストレージエンジンが使用されました(マシンは にデータをロードするのではなく、メモリマップするように設定されています。Javaヒープ)。

クエリのレイテンシを図 8 に、1 分間あたりのクエリを図 9 に示す。さまざまなデータソースすべてにおいて、クエリの平均レイテンシは約550ミリ秒で、90%のクエリが1秒未満、95%のクエリが2秒未満、99%のクエリが10秒未満で返されています。2月19日に観測されたように、Memcachedインスタンスのネットワークの問題が、最大のデータソースの1つであるクエリの負荷が非常に高くなることで複合的に発生したように、レイテンシが急増することもあります。

図8: Query latencies of production data sources.
図9: Queries per minute of production data sources.

6.2 Query Benchmarks on TPC-H Data

また、TPC-Hのデータでドルイドのベンチマークを紹介しています。ほとんどのTPC-HクエリはDruidに直接適用されないため、クエリのパフォーマンスを示すために、Druidのワークロードに典型的なクエリを選択しました。比較として、MyISAMエンジンを使用してMySQLを使用した同じクエリの結果も提供しています(我々の実験ではInnoDBの方が遅かった)。

ベンチマークの対象として MySQL を選択したのは、その普遍的な人気の高さからです。他のオープンソースのカラムストアを選択しないことにしたのは、最適なパフォーマンスを得るために正しくチューニングできる自信がなかったからです。

Druidのセットアップでは、ヒストリカルノードにAmazon EC2のm3.2xlargeインスタンスタイプ(Intel® Xeon® E5-2680 v2 @ 2.80GHz)を、ブローカーノードにはc3.2xlargeインスタンス(Intel® Xeon® E5-2670 v2 @ 2.50GHz)を使用しました。MySQL のセットアップは、同じ m3.2xlarge インスタンスタイプで動作する Amazon RDS インスタンスでした。

1GBのTPC-Hデータセットの結果を図10に、100GBのデータセットの結果を図11に示す。Druidのスキャンレートを、与えられた時間間隔でのselect count(*)等価クエリの場合は53,539,211行/秒/コア、select sum(float)型クエリの場合は36,246,530行/秒/コアでベンチマークしました。

最後に、TPC-H 100GBのデータセットを用いて、増加するデータ量に対応するためにDruidをスケーリングした結果を紹介します。図12に示すように、コア数を8コアから48コアに増やした場合、すべてのタイプのクエリが線形スケーリングを達成するわけではありませんが、よりシンプルなアグリゲーションクエリでは線形スケーリングが達成されていることがわかります。

並列コンピューティングシステムの高速化は、システムの逐次処理に必要な時間によって制限されることが多い。この場合、ブローカレベルで相当量の作業を必要とするクエリは、同様に並列化されません。

6.3 Data Ingestion Performance

Druidのデータインジェストのレイテンシを示すために、ディメンション、メトリクス、イベントボリュームが異なる複数の本番用データソースを選択しました。本番環境でのインジェスト・セットアップは、6 ノード、合計 360GB の RAM、96 コア(12 x Intel®Xeon®E5-2670)で構成されています。

このセットアップでは、複数の他のデータソースがインジェストされ、他の多くのDruid関連のインジェストタスクがマシン上で同時に実行されていたことに注意してください。

Druidのデータインジェストのレイテンシは、インジェストされるデータセットの複雑さに大きく依存します。データの複雑さは、各イベントに含まれるディメンジョンの数、各イベントに含まれるメトリクスの数、およびそれらのメトリクスで実行したい集計の種類によって決まります。最も基本的なデータセット(タイムスタンプ列のみを持つデータセット)では、私たちのセットアップでは800,000イベント/秒/コアの速度でデータをインジェストできますが、これはイベントをデシリアライズする速度の測定に過ぎません。現実のデータセットは決してこれほど単純ではありません。表3は、データソースの選択とその特性を示しています。

表3の記述に基づいて、レイテンシは大きく変化し、インジェストレイテンシは必ずしもディメンションとメトリクスの数の要因ではないことがわかります。単純なデータ・セットでは、データ・プロデューサーがデータを配信していたレートであったため、いくつかの低いレイテンシが見られます。その結果を図13に示す。

スループットを、リアルタイムノードがインジェストし、クエリ可能なイベントの数と定義します。あまりにも多くのイベントがリアルタイムノードに送られた場合、リアルタイムノードがそれらのイベントを受け入れる容量があるまで、それらのイベントはブロックされます。本番環境で測定したピークインジェストレイテンシは、Amazon cc2.8xlarge インスタンスを実行している30のディメンションと19のメトリクスを持つデータソースで22914.43イベント/秒/コアでした。

我々が提示した待ち時間の測定値は、インタラクティブ性の問題を解決するのに十分なものです。我々は、待ち時間の変動が少ない方が良いと考えています。ハードウェアを追加することでレイテンシを減らすことはまだ可能ですが、インフラのコストがまだ考慮されているため、そうすることを選択していません。

7. DRUID IN PRODUCTION

ここ数年の間に、私たちはドルイドでの生産ワークロードの処理について多大な知識を得ており、いくつかの興味深い観察を行ってきました。

QueryPattaen

Druidは、データの探索やデータのレポート生成によく使われます。探索的なユースケースでは、1人のユーザーが発行するクエリの数は、報告的なユースケースよりもはるかに多くなります。探索的なクエリでは、結果を絞り込むために同じ時間範囲のフィルタを段階的に追加することがよくあります。ユーザーは、最近のデータの短い時間間隔を探索する傾向があります。レポートを生成するユースケースでは、ユーザーはより長いデータ間隔でクエリを行いますが、これらのクエリは一般的に数が少なく、事前に決定されています。

Multitenancy

負荷の高い同時実行クエリは、マルチテナントでは問題となりえる。大規模なデータソースに対するクエリは、クラスタ内のすべてのヒストリカルノードにヒットしてしまい、すべてのクラスタリソースを消費してしまう可能性があります。このような場合、より小さくて安価なクエリは実行がブロックされてしまう可能性があります。このような問題に対処するために、クエリの優先順位付けを導入しました。各ヒストリカルノードは、スキャンする必要のあるセグメントに優先順位をつけることができます。適切なクエリのプランニングは、本番のワークロードにとって非常に重要です。ありがたいことに、かなりの量のデータに対するクエリは、レポーティングのユースケースのためのものである傾向があり、優先順位を下げることができます。ユーザーは、このユースケースでは、データを探索するときと同じレベルのインタラクティブ性を期待していません。

Node failures.

シングルノードの障害は分散環境では一般的ですが 一度に多くのノードが故障した場合はそうではありません。ヒストリカルノードが完全に 失敗して回復しない場合は、セグメントを再割り当てする必要があります。つまり、このデータをロードするためには過剰なクラスタ容量が必要です。いつでも追加できるキャパシティの量は、クラスタの運用コストに貢献します。私たちの経験から、2つ以上のノードが一度に完全に故障することは非常に稀であり、したがって、私たちは2つの履歴ノードからのデータを完全に再割り当てできるだけの十分な容量をクラスタに残しています。

Data Center Outages.

完全なクラスタ停止はありえるが、非常にまれです。Druidが単一のデータセンターにしか導入されていない場合、データセンター全体で障害が発生する可能性があります。そのような場合、新しいマシンをプロビジョニングする必要があります。ディープストレージがまだ利用可能である限り、過去のノードがディープストレージからすべてのセグメントを再ダウンロードするだけで済むため、クラスタのリカバリ時間はネットワークに依存します。過去にもこのような障害を経験しており、Amazon AWSのエコシステムでは数テラバイトのデータに対して数時間のリカバリータイムが発生していました。

7.1 Operational Monitoring

大規模な分散型クラスタを運用するためには、適切なモニタリングが重要です。各Druidノードは、定期的に一連の運用メトリクスを出力するように設計されています。これらのメトリクスには、CPU使用率、使用可能なメモリ、ディスク容量などのシステムレベルのデータ、ガベージコレクション時間、ヒープ使用率などのJVM統計、セグメントスキャン時間、キャッシュヒット率、データインジェストレイテンシなどのノード固有のメトリクスが含まれます。Druidはまた、クエリごとのメトリクスを出力します。

本番の Druid クラスタからメトリクスを放出し、それをメトリクス Druidクラスタにロードします。本番クラスタの性能と安定性を探るために、メトリクスDruidクラスタを使用しています。この専用のメトリクス・クラスタを使用することで、クエリ速度の段階的な低下、最適にチューニングされていないハードウェア、その他の様々なシステム・ボトルネックなど、多数の本番環境の問題を発見することができました。また、本番環境でどのようなクエリがなげられているのか、どのようなデータの側面にユーザが興味を持っているのかを分析するために、メトリクス・クラスタを使用しています。

7.2 Pairing Druid with a Stream Processor

現在のところ、Druidは完全に非正規化されたデータストリームしか理解できません。本番環境で完全なビジネスロジックを提供するために、DruidはApache Storm [27]のようなストリームプロセッサとペアにすることができます。

ストーム トポロジーは、データ ストリームからイベントを消費し、「オンタイム」のイベントのみを保持し、関連するビジネス ロジックを適用します。これには、id から名前のルックアップなどの単純な変換から、複数ストリームの結合などの複雑な操作までが含まれます。ストームのトポロジーは、処理されたイベントストリームをリアルタイムでドルイドに転送します。ストームはストリーミングデータの処理作業を処理し、Druidはリアルタイムデータとヒストリカルデータの両方のクエリへの応答に使用されます。

7.3 Multiple Data Center Distribution

大規模な生産停止は、単一ノードだけでなく、データセンター全体にも影響を及ぼす可能性があります。Druid コーディネーターノードのティア構成では、セグメントを複数のティアにまたがってレプリケートすることができます。そのため、セグメントは複数のデータセンターにあるヒストリカルノード間で正確に複製することができます。同様に、クエリの優先順位を異なる階層に割り当てることができます。あるデータセンターのノードをプライマリクラスタとして動作させ(すべてのクエリを受信)、別のデータセンターに冗長クラスタを設置することも可能です。このようなセットアップは、1つのデータセンターがユーザーにかなり近い場所にある場合に必要になるかもしれません。

TOV実況第1回放送舞台裏

テイルズ談義をひたすらする場がほしいね

そんな一言から、ゲーム実況しながらテイルズ談義してはどうかという企画が上がり約一ヶ月。1回目の放送が実施されました。以下は配信のアーカイブ動画になります。

会話がもたないのではないかと始まる前はかな~り心配ではありましたが、終わってみれば何も話さないといった時間帯は特になく、かなり楽しくしっぽらさんとやりとりしながら配信できた。

Twitterで宣伝してくれた方、見に来てくれた方、コメントしてくれた方、広告してくれた方、皆さん本当にありがとうございますm(_ _)m

戦闘がかなりヒヤヒヤとする場面が多かったのは予想外ではあったが(汗)
次からは戦闘サクサクやるためにレベル上げとくかな。

実は配信を始める1時間前からしっぽらさんと準備をしていたのですが、当初予定していた配信環境ではうまく配信できないことがわかり、急遽配信環境を変更したというやり取りがありました。

予定していた環境としては、自分がプレイしている映像をしっぽらさんはDiscordのGoLiveという配信映像を見ながらDiscordで通話するという状態を想定していました。直前になってしっぽらさんのほうで映像が見れないというトラブルが発生してんやわんや。別の日に確認したときは問題とかなかったんやけどなぁ。。。

結局しっぽらさんはニコニコ動画の配信動画を見ながら話すという環境になっていましたが、特にこの状態が問題となることもなかったようでひと安心。今後環境が整いしっぽらさんの方でも遅延なしに映像が見られるようになるとええんやけども(;・∀・)

放送開始直前のドタバタがそれはそれで面白くて、録画していた動画にその部分も含まれていたのでここにおいておきます。特にOPを見ている最中の「ジュディスの足が出てる」といったしっぽらさんの発言あたりは仲間内でツボにはまりました。自分としっぽらさん以外に、テイルズ雀士として切磋琢磨しているつっしー、あらさんの音声も入っています(動画出力におけるトラブルで音ズレが発生しています)

次回は4/26(日)を予定しております。エフミドの丘を超えるところまで行ければなとおもっておりますがどうなることやら。

ここまで見ていただきありがとうございます。また次回も見ていただけると嬉しいです。みんなでテイルズについて語り明かそう!! ᕦ(ò_óˇ)ᕤ“

統計検定準1級出題範囲差分確認

コロナで色々なイベントが中止・延期となっているなかで、6月に実施予定の統計検定は、自分が受験予定の統計検定準1級のみが実施予定というアナウンスが出されました。年に1度しか機会がないものではありますが、もしも中止となったらそれはそれで、11月実施予定の1級に的を絞って勉強するのもいいかなと思っていたりしたので、複雑な気持ちでいます。

2020年6月以降の統計検定準1級出題範囲について、新しくPDFが提供されています。今までのものと比較してパッと見ただけでは差分が分かりづらいですが、以下の項目が追加されています。

大項目小項目 項目(学習しておくべき用語)例
回帰分析その他ニューラルネットワークモデル
多変量解析判別分析ROC, AUC, 混合行列

以前の範囲から削除された項目はなく、学習範囲が拡大されただけ。範囲変更直後の試験では、この追加された項目はほぼ確実に出ると思うので、取りこぼしのないようにしたいところです。

ニューラルネットワークモデル

機械学習に精通していない方でもこの言葉自体は何らかのメディアで聞いたことがあるかと思います。知名度が高くなった(基本的な知識として認知され始めた)という背景を受け、追加された項目であろうとおもいます。1級の出題範囲にも含まれておらず、公式の参考書にもこの言葉は見受けられないので、独自に参考書なり探して知識をつけておく必要があるでしょう。

ROC曲線, AUC(c統計量)

医学生物分野における検査精度に関する項目。こちらは1級の範囲にもともとあったものが、準1級の範囲にも移されたというものになります。1級対応の公式参考書には書かれているので、1級対応の公式参考書の内容を見ておくと良いでしょう。この2つの項目は例として出されているだけなので、検査精度に関する項目全体について目を通しておくことが必要かもしれません。

日本統計学会公式認定 統計検定1級対応 統計学

混合行列

パターン認識などの分野で用いられるモデルの真偽出力と実際の真偽値とをテーブルの形式で表したものになります。検定の第一種過誤・第二種過誤の項目で用いるテーブルと考え方としては同じですが、異なる表現をしていることがあるため、検定のことなのか判別分析のことなのかを意識してキーワードを覚える必要があります。

” 第一種過誤と第二種過誤” フリー百科事典『ウィキペディア(Wikipedia)』 より 
最終更新 2019年12月14日 (土) 08:15 UTC

” Confusion matrix” Wikipedia, the free encyclopedia より
31 March 2020, at 18:00 (UTC)