金融データ分析基盤の設計

目的

金融関連のデータを収集し、蓄積・分析する基盤を作ろうとしている。基盤についての概要や設計などは後述するが、まずはその基盤を構築する目的を整理して、今後の基盤設計・構築をぶれないようにする。

目的は以下の2つがある。

  1. 投資のための金融関連の分析

  2. 自身の技術的な成長

投資には株式や為替、仮想通貨などさまざまな商品が存在するが、そのどれもがより期待値の高い投資をするために複数の関連データが必要となってくる。例えば為替であれば、政策金利や物価指数、要人の発言などさまざまな環境によって影響を与えられており、将来の相場を予想して投資を行うためにはそれらのデータを適切に用いて分析しなければならない。

そういった際に、複数の指標を絡めて分析したり、単一の指標でも複雑な分析をできるような環境が見つからなかったため、自分用に基盤を構築しようと思った。(あと、自然言語などの非構造化データも扱える柔軟な基盤が欲しかった)

また、データ分析基盤の構築は今まで行ったことがないが、データに頻繁に触れて分析するような職種だったためにとても興味がある。ただ、企業からの需要などを考えると、この技術はスキルセットに必要なのかは疑問が残る。データエンジニアであれば是非欲しいところだろうが、データサイエンティストであれば分析に特化していたほうが良い可能性はある。もちろん、技術があるにこしたことはないが、データサイエンティストがデータ分析基盤を構築・運用する場面は稀だろう。

全体像

現状、構築するデータ分析基盤の構成は以下のように考えている。
基盤は大きく分けて収集部分と蓄積・分析部分に分かれており、収集部分ではApache Airflow、蓄積・分析部分ではHadoop(HDFS、Spark、Impala)を利用する。はじめはHadoopエコシステムにデータ収集を担当させられるシステムはないか探したが、多様なデータ収集方法に対応できる良さそうなものがなかった。(Flume、Sqoop、Nutch、NiFiなどを検討した)

システムアーキテクチャ

今の所想定しているデータソース・収集方法としては、WebAPI(バッチ・ストリーミング)、スクレイピング、DB、ファイル(CSVなど)で、それらを包括的に処理できるApache Airflowが良さそうだと思った。理想的にはFlume、Sqoopなど各領域に特化したものをシステムに組み込んで、NiFiなどでデータの追跡をできるようにしておくことだが、それは後からでも拡張できると思うので一旦は単純な構成にした。

上記の基盤はKubernetesクラスタ上に構築しようと考えていて、Airflow、Hadoop(HDFS、Spark、Impala)はどれもKubernetes上で構築している前例があるためそれらを参考にしていこうと思う。HDFS、Spark、ImpalaはどれもHadoopクラスタ上に共存させることもできるため、クラスタの構成はほぼ同じとなっている。

コンポーネント

Apache Airflow

Apache Airflowはオープンソースのワークフロー管理システムで、DAGで表したジョブの実行や監視などを行うことができる。上の基盤ではそれをデータの収集部分に利用していて、データ収集処理のジョブなどを一括で管理することを目的としている。

主なデータソースはWebAPI、ウェブページ(スクレイピング)、外部DB、ファイルなど複数あるが、Airflowであれば基本的にはどのような処理にも柔軟に対応できる。

HDFS

HDFS(Hadoop Distributed File System)はHadoopエコシステムの中の分散ストレージにあたるシステムで、分散処理の要となる重要な部分だ。HDFSの構成としては、NameNode、JournalNode、DataNodeの3つからなる。NameNodeはアクティブ・スタンバイ構成で一つのノードが稼働系となり、DataNodeの名前空間やメタデータの管理を行う。JournalNodeは待機系のNameNodeを稼働系と同期を取るために使われる。DataNodeはその名の通り実際にデータを読み書きする部分となっており、HDFSではブロック単位にデータを分けて分散・複製して保存する。

Apache Spark

Apache Sparkは分散処理を行うためのフレームワークとなっており、Pythonなどのクライアントから利用することができる。HDFSによってストレージの分散が可能となったため、Sparkによって効率的に分散処理が行える。また、SparkはMapReduceとは異なりインメモリで動作するため比較的高速に処理を行うことができる。

最近はSparkは単純なデータに対する処理だけではなく、分散して大きな機械学習モデルを学習するのにも利用されている。

Apache Impala

Apache ImpalaはHDFSなどのストレージに対応した分散型クエリエンジンで、分散ストレージに保存されたデータに対して効率的に処理を行うことができる。この基盤での用途としては分析がメインになり、大規模なデータ処理などはSparkにまかせる予定。

Sparkはスケジューリングするバッチ処理などが向いているが、こちらはインタラクティブにSQLを使って分析するのに用いる。今の所想定しているのはJupyter Notebookから使うような感じ。

Apache ZooKeeper

Apache ZooKeeperはHDFSなどのクラスタのマスターノード(NameNode)の冗長化構成を取る際に必要となるものになっている。実はあまりちゃんと理解できていないが、ドキュメントや記事を読んだ限りでは、稼働系のNameNodeがダウンしたときに新しい稼働系を選出するのが主な役割らしく、ZooKeeperのノード自体は合意形成アルゴリズムによって冗長化をおこなっているようだ。

最後に

この基盤構築の目的に自身の成長も含まれているため、触ったことのないシステム・フレームワークがほとんどで、設計段階で詳細なイメージが湧いてない部分が多々ある。そのため、あとから構成が変わってくることも想定しておこうと思う。

あと、今回は長期的な費用を抑える目的でオンプレ構成にしてみようかなと思っているので、インフラをどうやって準備するかも考え中。案としては以下の3つがある。

  1. 1万円台のNUCを3, 4個買う

  2. 2000円程度の格安シンクラを10個くらい買う

  3. 液晶破損のノパソを5個くらい買う

最近の1万円台のNUCはサイズも小さくてスペックもある程度良いので、3, 4台あればKubernetesクラスタとして動きはする程度のリソースは確保できそう。データが大規模になってきたらもっと強めのスペックのを台数確保しようかな。(Kubernetesならシステムアーキテクチャは変えずにスケーリングできるし)

この記事が気に入ったらサポートをしてみませんか?