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大数据处理平台的更多相关文章

  1. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  2. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  3. 基于 Docker 构建企业 Jenkins CI平台

    持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...

  4. 基于Docker构建企业Jenkins CI平台

  5. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  6. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  7. hadoop大数据处理平台与案例

    大数据可以说是从搜索引擎诞生之处就有了,我们熟悉的搜索引擎,如百度搜索引擎.360搜索引擎等可以说是大数据技处理技术的最早的也是比较基础的一种应用.大概在2015年大数据都还不是非常火爆,2015年可 ...

  8. 互联网大规模数据分析技术(自主模式)第五章 大数据平台与技术 第10讲 大数据处理平台Hadoop

    大规模的数据计算对于数据挖掘领域当中的作用.两大主要挑战:第一.如何实现分布式的计算 第二.分布式并行编程.Hadoop平台以及Map-reduce的编程方式解决了上面的几个问题.这是谷歌的一个最基本 ...

  9. 如何基于Go搭建一个大数据平台

    如何基于Go搭建一个大数据平台 - Go中国 - CSDN博客 https://blog.csdn.net/ra681t58cjxsgckj31/article/details/78333775 01 ...

随机推荐

  1. 【DP】 路面修整 usaco 2008 feb_gold

    题目描述: ``` FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段 ...

  2. Linux 命令 ipcs/ipcrm

    ipcs 1. 命令格式 ipcs [resource-option] [output-format] ipcs [resource-option] -i id 2. 命令功能 提供IPC设备的信息 ...

  3. loj #6485. LJJ 学二项式定理 单位根反演

    新学的黑科技,感觉好nb ~ #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s". ...

  4. 过拟合和欠拟合(Over fitting & Under fitting)

    欠拟合(Under Fitting) 欠拟合指的是模型没有很好地学习到训练集上的规律. 欠拟合的表现形式: 当模型处于欠拟合状态时,其在训练集和验证集上的误差都很大: 当模型处于欠拟合状态时,根本的办 ...

  5. mobx中的数组需要注意的地方

    mobx中如果将数组作为可观察. 可以通过添加修饰符observable或者调用observable方法. 很多的时候, 我们将此修饰为可观察的对象后, 就随处可用了. 比如,采用 map  forE ...

  6. word 插入表格,位置不在最左边

    首先想到的是 样式的问题.

  7. 坑:jmeter代理服务器录制脚本出现target controller is configured to "use recording Controller" but no such controller exists...

    配置好代理服务器后,运行代理服务器 run 报错: target controller is configured to "use recording Controller" bu ...

  8. Django基础(1)-虚拟环境的安装及配置

    virtualenv介绍 (1)做什么的?virtualenv是用于创建独立的python环境,使得多个python应用彼此独立: (2)优点: a)使不同应用开发环境独立 b)环境升级不影响其他应用 ...

  9. HTML meta pragma no-cache 页面缓存

    HTML meta pragma no-cache 页面缓存不缓存页面(为了提高速度一些浏览器会缓存浏览者浏览过的页面,通过下面的定义,浏览器一般不会缓存页面,而且浏览器无法脱机浏览.) <me ...

  10. Spring MVC原理及配置

    Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...