目前我正在研究將Cassandra與Spark和Tableau結合使用進行數據分析的可能性。但是,我目前在這種設置下的表現非常糟糕,我無法想象將它用於生產目的。當我讀到Cassandra + Spark組合的表現應該是多麼出色的時候,我顯然做錯了什麼,但我找不到什麼。Tableau + Spark + Cassandra的性能極差
我的測試數據:
- 所有數據都存儲
- 查詢與50MB在單個表進行的單個節點上在選擇條件時(間隔數據)
- 列有一個索引上它
我的測試設置:
- 的MacBook 2015年,1.1千兆赫,8GB內存,SSD,OS X埃爾卡皮坦
- 虛擬盒,4GB內存,Ubuntu的14.04
- 單節點機智Datastax企業4.8.4:
- 的Apache Cassandra的2.1.12.1046
- 阿帕奇星火1.4.2.2
- 星火連接器1.4.1
- 阿帕奇節儉0.9.3
- 蜂巢連接器0.2.11
- 的Tableau(通過ODBC連接)
發現:
- 當的Tableau的變化從數據庫中需要加載的數據,它需要40秒和1.4分鐘之間的任何地方。檢索數據(這基本上是行不通的)
- 當我結合使用的Tableau與Oracle而不是卡桑德拉+星火,但在相同的虛擬框,我得到的結果幾乎在瞬間
下面是表用於查詢定義:
CREATE TABLE key.activity (
interval timestamp,
id bigint,
activity_name text,
begin_ts timestamp,
busy_ms bigint,
container_code text,
duration_ms bigint,
end_location_code text,
end_ts timestamp,
pallet_code text,
src_location_code text,
start_location_code text,
success boolean,
tgt_location_code text,
transporter_name text,
PRIMARY KEY (interval, id)
) WITH CLUSTERING ORDER BY (id ASC)
AND bloom_filter_fp_chance = 0.01
AND caching = '{"keys":"ALL", "rows_per_partition":"ALL"}'
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX activity_activity_name_idx ON key.activity (activity_name);
CREATE INDEX activity_success_idx ON key.activity (success);
CREATE INDEX activity_transporter_name_idx ON key.activity (transporter_name);
這裏是通過的Tableau產生的查詢的示例:
INFO 2016-02-10 20:22:21 org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation: Running query 'SELECT CASE WHEN 4 >= 0 THEN SUBSTRING(`activity`.`transporter_name`,1,CAST(4 AS INT)) ELSE NULL END AS `calculation_185421691185008640`,
AVG(CAST(`activity`.`busy_ms` AS DOUBLE)) AS `avg_busy_ms_ok`,
CAST((MONTH(`activity`.`interval`) - 1)/3 + 1 AS BIGINT) AS `qr_interval_ok`,
`activity`.`transporter_name` AS `transporter_name`,
YEAR(`activity`.`interval`) AS `yr_interval_ok`
FROM `key`.`activity` `activity`
GROUP BY CASE WHEN 4 >= 0 THEN SUBSTRING(`activity`.`transporter_name`,1,CAST(4 AS INT)) ELSE NULL END,
CAST((MONTH(`activity`.`interval`) - 1)/3 + 1 AS BIGINT),
`activity`.`transporter_name`,
YEAR(`activity`.`interval`)'
這裏是在52S查詢的統計數據爲例:
Spark statistics on query taken 52 secs. to complete
我試着在其他帖子中提到的分區鍵打轉轉,卻沒有看到一個顯著差異。我也嘗試啓用行緩存(Cassandra config + table屬性),但這也沒有任何效果(儘管也許我忽略了某些內容)。
即使沒有擺弄所有這些參數,我也會期望獲得至少10倍到20倍的開箱即用性能,並且我已經沒有想法做什麼了。
我在做什麼錯?我應該期待什麼樣的表現?
你能描述查詢嗎?例如,是否有加入? –
@ChrisGerken謝謝你看我的問題。我剛剛添加了一個查詢的例子。所有查詢都在單個表上執行(因此沒有聯接)。 – thedutchy