基于docker构建flink大数据处理平台
https://www.cnblogs.com/1ssqq1lxr/p/10417005.html
由于公司业务需求,需要搭建一套实时处理数据平台,基于多方面调研选择了Flink.
- 初始化Swarm环境(也可以选择k8s)
部署zookeeper集群 基于docker-compose ,使用 docker stack 部署在容器中,由于zookeeper存在数据持久化存储,这块后面可以考虑共享存储方案.
services:
zoo1:
image: zookeeper
restart: always
hostname: zoo1
ports:
- :
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=0.0.0.0:: server.=zoo2:: server.=zoo3:: zoo2:
image: zookeeper
restart: always
hostname: zoo2
ports:
- :
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=zoo1:: server.=0.0.0.0:: server.=zoo3:: zoo3:
image: zookeeper
restart: always
hostname: zoo3
ports:
- :
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=zoo1:: server.=zoo2:: server.=0.0.0.0::
- 部署flink镜像
version: "" services:
jobmanager:
image: flink:1.7.-scala_2.-alpine
ports:
- "8081:8081"
command: jobmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager taskmanager:
image: flink:1.7.-scala_2.-alpine
command: taskmanager
environment:
- JOB_MANAGER_RPC_ADDRESS=jobmanager
此时只是一个jobmanager 存在单机问题,可以考虑将容器内部的 fluentd.conf 挂载出来,配置zookeeper HA。
- 对于扩充 TaskManager直接 docker service scala TaskManager-NAME=3即可
Flink案例demo,采用读取kafka中数据实时处理,然后将结果存储到influxDb中展示
// 实时流main
public class SportRealTimeJob { public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
KafkaConnector connector = new KafkaConnector("192.168.30.60:9092","big-data");
env
.addSource(connector.getConsumerConnector(Lists.newArrayList("test0")))
.<MessageBody>flatMap((sentence,out)->{
MessageBody body=JSON.parseObject(sentence, MessageBody.class);
out.collect(body);
})
.shuffle()
.keyBy(messageBody -> messageBody.getPhone()+messageBody.getUserId())
.timeWindow(Time.seconds())
.reduce((t0, t1) -> new MessageBody(t0.getUserId(),t0.getPhone(),t0.getValue()+t1.getValue()))
.addSink(new InfluxWriter())
.setParallelism();
env.execute("Window WordCount");
} }
// 数据处理实体类demo
@Data
@Measurement(name = "sport")
public class MessageBody { @Column(name = "userId",tag = true)
private String userId; @Column(name = "phone",tag = true)
private String phone; @Column(name = "value")
private int value; public MessageBody() {
} public MessageBody(String userId, String phone, int value) {
this.userId = userId;
this.phone = phone;
this.value = value;
}
}
// 自定义数据输出源
public class InfluxWriter extends RichSinkFunction<MessageBody> { private InfluxTemplate template; @Override
public void open(Configuration parameters) throws Exception {
InfluxBean bean= InfluxBean.builder().dbName("game")
.url("http://localhost:8086")
.username("admin")
.password("admin")
.build();
template = new SimpleInfluxTemplate(bean);
} @Override
public void close() throws Exception {
template.close();
} @Override
public void invoke(MessageBody value, Context context) throws Exception {
template.write(Point.measurement("sport")
.addField("value",value.getValue())
.tag("userId",String.valueOf(value.getUserId()))
.tag("phone",value.getPhone())
.time(context.currentProcessingTime(), TimeUnit.MILLISECONDS).build());
}
}
// influxDb操作类
public class SimpleInfluxTemplate implements InfluxTemplate { private final InfluxDB db; public SimpleInfluxTemplate(InfluxBean bean){
this.db= InfluxDBFactory.connect(bean.getUrl(), bean.getUsername(), bean.getPassword());
db.setDatabase(bean.getDbName());
db.enableBatch(BatchOptions.DEFAULTS.exceptionHandler(
(failedPoints, throwable) -> {
/* custom error handling here */ })
.consistency(InfluxDB.ConsistencyLevel.ALL)
.bufferLimit()
);
} @Override
public void write(Point point) {
db.write(point);
} @Override
public void bentchWrite(BatchPoints points) {
db.write(points);
} @Override
public <T> List<T> query(Query query, Class<T> tClass) {
QueryResult result=db.query(query);
InfluxDBResultMapper resultMapper = new InfluxDBResultMapper(); // thread-safe - can be reused
return resultMapper.toPOJO(result, tClass);
} @Override
public void close() {
db.close();
} public interface InfluxTemplate { void write(Point point); void bentchWrite(BatchPoints points); <T> List<T> query(Query query, Class<T> tClass); void close();
} @ToString
@Getter
@Setter
@Builder
public class InfluxBean { private String url; private String username; private String password; private String dbName; }
基于docker构建flink大数据处理平台的更多相关文章
- 视频私有云实战:基于Docker构建点播私有云平台
私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...
- DevOps实践之一:基于Docker构建企业Jenkins CI平台
基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...
- 基于 Docker 构建企业 Jenkins CI平台
持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...
- 基于Docker构建企业Jenkins CI平台
- 【docker构建】基于docker构建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- hadoop大数据处理平台与案例
大数据可以说是从搜索引擎诞生之处就有了,我们熟悉的搜索引擎,如百度搜索引擎.360搜索引擎等可以说是大数据技处理技术的最早的也是比较基础的一种应用.大概在2015年大数据都还不是非常火爆,2015年可 ...
- 互联网大规模数据分析技术(自主模式)第五章 大数据平台与技术 第10讲 大数据处理平台Hadoop
大规模的数据计算对于数据挖掘领域当中的作用.两大主要挑战:第一.如何实现分布式的计算 第二.分布式并行编程.Hadoop平台以及Map-reduce的编程方式解决了上面的几个问题.这是谷歌的一个最基本 ...
- 如何基于Go搭建一个大数据平台
如何基于Go搭建一个大数据平台 - Go中国 - CSDN博客 https://blog.csdn.net/ra681t58cjxsgckj31/article/details/78333775 01 ...
随机推荐
- 从GITHUB下载源码
从昨天开始就想着从GitHub上下载一个开源的Vue的实战项目,希望能从中学习更多的Vue的实用内容,结果搞了半天好不容易下载了,不知道怎么弄.然而,今天终于成功了,激动地我赶紧来记录一下. 如何从G ...
- nginx添加系统服务(start|stop|restart|reload)
nginx添加系统服务 1.编写脚本,名为nginx #vim /etc/init.d/nginx #!/bin/bash#chkconfig: - 99 20 #description: Nginx ...
- native与H5优缺点及H5测试
一.native(原生)与H5优缺点介绍 native(原生)优点 1.运行速度快 2.可以应用到底层的API 3.便捷性与易用性 4.打开会比较节省流量 native(原生)缺点 1.不同操作系统需 ...
- Hibernate框架的查询方式
技术分析之Hibernate框架的查询方式 1. 唯一标识OID的检索方式 * session.get(对象.class,OID) 2. 对象的导航的方式 ...
- HDU - 4507 - 吉哥系列故事——恨7不成妻(数位DP,数学)
链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...
- 013——MATLAB硬件支持包离线下载
(一)参考文献:https://blog.csdn.net/hyperorbit/article/details/88095384 (二)去下列网址下载离线包下载工具:https://ww2.math ...
- neo4j 启动与关闭
neo4j开启与关闭 进入neo4j目录bin下. cd到bin目录下,执行启动命令: ./neo4j stop 另外neo4j还有其他命令,执行方式相同: neo4j { console | sta ...
- DEV C++的使用
1.点击dev图标: 2.左上角点击:文件——新建——源代码(快捷键ctrl+N): 3. 然后开始写代码: 4.点击运行: 右边的那个编译加运行(点这个),左边编译,中间运行. 5.保存(可以修改保 ...
- Saltstack cmd.run 多项命令
cmd.run 执行多个命令: sls 示例: add_site: cmd.run: - name: | C:\Windows\System32\inetsrv\appcmd.exe delete s ...
- Linux中三种SCSI target的介绍之LIO
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/scaleqiao/article/deta ...