【IT】ビッグデータを取り扱う

ビッグデータを扱うとは?

AWSやGCPといったクラウドサービスが普及したことで、一昔前のオンプレミスでサーバーを用意していた頃に比べるとビッグデータの扱いが容易になりました。私も今の職場でビッグデータと呼ばれるものを扱うエンジニアをしています。ビッグデータを扱うというと、分析や機械学習といったことがよく話題として繋がりますが、この記事ではそこではなく、ビッグデータを集めるというところ、そして分析や機械学習にどのようにつなげていくのかを今回の記事の内容にしたいと思います。

ビッグデータを使いたいという人に、まず言いたい

『ビッグデータを使って何がしたいのですか?』

これは本当に大事なことで、大量のデータを集めてくる、保持するにもお金はかかります。超大企業なら、はした金と思う金額でも、ビッグデータを集めるために人は動くし、そのデータを処理するためのサーバーやサービスを使うにも費用が発生します。そういった無駄なお金を使わないためにもまず、ビッグデータを使うにあたり、何がしたいのか?何をしりたいのかを明確にしましょう。もし明確でないならば、まずはスモールデータを使い何ができるのかを理解し、やりたいことを明確化してほしいと思います。

データの処理には手間と時間がかかる

なぜ目的を明確化してほしいのか?というとビッグデータの処理には手間と時間がかかるからです。その手間と時間をかけて作ったものを、エンジニアとしては有効活用してほしいと思っています。そうは言っても、とにかく集めろというお客さまもいますが、そういうときは、必ずどこかで問題が発生し、誰かが苦しみます・・・。

データを集める

データを集める目的はなんでしょうか?

  • データを検索するため・・・素早く目的のデータを見つけられるようにする
  • データを加工するため・・・目的が明確な加工のため、処理の自動化管理が重要
  • データを可視化するため・・・分析・集計をアドホックに行い、継続的にモニタリングをしていく

大体は上記のどれかだと思います。ビッグデータもデータのため、集めた後の使い方は基本的に同じです。もしビッグデータの使い方に迷うことがあれば、上記の3つに照らし合わせて考えてみるのも良いでしょう。まずは、データ使う前に集めることに焦点を当ててみたいと思います。

データはどこから集まってくるのか?(データソース)

データは様々なところにあります。ログとして出力されているもの(システムログだけでなく、ユーザーの行動ログなど)、業務データ、公的データ(気象情報など)、写真などです。こうしたデータ分析をするという点からいうとデータソース(データの出力元)と呼ばれます。そこに保存されているローデータ(生データ)を取り出します。このデータソースは構造化されたデータである場合もあれば、非構造化されたデータも含まれます。こうした様々なデータが、要件に応じて業務システムを始め、Web、公的機関など至るところから集めてきます。(データは当然ですが勝手には集まってきません。集めるためにそのシステムを作る必要があります。)

集めたデータをまずはそのまま溜め込む(データレイク)

集めたデータは、まずそのまま保存します。様々な場所から連携されてくるデータは、テキストファイルや、バイナリデータなどすぐに分析に使えるようなデータでは連携されてこないことも多いので、後続で自由に加工などの処理ができるようにまずは、そのまま保存します。このときの保存先は分散ストレージという、多数のコンピュータとディスクから構成されるストレージシステムにその時の格納方式で代表的なものはオブジェクトストレージで、AWSのS3やGCPのGCSなどが代表的なサービスとしてあげられる。

溜め込んだデータを構造化する(データウェアハウス)

データレイクに溜めたデータはそのままで扱えません。そのため、SQLなどを使ってある程度データを扱いやすくするために構造化された形にデータを加工し、データウェアハウスとして保持します。このデータウェアハウスに対してBIツールなどで分析を行う現場もあるでしょう。

溜め込んだデータを活用しやすく加工する(データマート)

データウェアハウスに構造化し溜め込んだデータを加工し、分析に必要な形に集計して取り込みます。BIツールなどを使って分析する際は、データマートを使い可視化を行なっていきます。DBの世界では正規化という事をよく学びますが、それとは逆に非正規化されたデータで1つのテーブルに全てのデータを持つような作り方で作る事多いです。

データを探索する

ビッグデータをエンドユーザーが扱う時に直面する課題は、いかに早くデータにアクセスできるかです。私もユーザーに対して作ったデータマートをBIツールを通して公開することは何度もありますが、どれだけ早くデータにアクセスできているかで、お客様の最初の第一印象が変わります。ユーザーさんは当たり前にデータにアクセスできると思っていますからね。

データ圧縮と分散処理

データアクセスへの高速化を早める方法としてあげられるのが、データの圧縮し、それを複数のディスクに分散して保存することで、読み取り量を減らして高速にアクセスできるようにします。また、分散されたデータにアクセスするのは分散された処理を使ってアクセスを行います。先日、BigQueryを紹介しましたが、BigQueryの分散ストレージとDremelはまさにこの仕組みですね。

列指向データベース

列指向データベースはビッグデータを語る上で絶対に外せません。ビッグデータを扱う人であれば、AWS RedshiftやGCP BigQueryを知らない人はいないでしょう。その両方が列指向データベースです。列指向データベースは分析と相性がとても良いです。分析をする時に明細データを使うということはあまりありません。ある項目をグロスで集計し、その推移をみるといった使い方が多いはずで、1行のデータ全て必要とすると言ったことはあまりありません。そのため、列で同じようなデータが並びやすく圧縮しやすい列指向のデータベースはビッグデータを扱うという点においてとも効率が良いと言えます。データマートを非正規化するのものこの列指向と相性が良いと言えます。

データを分散して処理する

ビッグデータを扱うに当たって、高速化するにあたり、処理を分散するというのは大切な事です。BigQueryなどはDremelを使って処理を分散しています。分散処理の基盤はHDFSのような分散ファイルシステムがベースにあたります。そして分散されたファイルを処理するためにCPUやメモリのリソースの空きを把握し、空いたところ処理を分散し、その上でクエリを実行して処理を行います。処理を分散するにあたり大切なことがいくつかあります。

最初にデータを絞り込む

当然と言えば当然ですが、最初に必要なデータに絞り込み、少ない数で処理をする事を考える。そうする事で、処理は高速化されます。

データの偏りをなくす

分散処理するにあたり、分散した先のデータ量にバラツキがあると、効率的に処理できているとは言えません。そのため、処理件数が出来る限り同じになるように処理分散出来るように、スキーマーやパーティショニングを考えましょう。

データを蓄積するために

データを蓄積するにあたり、転送方法も検討が必要です。バッチ処理に代表されるようなバルク処理と、データが随時流れてくるようなストリーミング処理が代表的な転送方法と言えます。

バルク処理の特徴

  • 大量のデータをまとめて転送する時
  • 既にデータが存在(既存データベースがある)しており、そこから抽出した場合
  • 作り方によるがやり直しがしやすい

ストリーミング処理

  • 少さいサイズのデータを随時転送する時
  • 不特定多数のクライアントが不規則にデータを連携してくる
  • データ量(数)が多い

終わりに

私は、今の現場にうつってビッグデータを扱うということを本格的に開始しました。列指向という考え方はこれまで業務データを扱ってきた私にとっては、なかなか理解が難しい代物でした。ビッグデータ扱うにあたって、なんの項目をどう使いたいのかを、より一層意識する機会が増えた気がします。これまでは1行を早く見つける方法を考えていましたが、ビッグデータではその1行は大切なのですが、それ以上にバルクでみる意味をより掘り下げて考えていかなければいけないと感じます。

最後にこの記事をかくに当たって参考した本を紹介させていただきます。より掘り下げてビッグデータを処理するために考えるポイントを学びたいことは是非参考にしていただくと良いかと思います。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ビッグデータを支える技術 刻々とデータが脈打つ自動化の世界 西田圭介/著
価格:3256円(税込、送料別) (2020/1/13時点)

楽天で購入

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です