2014-08-12 13:46:46 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2014-09-30 03:48:40 +00:00
|
|
|
|
#include <DB/Parsers/formatAST.h>
|
2016-01-28 01:00:42 +00:00
|
|
|
|
#include <DB/DataStreams/IBlockOutputStream.h>
|
|
|
|
|
#include <DB/Core/Block.h>
|
2016-10-10 08:44:52 +00:00
|
|
|
|
#include <DB/Interpreters/Cluster.h>
|
2015-04-16 06:12:35 +00:00
|
|
|
|
|
2014-08-12 13:46:46 +00:00
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
class StorageDistributed;
|
|
|
|
|
|
2014-08-21 12:07:29 +00:00
|
|
|
|
/** Запись асинхронная - данные сначала записываются на локальную файловую систему, а потом отправляются на удалённые серверы.
|
|
|
|
|
* Если Distributed таблица использует более одного шарда, то для того, чтобы поддерживалась запись,
|
|
|
|
|
* при создании таблицы должен быть указан дополнительный параметр у ENGINE - ключ шардирования.
|
|
|
|
|
* Ключ шардирования - произвольное выражение от столбцов. Например, rand() или UserID.
|
|
|
|
|
* При записи блок данных разбивается по остатку от деления ключа шардирования на суммарный вес шардов,
|
|
|
|
|
* и полученные блоки пишутся в сжатом Native формате в отдельные директории для отправки.
|
|
|
|
|
* Для каждого адреса назначения (каждой директории с данными для отправки), в StorageDistributed создаётся отдельный поток,
|
|
|
|
|
* который следит за директорией и отправляет данные. */
|
2014-08-12 13:46:46 +00:00
|
|
|
|
class DistributedBlockOutputStream : public IBlockOutputStream
|
|
|
|
|
{
|
|
|
|
|
public:
|
2016-10-10 08:44:52 +00:00
|
|
|
|
DistributedBlockOutputStream(StorageDistributed & storage, const ASTPtr & query_ast, const ClusterPtr & cluster_);
|
2014-08-15 09:56:22 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
void write(const Block & block) override;
|
2014-08-12 13:46:46 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2016-01-28 01:00:42 +00:00
|
|
|
|
std::vector<IColumn::Filter> createFilters(Block block);
|
2016-01-26 01:56:42 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
void writeSplit(const Block & block);
|
2016-01-26 01:56:42 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
void writeImpl(const Block & block, const size_t shard_id = 0);
|
2016-01-26 01:56:42 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
void writeToLocal(const Block & block, const size_t repeats);
|
2016-01-26 01:56:42 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
void writeToShard(const Block & block, const std::vector<std::string> & dir_names);
|
2014-08-12 13:46:46 +00:00
|
|
|
|
|
2016-01-28 01:00:42 +00:00
|
|
|
|
private:
|
2014-08-12 13:46:46 +00:00
|
|
|
|
StorageDistributed & storage;
|
2014-08-15 09:50:05 +00:00
|
|
|
|
ASTPtr query_ast;
|
2016-10-10 08:44:52 +00:00
|
|
|
|
ClusterPtr cluster;
|
2014-08-12 13:46:46 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|