1. 程式人生 > >低調、奢華、有內涵的敏捷式大資料方案:Flume+Cassandra+Presto+SpagoBI

低調、奢華、有內涵的敏捷式大資料方案:Flume+Cassandra+Presto+SpagoBI

基於FacebookPresto+Cassandra的敏捷式大資料

目錄


結合實現大資料即席分析進行了介紹。Presto是為滿足互動式即席查詢需求而優化的分散式SQL查詢引擎。它支援標準ANSI SQL,包括複雜查詢,聚合,連線和視窗函式。

Cassandra以前缺少互動式即席查詢功能,甚至在CQL中不支援聚合函式。因為這個原因,Cassandra在作為資料庫使用時經常被混淆。分析Cassandra中的資料有下邊兩個框架:

1) Hadoop MapReduce

2) Spark andShark

Hadoop MapReduce用於即席查詢絕對夠慢的。Spark的RDD模型是很快的,但是執行查詢需要多次練習。Presto是可以完全獨立的執行Cassandra資料的SQL引擎。Presto的架構如下:

Presto系統架構

從上圖中可以看出Presto的執行模型完全不同於Hive/MapReduce。Hive在執行一個MapReduce任務到另外一個時,需要將查詢轉換到多個階段。每一個任務需要從磁碟讀取資料並將中間的輸出寫入磁碟。相反,Presto引擎不要使用MapReduce。它採用了自定義查詢和執行引擎設計,支援SQL。另外,改進了排程,所有的處理是在記憶體中進行,並在整個階段之間,通過網路,採用流水線處理,從而避免了不必要的I/ O和相關的延遲開銷。流水線執行模型每個階段只執行一次,流資料從一個階段到下一個階段,沒有中間停頓,這顯著減少了各種查詢的端至端時間延遲。

Apache Cassandra 是一套開源分散式 KeyValue 儲存系統。Cassandra 不是一個數據庫,它是一個混合型的非關係的資料庫。它以Amazon專有的完全分散式的Dynamo 為基礎,結合了Google BigTable 基於列族(Column Family)的資料模型。

1) 分散式;

2) 高擴充套件性;

3) 多資料中心;

4) 分散式寫操作;

5) 一致性雜湊

6) GoSSIP協議簡化叢集管理

7) 實時更新

8) 高效的資料壓縮

   Cassandra最突出的特點是寫效能優異,支援高併發、實時更新。

Cassan架構dra系統

    Presto是Facebook最新研發的資料查詢引擎,可對250PB以上的資料進行快速地互動式分析。據稱該引擎的效能是 Hive 的 10 倍以上。Presto 是一個分散式系統,執行在叢集環境中,完整的安裝包括一個協調器 (coordinator) 和多個 workers。查詢通過例如 Presto CLI 的客戶端提交到協調器,協調器負責解析、分析和安排查詢到不同的 worker 上執行。

此外,Presto 需要一個數據源來執行查詢。當前 Presto 包含支援Cassandra、Hive 的外掛。

1) 分散式;

2) 記憶體計算;

3) ANSI-SQL語法支援;

4) JDBC 驅動

5) 用於從已有資料來源中讀取資料的“聯結器”集合。聯結器包括:HDFS、Hive和Cassandra

    :在連線Cassandra資料來源時,不需要安裝Hive,也不需要HDFS。

2      環境準備

2.1    主機

IP

HOSTNAME

部署模組

192.168.0.40

NODE1

Cassandra

Presto

192.168.0.41

NODE2

Cassandra

Presto

192.168.0.42

NODE3

Cassandra

Presto

192.168.0.43

NODE4

Cassandra

Presto

192.168.0.44

NODE5:Cassandra seed

Presto  Coordinator

Cassandra

Presto

192.168.0.45

NODE6

Cassandra

Presto

192.168.0.46

NODE7

Cassandra

Presto

192.168.0.47

NODE8

Cassandra

Presto

2.2    使用者

使用Hbase使用者

[[email protected] ~]# useradd hbase

[[email protected] ~]# passwd hbase

Changing password for user hbase.

New password:

BAD PASSWORD: it is based on a dictionary word

BAD PASSWORD: is too simple

Retype new password:

passwd: all authentication tokens updated successfully.

以上命令須在8臺機器上分別執行

程式名稱

說明

apache-cassandra-2.0.10.tar.gz

Cassandra安裝程式

presto-server-0.75.tar.gz

Presto安裝程式

第一步:修改hosts檔案

[[email protected] java]# vi /etc/hosts

hosts檔案中新增,並在其它節點依次複製以下配置:

192.168.0.40 node1

192.168.0.41 node2

192.168.0.42 node3

192.168.0.43 node4

192.168.0.44 node5

192.168.0.45 node6

192.168.0.46 node7

192.168.0.47 node8

分別在8臺主機上執行以下命令:

[[email protected] ~]$ ssh-keygen -t rsa -P ""

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hbase/.ssh/id_rsa):

Created directory '/home/ hbase /.ssh'.

Your identification has been saved in /home/hbase/.ssh/id_rsa.

Your public key has been saved in /home/hbase/.ssh/id_rsa.pub.

The key fingerprint is:

93:fd:d4:b7:27:aa:10:25:66:a7:c8:b6:e6:31:4c:18 hbase @master

The key's randomart image is:

+--[ RSA 2048]----+

|                 |

|                 |

|    E   + o      |

|     + + B   .   |

|    . = S . . . .|

|     + . o o   ..|

|      * .   . ...|

|     o o .   . ..|

|      .   ...    |

+-----------------+

[[email protected] .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

[[email protected] .ssh]$ chmod 600 ~/.ssh/authorized_keys

在node5主機執行如下命令,並將完整的authorized_keys分發到各臺主機:

[[email protected] .ssh]$ scp authorized_keys [email protected]:~/.ssh/

[email protected]'s password:

authorized_keys                                                                                                                       100% 1990     1.9KB/s   00:00   

其它節點依次同樣處理。

測試node5節點到各個slave節點的ssh可用性:

[[email protected] .ssh]$ ssh slave1

Last login: Wed Aug  7 22:24:19 2013 from 192.168.0.25

[hbase @slave1 ~]$ exit

logout

Connection to slave1 closed.

其它節點依次類推。

已經安裝jdk1.7_51

3      程式安裝

[[email protected] node5 ~]$ tar -xzf apache-cassandra-2.0.10.tar.gz

[[email protected] node5 ~]$ cd apache-cassandra-2.0.10/conf/

[[email protected] conf]$ vi cassandra.yaml

cassandra.yaml內容

cluster_name: 'sunrise Cluster'

- seeds: "192.168.0.44" --> - seeds: "node IP address"

data_file_directories:

- /home/hbase/cassandra/data

commitlog_directory: /home/hbase/cassandra/commitlog

saved_caches_directory: /home/hbase/cassandra/saved_caches

listen_address: 192.168.0.44

native_transport_port: 9042

rpc_address: 192.168.0.44

rpc_port: 9160

cluster_name:這個配置項是用來標識叢集名稱的。

data_file_directories:這個配置項是用來配置Cassandra資料目錄的。

commitlog_directory: 這個配置項是用來配置Cassandra提交日誌目錄的。

saved_caches_directory:這個配置項是用來配置Cassandra快取目錄的。

listen_address:這個配置項定義了叢集中其他節點的連線方式。所以多節點的叢集必須將這個改成他實際的網絡卡地址。

listen_address:這個配置項定義了叢集中其他節點的連線方式。所以多節點的叢集必須將這個改成他實際的網絡卡地址。

rpc_address:這個配置項定義了這個節點在哪裡監聽客戶端。所以可以跟node的IP地址一樣,或者設定為0.0.0.0,如果我們想在所有的可用網絡卡介面上監聽的話。

Seeds:seeds作為連線點,當一個新的節點加入到叢集中的時候,他聯絡seeds得到其他節點的一些基礎資訊。所以在多節點中,作為種子的節點必須是所有的節點都可以通過路由連線到的。注:在多節點的叢集中,最好擁有多個seeds。多個節點作為seeds可以通過如下方式定義。

啟動:

Node1 – node8

[[email protected] cassandra

檢視狀態

Node5

[[email protected] apache-cassandra-2.0.10]$ ./bin/nodetool -host 192.168.0.44 -p 7199 status

UN  192.168.0.45  215.5 KB   256     12.8%  55a15b62-b3a9-4fa3-ad76-284ce8132ff5  rack1

UN  192.168.0.44  204.95 KB  256     11.6%  4b736f9e-d904-4d69-80f3-66492a1a0344  rack1

UN  192.168.0.47  207.25 KB  256     13.7%  0744e75b-dc9e-4be3-9cd4-9a803f141abb  rack1

UN  192.168.0.46  202.26 KB  256     12.4%  e2087e1a-6c06-4b24-9355-f27890b0e9c6  rack1

UN  192.168.0.41  180.9 KB   256     13.0%  7aac038a-8bf7-45d7-b385-a2c434ed96ff  rack1

UN  192.168.0.40  189.13 KB  256     12.7%  de8cb5e2-fce3-4735-bfc0-c21f51b1e7d8  rack1

UN  192.168.0.43  184.23 KB  256     12.3%  3ef670c3-d61e-406f-b853-20a06747cd21  rack1

UN  192.168.0.42  184.83 KB  256     11.5%  3055f3e2-7003-440c-a198-e7ff7c862ec0  rack1

建立keyspace、user表、插入資料

Node5

[[email protected] apache-cassandra-2.0.10]$ ./bin/cqlsh -u cassandra -p cassandra 192.168.0.44 9160

[cqlsh 4.1.1 | Cassandra 2.0.10 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

Use HELP for help.

cqlsh> CREATE KEYSPACE munion_db WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };

cqlsh>use munion_db;

cqlsh>create table users(user_id int primary key, fname varchar,lname varchar);

cqlsh> INSERT INTO users (user_id,  fname, lname)  VALUES (1744, 'john', 'smith');

cqlsh> INSERT INTO users (user_id,  fname, lname)  VALUES (1745, 'john', 'doe');

cqlsh> INSERT INTO users (user_id,  fname, lname)  VALUES (1746, 'john', 'smith');

cqlsh> INSERT INTO users (user_id,  fname, lname)  VALUES (1747, '測試', '測試');

cqlsh>select * from users;

user_id | fname | lname

---------+-------+---------

    1744 |  john |   smith

    1745 |  john |     doe

1746 |  john |   smith

    1747 |  測試|   測試

[[email protected]~]$ tar -xzf presto-server-0.75.tar.gz

[[email protected]~]$ cd presto-server-0.75

配置檔案內容:

node.environment=pretest

node.id=node5

node.data-dir=/home/hbase/presto-server-0.57/presto/data

配置檔案內容:

node.environment=pretest

node.id=node5

node.data-dir=/home/hbase/presto-server-0.57/presto/data

[[email protected] etc]$ cat jvm.config

-server

-Xmx6G

-XX:+UseConcMarkSweepGC

-XX:+ExplicitGCInvokesConcurrent

-XX:+CMSClassUnloadingEnabled

-XX:+AggressiveOpts

-XX:+HeapDumpOnOutOfMemoryError

-XX:OnOutOfMemoryError=kill -9 %p

-XX:PermSize=150M

-XX:MaxPermSize=150M

-XX:ReservedCodeCacheSize=150M

-Xbootclasspath/p:/home/hbase/presto-server-0.57/lib/floatingdecimal-0.1.jar

-Djava.library.path=/home/hbase/hadoop/lib/native/Linux-amd64-64>

配置檔案內容

coordinator=true #node5,其他節點設為false

#node-scheduler.include-coordinator=false

http-server.http.port=40000

task.max-memory=1GB

discovery-server.enabled=true

discovery.uri=http://node5:40000

com.facebook.presto=INFO

編輯Catalog Properties檔案,新增如下內容

connector.name=cassandra

cassandra.contact-points=node1,node2,node3,node4,node5,node6,node7,node8

啟動Presto,命令如下:

[[email protected] ~]$ cd /home/hbase/presto-server-0.75

[[email protected] ~]$./bin/launcher start

[[email protected] ~]$./bin/launcher start

[[email protected]~]$./presto --server 192.168.0.44:40000 –catalog cassandra --schema munion_db

presto:munion_db>select * from users;

presto:munion_db> user_id | fname | lname

---------+-------+---------

    1744 |  john |   smith

    1745 |  john |     doe

1746 |  john |   smith

    1747 |  測試|   測試

4      功能測試

Create tabe/view:只支援Createtabe/view as select …

支援連線:Inner join、left join、right join

聚合函式:支援count、max、min等

支援insert操作;

支援copy匯入資料;

支援kettle匯入資料;

支援程式使用JDBC介面;

Java客戶端呼叫JDBC出錯;

報表工具連線JDBC源有待驗證;

5      效能測試

未做。

6      總結

相對於Hadoop/Hive/HBase/Spark,Cassandra+Presto不失為一種大資料的敏捷方案。

Kettle提供了Cassandra的ETL元件,CQLSH提供了類似於ER的資料模型,Presto提供了跨資料來源的交叉查詢能力,並提供了豐富的SQL功能。此外,JDBC驅動提供了對程式、客戶端工具及報表工具的連線能力。

7      未盡…

因為時間和人力資源限制,不得不停止Cassandra+Presto的測試驗證工作,進一步的性

能測試也沒能去測。儘管如此,該方案仍然可認為是可行的。也許,在將來某個時間,Cassandra+Presto將被重新提及,並被採用。

Presto升級很快,現在已經到了0.78版本,在0.77中已經實現了分散式Hash功能,儘管還處於試驗階段。相對與Hadoop/HBase/Hive/Spark來說,採用Flume+Cassandra+Presto+SpagoBI無疑是一個敏捷的大資料解決方案。希望能對準備使用大資料的同道們有所幫助!