3.8 Escribir datos en ClickHouse basado en Flink
Escriba Flink para completar la operación de escritura de datos en ClickHouse y luego complete la operación de estadísticas del indicador basada en CK
3.8.1 Introducción básica de ClickHouse
ClickHouse es una base de datos de almacenamiento en columnas (DBMS) de código abierto de Yandex de Rusia en 2016. Está escrita en lenguaje C++ y se usa principalmente para consultas de procesamiento analítico en línea (OLAP). Puede usar consultas SQL para generar informes de datos de análisis en tiempo real. .
Conclusión: ClickHouse, como muchas bases de datos OLAP, tiene una velocidad de consulta de una sola tabla debido a las consultas asociadas, y la brecha entre las dos en ClickHouse es más obvia.
3.8.2 Pasos de instalación de ClickHouse
En este proyecto, solo necesitamos instalar la versión de prueba independiente para usar (instalación de nodo 2). En producción real, puede instalar directamente la versión de clúster distribuido
- 1- Establecer fuente yum
sudo yum install yum-utils
sudo rpm --import https://repo.clickhouse.com/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.com/rpm/stable/x86_64
- 2- Instalar directamente basado en yum
sudo yum install clickhouse-server clickhouse-client
- 3- Modificar el archivo de configuración
vim /etc/clickhouse-server/config.xml
修改178行: 打开这一行的注释
<listen_host>::</listen_host>
- 4- Iniciar el servidor clickhouse
systemctl start clickhouse-server
停止:
systemctl stop clickhouse-server
重启
systemctl restart clickhouse-server
- 5- Ingresa al cliente
3.8.3 Crear tabla de destino en ClickHouse
create database itcast_ck;
use itcast_ck;
create table itcast_ck.itcast_ck_ems(
id int,
sid varchar(128),
ip varchar(128),
create_time varchar(128),
session_id varchar(128),
yearInfo varchar(128),
monthInfo varchar(128),
dayInfo varchar(128),
hourInfo varchar(128),
seo_source varchar(128),
area varchar(128),
origin_channel varchar(128),
msg_count int(128),
from_url varchar(128),
PRIMARY KEY (`id`)
) ENGINE=ReplacingMergeTree();
3.8.4 Escribir código Flink para completar la escritura en CK
import com.itheima.pojo.PulsarTopicPojo;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.io.jdbc.JDBCAppendTableSink;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.pulsar.FlinkPulsarSource;
import org.apache.flink.streaming.connectors.pulsar.internal.JsonDeser;
import org.apache.flink.types.Row;
import java.sql.Types;
import java.util.Properties;
// 基于Flink完成读取Pulsar中数据将消息数据写入到clickhouse中
public class ItcastFlinkToClickHouse {
public static void main(String[] args) throws Exception {
//1. 创建Flinnk流式处理核心环境类对象 和 Table API 核心环境类对象
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//2. 添加Source组件, 从Pulsar中读取消息数据
Properties props = new Properties();
props.setProperty("topic","persistent://public/default/itcast_ems_tab");
props.setProperty("partition.discovery.interval-millis","5000");
FlinkPulsarSource<PulsarTopicPojo> pulsarSource = new FlinkPulsarSource<PulsarTopicPojo>(
"pulsar://node1:6650,node2:6650,node3:6650","http://node1:8080,node2:8080,node3:8080",
JsonDeser.of(PulsarTopicPojo.class),props);
//2.1 设置pulsarSource组件在消费数据的时候, 默认从什么位置开始消费
pulsarSource.setStartFromLatest();
DataStreamSource<PulsarTopicPojo> dataStreamSource = env.addSource(pulsarSource);
//2.2 转换数据操作: 将 PulsarTopicPojo 转换为ROW对象
SingleOutputStreamOperator<Row> rowDataSteam = dataStreamSource.map(new MapFunction<PulsarTopicPojo, Row>() {
@Override
public Row map(PulsarTopicPojo pulsarTopicPojo) throws Exception {
return Row.of(pulsarTopicPojo.getId(), pulsarTopicPojo.getSid(), pulsarTopicPojo.getIp(), pulsarTopicPojo.getCreate_time(),
pulsarTopicPojo.getSession_id(), pulsarTopicPojo.getYearInfo(), pulsarTopicPojo.getMonthInfo(), pulsarTopicPojo.getDayInfo(),
pulsarTopicPojo.getHourInfo(), pulsarTopicPojo.getSeo_source(), pulsarTopicPojo.getArea(), pulsarTopicPojo.getOrigin_channel(),
pulsarTopicPojo.getMsg_count(), pulsarTopicPojo.getFrom_url());
}
});
//2.3: 设置sink操作写入到CK操作
String insertSql = "insert into itcast_ck.itcast_ck_ems (id,sid,ip,create_time,session_id,yearInfo,monthInfo,dayInfo,hourInfo,seo_source,area,origin_channel,msg_count,from_url) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
JDBCAppendTableSink tableSink = JDBCAppendTableSink.builder()
.setDrivername("ru.yandex.clickhouse.ClickHouseDriver")
.setDBUrl("jdbc:clickhouse://node2:8123/itcast_ck")
.setQuery(insertSql)
.setBatchSize(1)
.setParameterTypes(Types.INTEGER,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.VARCHAR,Types.INTEGER,Types.VARCHAR)
.build();
tableSink.emitDataStream(rowDataSteam);
//3. 提交执行
env.execute("itcast_to_ck");
}
}
3.9 HBase se conecta a Phoenix para realizar consultas ad hoc
3.9.1.Operación de instalación de Phoenix
Phoenix es una herramienta basada en hbase que pertenece a apache. Esta herramienta proporciona una nueva forma de operar datos (SQL) en hbase. Al mismo tiempo, Phoenix hace mucho
trabajo de optimización en hbase, lo que nos permite operar hbase más efectivamente.
Para toda la operación de instalación, puede consultar el manual de instalación en los datos e instalarlo
3.9.2 Creación de tablas en Phoenix
create view "itcast_h_ems" (
"id" integer primary key,
"f1"."sid" varchar,
"f1"."ip" varchar,
"f1"."create_time" varchar,
"f1"."session_id" varchar,
"f1"."yearInfo" varchar,
"f1"."monthInfo" varchar,
"f1"."dayInfo" varchar,
"f1"."hourInfo" varchar,
"f1"."seo_source" varchar,
"f1"."area" varchar,
"f1"."origin_channel" varchar,
"f1"."msg_count" integer,
"f1"."from_url" varchar
);