ポイント: Apache CassandraとHadoopの使用は、効率的なビッグデータ処理のためのこれらの技術の統合を探求し、カサンドラのアーキテクチャがスケーラビリティと従来の正規化なしでの迅速なデータ取得を可能にすることを強調しています。
- カサンドラは、高可用性とスピードのために設計されたNoSQLデータベースです。
- データはフラットな構造で保存され、正規化よりもパフォーマンスに重点を置いています。
カサンドラの概要
カサンドラは、Facebookによって開発されたオープンソースのNoSQLデータベースで、膨大なデータを処理するための独自のニーズを満たすために作られました。
NoSQLであると言っても、それが非構造的であることを意味するわけではありません。カサンドラにおけるデータは、通常のSQLデータベースと同様に行と列のデータセットに保存されます。しかし、テーブル間に関係はありません。また、カサンドラでは、CQL(カサンドラクエリ言語)を使用してデータをクエリおよび書き込むことができますが、これは通常のSQLに非常に似ています。
しかし、SQLをサポートしているからといって、すべてのSQL操作ができるわけではありません。特に、JOINやGROUP操作、または拡張ディスク検索と計算を必要とするものはありません。その代わり、カサンドラでは、データを希望する形式で保存することが求められます。この考え方のシフトは、従来、RDBMS(関係データベース管理システム)について教えられてきたことから完全に180度回転します。
非正規化
私たちが言いたいことを説明するために、データを正規化するとは何かを議論する必要があります。カサンドラのデータは、非正規化され、フラットにすることが求められます。それを示しましょう。例えば、次の学生データがあるとしましょう:
| 学生番号 | 名前 | 市 | 州 | 郵便番号 |
Oracleデータベースを設計する人は、これを2つのテーブルに分割します:
| 学生番号 | 名前 | 郵便番号 |
| 郵便番号 | 州 | 市 |
2つのテーブルの共通要素は郵便番号です。誰かが住んでいる郵便番号を知っていると、その人の都市と州がわかります。では、なぜそのデータをすべての行に繰り返す必要があるのでしょうか?繰り返す必要はありません。データを正規化します。しかし、カサンドラではそうはしません。カサンドラは多くのディスクスペースを使用することを気にしません。これが正規化を行わない理由の1つです。(しかし、その圧縮アルゴリズムはストレージを80%削減します。)代わりに、カサンドラはスピードとスケールのために設計されています。
アーキテクチャ
カサンドラには中央ハブやマスタースレーブトポロジーはありません。代わりに、すべてのノードが同じ役割を持つリング状に設計されています。ノードは、いわゆるゴシップで互いに通信します。ノードは必要に応じて追加または削除できます。ユーザーは冗長性を維持するために保持するデータの追加コピーの数を示す複製レベルを設定します。カサンドラが通常のRDBMSと異なる点は、物理的にデータを保存およびソートする方法を考慮する必要があるということです。それを正しく使用し、完全に理解するためには、CommitLog、Memtable、SSTable、Partitions、Nodesを理解する必要があります。例え話をすると、波がビーチに打ち寄せる様子を考えてみてください。一つの大きな波が押し寄せ、その後にいくつかの小さな波が続きます。そして、一つの巨大な波が押し寄せ、すべてを移動させます。波をカサンドラのメモリ、ビーチの砂をカサンドラの永続的なディスクストレージと考えることができます。カサンドラは、ハドゥープのように、分散アーキテクチャを提供するために低コストのコモディティストレージを使用するように設計されています。つまり、データセンターの仮想および物理マシンに接続されたハードドライブを使用するのです。カサンドラのデータはSSTableとしてストレージに保存されます。書き込みは最初にCommitLogに書き込まれ、何を変更する必要があるかを追跡します。書き込みはMemtableと呼ばれる構造内にキャッシュされます。このキャッシュはサイズが増加し、波のように押し寄せるまでビルドアップされます。カサンドラがその変更をディスクにコミットする際に。実際の書き込みは比較的遅いですが、読み取りは非常に速いです。これらのMemtableのいくつかが同時に持ち上げられています。したがって、基盤となる物理SSTableの構造は、いつでもこれらのMemtableとは異なります。SSTableは波のように書き込まれます。これは、Linuxがスワップファイルが満杯のときにメモリのページをディスクに書き込むのと同じです。これは、INSERTや他の操作のたびにテーブルを更新する通常のRDBMSとは異なります。
パーティションとノード
さて、データベーステーブルのプライマリキーを考えてみてください。プライマリキーは、1つまたは複数のフィールドから来るユニークな値です。カサンドラでは、最初のフィールドがパーティションキーを示します。プライマリキー内の他のフィールドは、そのパーティション内でデータがどのようにソートされるかを示します。パーティションは、データが物理的に保存される場所(すなわちノード)を示します。例えば、次のようなデータがあるとします:
プライマリキー
| 車両ID | メーカー |
| 1 | フォード |
| 2 | フォード |
| 3 | シボレー |
| 4 | シボレー |
| 5 | シボレー |
車両IDはパーティションキーです。メーカーはクラスタリングカラムです。これにより、すべてのFord車両が隣接して保存され、効率的にデータを取得できるようになります。この例では、車両IDはユニークであるため、そのストレージメカニズムが効率にどのように寄与するかは不明です。しかし、複合パーティションキーを持つことができます。つまり、車両IDが実際には車両が製造された工場といくつかの番号であるとします。したがって、同じ工場で製造され、同じ色に塗装されたすべての車両が近くに保存され、取得を高速化します:
| 工場 | 車両ID | 色 |
| メキシコ | 1 | 赤 |
| メキシコ | 1 | 赤 |
| アメリカ合衆国 | 1 | 青 |
さて、これらの概念をさらに説明するために、カサンドラを使ったハンズオン作業を行いましょう。まず、ソフトウェアをインストールします。
インストール
ここにCentOSでのインストールがあります。ここで注目すべき点は、カサンドラのウェブサイトで、カサンドラはソフトウェアをダウンロードとして提供し、Ubuntuリポジトリに配布されますが、Yum用ではないことです。したがって、Datastaxがそれを行います。注意:プライベートビジネスDatastaxは、インターネット上のカサンドラに関するほとんどのドキュメントを書いています。彼らは以前はカサンドラの独自の配布を行っていましたが、現在はそれを行っていません。今、誰かがその空白を埋めて公式のカサンドラドキュメントを完成させる必要があります。実際、彼らはドキュメントを完成させる手伝いをしたい人を探しています。したがって、今はDatastaxのドキュメントを使用してください。まず、この内容のリポジトリファイルを作成します:
cat /etc/yum.repos.d/datastax.repo
name = DataStax Repo for Apache Cassandra
baseurl = http://rpm.datastax.com/community
enabled = 1
gpgcheck = 0
次に、これらの2つのアイテムをインストールします:
yum install dsc30
yum install cassandra30-tools
今、カサンドラスヘルを開きます:
cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
Use HELP for help.
cqlsh>
今、テーブルを作成してデータを入力しましょう。
KeySpace
最初に作成するオブジェクトはKeySpaceです。これは、複製のためのコンテナです。ここでは、ライブラリというKeySpaceを作成し、図書館からどの本を借りたかを追跡するテーブルを作成します。このクラスとreplication_factorは、データがどのように複製されるかを決定します。データの複製のために3つのコピーを作成するように指示します。
CREATE KEYSPACE Library
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };
テーブル
今、bookテーブルとpatronテーブルの2つを作成します。
CREATE TABLE Library.book (
ISBN text,
copy int,
title text,
PRIMARY KEY (ISBN, copy)
);
CREATE TABLE Library.patron (
ssn int PRIMARY KEY,
checkedOut set
);
ここで注意すべきいくつかの項目があります:
- テキスト型と整数型のフィールドタイプを使用しています。カサンドラには通常のカラムタイプがあり、ユーザー定義のものも許可されています。
- 最初のテーブルにはプライマリキーに2つのフィールドがあります。2番目のテーブルには1つあります。
- 2番目のテーブルにはセットコレクションカラムがあります。セットは、{1,2,3}のようなユニークな要素のコレクションです。カサンドラでは、要素がユニークである必要のないリスト({1,2,2,3}のような)や、キーがユニークである必要のあるマップ({key->value}のような)もサポートされています。
- それ以外は、構文は通常のOracle SQLと全く同じです。
データの追加
データを追加してみましょう。コマンドは通常のSQLと全く同じです。テーブル名はKeyspaceでプレフィックスされます。通常のSQLデータベースでは、テーブルはdatabase.tableで示されます。
INSERT INTO Library.book (ISBN, copy, title) VALUES('1234',1, 'Bible');
INSERT INTO Library.book (ISBN, copy, title) VALUES('1234',2, 'Bible');
INSERT INTO Library.book (ISBN, copy, title) VALUES('1234',3, 'Bible');
INSERT INTO Library.book (ISBN, copy, title) VALUES('5678',1, 'Koran');
INSERT INTO Library.book (ISBN, copy, title) VALUES('5678',2, 'Koran');
今、値をリストします:
select * from Library.book;
isbn | copy | title
------+------+-------
5678 | 1 | Koran
5678 | 2 | Koran
1234 | 1 | Bible
1234 | 2 | Bible
1234 | 3 | Bible
次に、パトロンテーブルにデータを追加します。図書館のパトロンが借りた本はセットです:{'1234','5678'}。正規化されたデータベースでは、本と図書館のパトロンは別々のテーブルに保持されます。しかしここでは、すべてを一つの構造に平坦化して、SQL JOINや他の時間がかかる操作を避けるようにします。そのため、書籍テーブルに書籍の詳細を追加することはできますが、パトロンテーブルにもタイトル、ページ数などを追加することができるかもしれません。これは、プログラマーがデータベーステーブルを設計する際に従来教えられてきたこととは完全に反対です。データを追加して印刷します:
INSERT INTO Library.patron (ssn, checkedOut) values (123,{'1234','5678'});
cqlsh> select * from Library.patron;
ssn | checkedout
-----+------------------
123 | {'1234', '5678'}
INSERT INTO Library.patron (ssn, checkedOut) values (123,{‘1234’,’5678’});
さて、カサンドラはパフォーマンスが全てです。したがって、コレクションカラム内のフィールドをクエリするには、まずインデックスを作成する必要があります:
create index on Library.patron (checkedOut);
今、どのパトロンが書籍番号1234を借りているかをクエリで示すことができます。contains演算子を使用することに注意してください。
select ssn from Library.patron where checkedOut contains '1234';
ssn
-----
123
これはカサンドラの概要で、始めるためのものです。今、いくつかのAPIを調査したいかもしれません。多くのプログラミング言語にカサンドラAPIがあります。また、多くのビッグデータデータベースがあるので、どのタイプがどの状況で使用されたかを見るのが役立つでしょう。
Hadoopガイド
- 初心者のためのHadoopチュートリアル:Hadoopの基本
- Hadoop管理の紹介
- Hadoopセキュリティの紹介
- Apache Flumeの紹介
- Hiveの紹介
- HDFSの紹介
- Hbaseの紹介
- Hadoopの例:5つの実世界のユースケース
- Hadoopキャリア:採用されるために
- Hadoop面接質問
- Hadoop分析の紹介
- Apache Pigの紹介
- Apache Yarnの紹介
- Hadoopアーキテクチャの紹介
- Hadoopの利点と優位性
- HadoopとApache Cassandraの使用
- Hadoop対Kubernetes:K8sとクラウドネイティブはHadoopを終わらせるのか?
- Hadoop認定
- Hadoopクラスター:紹介
- Hadoopエコシステムとコンポーネント
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。