趣头条基于 Flink+ClickHouse 构建实时数据分析平台

2023-11-06

摘要:本文由趣头条数据平台负责人王金海分享,主要介绍趣头条 Flink-to-Hive 小时级场景和 Flink-to-ClickHouse 秒级场景,内容分为以下四部分:

  • 一、业务场景与现状分析

  • 二、Flink-to-Hive 小时级场景

  • 三、Flink-to-ClickHouse 秒级场景

  • 四、未来发展与思考

Tips:点击「阅读原文」可下载作者分享 PPT~

一、业务场景与现状分析

 

趣头条查询的页面分为离线查询页面和实时查询页面。趣头条今年所实现的改造是在实时查询中接入了 ClickHouse 计算引擎。根据不同的业务场景,实时数据报表中会展现数据指标曲线图和详细的数据指标表。目前数据指标的采集和计算为每五分钟一个时间窗口,当然也存在三分钟或一分钟的特殊情况。数据指标数据全部从 Kafka 实时数据中导出,并导入 ClickHouse 进行计算。

二、Flink-to-Hive 小时级场景

1.小时级实现架构图

如下图所示,Database 中的 Binlog 导出到 Kafka,同时 Log Server 数据也会上报到 Kafka。所有数据实时落地到 Kafka 之后,通过 Flink 抽取到 HDFS。下图中 HDFS 到 Hive 之间为虚线,即 Flink 并非直接落地到 Hive,Flink 落地到 HDFS 后,再落地到 Hive 的时间可能是小时级、半小时级甚至分钟级,需要知道数据的 Event time 已经到何时,再触发 alter table,add partition,add location 等,写入其分区。

这时需要有一个程序监控当前 Flink 任务的数据时间已经消费到什么时候,如9点的数据,落地时需要查看 Kafka 中消费的数据是否已经到达9点,然后在 Hive 中触发分区写入。

2.实现原理

 

趣头条主要使用了 Flink 高阶版本的一个特性——StreamingFileSink。StreamingFileSink 主要有几点功能。

  • 第一,  forBulkFormat 支持 avro、parquet 格式,即列式存储格式。

  • 第二,  withBucketAssigner 自定义按数据时间分桶,此处会定义一个EventtimeBucket,既按数据时间进行数据落地到离线中。

  • 第三,  OnCheckPointRollingPolicy,根据 CheckPoint 时间进行数据落地,在一定的 CheckPoint 时间内数据落地并回稳。按照 CheckPoint 落地还有其它策略,如按照数据大小。

  • 第四,  StreamingFileSink 是 Exactly-Once 语义实现。

 

Flink 中有两个 Exactly-Once 语义实现,第一个是 Kafka,第二个是 StreamingFileSink。下图为 OnCheckPointRollingPolicy 设计的每10分钟落地一次到HDFS文件中的 demo。

 

■ 如何实现 Exactly-Once

下图左侧为一个简单的二 PC 模型。Coordinator 发送一个 prepare,执行者开始触发 ack 动作,Coordinator 收到 ack 所有消息后,所有 ack 开始触发 commit,所有执行者进行落地,将其转化到 Flink 的模型中,Source 收到 checkpoint barrier 流时,开始触发一个 snapshot。

每个算子的 CheckPoint、snapshot 都完成之后,CheckPoint 会给 Job Manager 发送 notifyCheckpointComplete。下图中二阶段模型和 Flink 模型左侧三条线部分是一致的。因此用 Flink 可以实现二阶段提交协议。

 

■ 如何使用 Flink 实现二阶段提交协议

 

首先,StreamingFileSink 实现两个接口,CheckpointedFunction 和CheckpointListener。CheckpointedFunction 实现 initializeState 和 snapshotState 函数。CheckpointListener 是 notifyCheckpointComplete 的方法实现,因此这两个接口可以实现二阶段提交语义。

  • initializeState 

initializeState 在任务启动时会触发三个动作。第一个是 commitPendingFile。实时数据落地到 Hdfs 上有三个状态。第一个状态是 in-progress ,正在进行状态。第二个状态是 pending 状态,第三个状态是 finished 状态。

initializeState 在任务启动时还会触发 restoreInProgressFile,算子实时写入。如果 CheckPoint 还未成功时程序出现问题,再次启动时 initializeState 会 commit PendingFile,然后采用 Hadoop 2.7+ 版本的 truncate 方式重置或截断 in-progress 文件。

  • invoke 

实时写入数据。

  • snapshotState 

触发 CheckPoint 时会将 in-progress 文件转化为 pending state,同时记录数据长度(truncate 方式需要截断长度)。snapshotState 并非真正将数据写入 HDFS,而是写入 ListState。Flink 在 Barrier 对齐状态时内部实现 Exactly-Once 语义,但是实现外部端到端的 Exactly-Once 语义比较困难。Flink 内部实现 Exactly-Once 通过 ListState,将数据全部存入 ListState,等待所有算子 CheckPoint 完成,再将 ListState 中的数据刷到 HDFS 中。

  • notifyCheckpointComplete 

notifyCheckpointComplete 会触发 pending 到 finished state 的数据写入。实现方法是 rename,Streaming 不断向 HDFS 写入临时文件,所有动作结束后通过 rename 动作写成正式文件。

3.跨集群多 nameservices

 

趣头条的实时集群和离线集群是独立的,离线集群有多套,实时集群目前有一套。通过实时集群写入离线集群,会产生 HDFS nameservices 问题。在实时集群中将所有离线集群的 nameservices 用 namenode HA 的方式全部打入实时集群并不合适。那么如何在任务中通过实时集群提交到各个离线集群?

如下图所示,在 Flink 任务的 resource 下面,在 HDFS 的 xml 中间加入 <final>。在 PropertyHong Kong 中添加 nameservices,如 stream 是实时集群的 namenode HA 配置,data 是即将写入的离线集群的 namenode HA 配置。那么两个集群中间的 HDFS set 不需要相互修改,直接可以在客户端实现。

4.多用户写入权限

 

实时要写入离线 HDFS,可能会涉及用户权限问题。实时提交的用户已经定义好该用户在所有程序中都是同一个用户,但离线中是多用户的,因此会造成实时和离线用户不对等。趣头条在 API 中添加了 withBucketUser 写 HDFS。配置好 nameservices后,接下来只需要知道该 HDFS 路径通过哪个用户来写,比如配置一个 stream 用户写入。

API 层级的好处是一个 Flink 程序可以指定多个不同的 HDFS 和不同的用户。多用户写入的实现是在 Hadoop file system 中加一个 ugi.do as ,代理用户。以上为趣头条使用 Flink 方式进行实时数据同步到 Hive 的一些工作。其中可能会出现小文件问题,小文件是后台程序进行定期 merge,如果 CheckPoint 间隔时间较短,如3分钟一次,会出现大量小文件问题。

三、Flink-to-ClickHouse 秒级场景

1.秒级实现架构图

 

趣头条目前有很多实时指标,平均每五分钟或三分钟计算一次,如果每一个实时指标用一个 Flink 任务,或者一个 Flink SQL 来写,比如消费一个 Kafka Topic,需要计算其日活、新增、流程等等当用户提出一个新需求时,需要改当前的 Flink 任务或者启动一个新的 Flink 任务消费 Topic。

因此会出现 Flink 任务不断修改或者不断起新的 Flink 任务的问题。趣头条尝试在 Flink 后接入 ClickHouse,实现整体的 OLAP。下图为秒级实现架构图。从 Kafka 到 Flink,到 Hive,到 ClickHouse 集群,对接外部 Horizon(实时报表),QE(实时 adhoc 查询),千寻(数据分析),用户画像(实时圈人)。

 

2.Why Flink+ClickHouse

 

  • 指标实现 sql 化描述:分析师提出的指标基本都以 SQL 进行描述。

  • 指标的上下线互不影响:一个 Flink 任务消费 Topic,如果还需要其它指标,可以保证指标的上下线互不影响。

  • 数据可回溯,方便异常排查:当日活下降,需要回溯排查是哪些指标口径的逻辑问题,比如是报的数据差异或是数据流 Kafka 掉了,或者是因为用户没有上报某个指标导致日活下降,而 Flink 则无法进行回溯。

  • 计算快,一个周期内完成所有指标计算:需要在五分钟内将成百上千的所有维度的指标全部计算完成。

  • 支持实时流,分布式部署,运维简单:支持 Kafka 数据实时流。

目前趣头条 Flink 集群有 100+ 台 32 核 128 G 3.5T SSD,日数据量 2000+ 亿,日查询量 21w+ 次,80% 查询在 1s 内完成。下图为单表测试结果。ClickHouse 单表测试速度快。但受制于架构,ClickHouse 的 Join 较弱。

下图是处理相对较为复杂的 SQL,count+group by+order by,ClickHouse 在 3.6s内完成 26 亿数据计算。

 

3.Why ClickHouse so Fast

ClickHouse 采用列式存储 +LZ4、ZSTD 数据压缩。其次,计算存储结合本地化+向量化执行。Presto 数据可能存储在 Hadoop 集群或者 HDFS 中,实时拉取数据进行计算。而 ClickHouse 计算存储本地化是指每一台计算机器存在本地 SSD 盘,只需要计算自己的数据,再进行节点合并。同时,LSM merge tree+Index。将数据写入 ClickHouse 之后,会在后台开始一个线程将数据进行 merge,做 Index 索引。如建常见的 DT 索引和小时级数据索引,以提高查询性能。第四,SIMD+LLVM 优化。SIMD 是单指令多数据集。第五,SQL 语法及 UDF 完善。ClickHouse 对此有很大需求。在数据分析或者维度下拽时需要更高的特性,如时间窗口的一部分功能点。

 

  • Merge Tree:如下图所示。第一层为实时数据写入。后台进行每一层级数据的merge。merge 时会进行数据排序,做 Index 索引。

  • ClickHouse Connector:ClickHouse 有两个概念,Local table 和Distributed table。一般是写 Local table ,读 Distributed table。ClickHouse 一般以 5~10w一个批次进行数据写入,5s一个周期。趣头条还实现了 RoundRobinClickHouseDataSource。

  • BalancedClickHouseDataSource :MySQL 中配置一个 IP 和端口号就可以写入数据,而 BalancedClickHouseDataSource 需要写 Local 表,因此必须要知道该集群有多少个 Local 表,每一个 Local 表的 IP 和端口号。如有一百台机器,需要将一百台机器的 IP 和端口号全部配置好,再进行写入。BalancedClickHouseDataSource 有两个 schedule。scheduleActualization和 scheduleConnectionsCleaning 。配置一百台机器的 IP 和端口号,会出现某些机器不连接或者服务不响应问题,scheduleActualization 会定期发现机器无法连接的问题,触发下线或删除 IP 等动作。scheduleConnectionsCleaning 会定期清理 ClickHouse 中无用的 http 请求。

  • RoundRobinClickHouseDataSource:趣头条对BalancedClickHouseDataSource 进行加强的结果,实现了三个语义。testOnBorrow 设置为 true,尝试 ping 看能否获取连接。用 ClickHouse 写入时是一个 batch,再将 testOnReturn 设置为 false,testWhileIdel 设置为true,填入官方 scheduleActualization 和 scheduleConnectionsCleaning 的功能。ClickHouse 后台不断进行 merge,如果 insert 过快使后台 merge 速度变慢,跟不上 insert,出现报错。因此需要尽量不断往下写,等写完当前机器,再写下一个机器,以5s间隔进行写入,使 merge 速度能够尽量与 insert 速度保持一致。

4.Backfill

Flink 导入 ClickHouse,在数据查询或展示报表时,会遇到一些问题,比如 Flink 任务出现故障、报错或数据反压等,或 ClickHouse 集群出现不可响应,zk 跟不上,insert 过快或集群负载等问题,这会导致整个任务出现问题。

如果流数据量突然暴增,启动 Flink 可能出现一段时间内不断追数据的情况,需要进行调整并行度等操作帮助 Flink 追数据。但这时已经出现数据积压,若还要加大 Flink 并发度处理数据,ClickHouse 限制 insert 不能过快,否则会导致恶性循环。因此当 Flink 故障或 ClickHouse 集群故障时,等待 ClickHouse 集群恢复后,Flink 任务从最新数据开始消费,不再追过去一段时间的数据,通过 Hive 将数据导入到 ClickHouse。

由于之前已经通过 Kafka 将数据实时落地到 Hive,通过 Hive 将数据写入 ClickHouse 中。ClickHouse 有分区,只需要将上一个小时的数据删除,导入 Hive 的一小时数据,就可以继续进行数据查询操作。Backfill 提供了 Flink 任务小时级容错以及 ClickHouse 集群小时级容错机制。

未来发展与思考

1.Connector SQL 化

 

目前, Flink-to-Hive 以及 Flink-to-ClickHouse 都是趣头条较为固化的场景,只需指定 HDFS 路径以及用户,其余过程都可以通过 SQL 化描述。

 

2.Delta lake

Flink 是流批一体计算引擎,但是没有流批一体的存储。趣头条会用 HBase、Kudu、Redis 等能够与 Flink 实时交互的 KV 存储进行数据计算。如计算新增问题,目前趣头条的方案是需要将 Hive 历史用户刷到 Redis 或 HBase 中,与 Flink 进行实时交互判断用户是否新增。

但因为 Hive 中的数据和 Redis 中的数据是存储为两份数据。其次 Binlog 抽取数据会涉及 delete 动作,Hbase,Kudu 支持数据修改,定期回到 Hive 中。带来的问题是 HBase,Kudu 中存在数据,Hive 又保存了一份数据,多出一份或多份数据。如果有流批一体的存储支持上述场景,当 Flink 任务过来,可以与离线数据进行实时交互,包括实时查询 Hive 数据等,可以实时判断用户是否新增,对数据进行实时修改、更新或 delete,也能支持 Hive 的批的动作存储。

未来,趣头条考虑对 Flink 做流批的存储,使 Flink 生态统一为流批结合。

点击「阅读原文」可查看作者现场分享视频~

作者介绍:

王金海,10 年互联网历练,先后在唯品会负责用户画像系统,提供人群的个性化营销服务;饿了么担任架构师,负责大数据任务调度、元数据开发、任务画像等工作;现为趣头条数据中心平台负责人,负责大数据基础计算层(spark、presto、flink、clickhouse)、平台服务层(libra 实时计算、kepler 离线调度)、数据产品层(qe即时查询、horizon 数据报表、metadata 元数据、数据权限等)、以及团队建设。

▼  更多 Flink 应用实践  


关注 Flink 中文社区,获取更多技术干货

你也「在看」吗?????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

趣头条基于 Flink+ClickHouse 构建实时数据分析平台 的相关文章

  • 最好的英文词典

    辞典对于学外语的作用 怎么强调也不过分 经常接触英语的人都知道 遇到生词不可怕 可怕的是遇到认识的单词 又不明白这句话什么意思 这个时候 辞典的作用就发挥出来了 今天一位朋友问我一句英文的意思 这是纽约时报关于作家塞林格的一个标题 Stil
  • MySQLdb._exceptions.OperationalError: (1045, “Access denied for user ‘root‘@‘localhost‘ (using passw

    migrate数据到数据库时遇到的错误 MySQLdb exceptions OperationalError 1045 Access denied for user root localhost using password NO 解决方
  • Vscode配置C/C++环境

    2022年9月20日测试配置环境 运行情况良好 第一篇文章 不足之处 敬请海涵 借鉴了一些大神的分享VSCode配置C C 环境 知乎 里面有一些详细的安装教程 我就直接省去了安装的步骤 1 官网下载Vscode 一直点击下一步 直到安装在
  • 二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four

    前言 这是一个系列文章 之前已经介绍过一些二进制安全的基础知识 这里就不过多重复提及 不熟悉的同学可以去看看我之前写的文章 二进制安全虚拟机Protostar靶场 安装 基础知识讲解 破解STACK ZERO https blog csdn
  • 如何使用 UserAccountControl 标志操纵用户帐户属性

    转载 http support microsoft com kb 305144 概要 在打开用户帐户的属性后 单击帐户选项卡 然后选中或清除 帐户选项 对话框中的复选框 则会将数值分配给 UserAccountControl 属性 分配给该
  • eclipse设置编码格式UTF-8,代码提示设置,显示代码行号,设置字体类型和大小,修改代码签名,配置jdk

    图1 设置编码格式 图2 qwertyuioplkjhgfdsazxcvbnm 图3 显示代码行号 图4 设置代码的字体类型和大小 图5 设置Console 控制台 的字体类型和大小 图6 修改代码签名 图7 eclipse配置JDK 若需
  • k8s集群中部署服务之部署描述文件准备

    微服务部署描述文件Deploy yaml 一 各微服务创建部署描述文件 1 1 mall auth server apiVersion apps v1 kind Deployment metadata name mall auth serv
  • 编译课设 (词法分析+LR1语法分析+语法制导翻译(四元式生成))

    代码已上传至 Github 完整的 VS2019 项目已上传至百度云 提取码 lql1 目录 源语言 语义动作 中间代码定义 整体框架 声明 语句 i f if if 语句
  • JS时间戳和时间之间转换

    一 时间转换时间戳 var date new Date 时间对象 var str date getTime 转换成时间戳 二 时间戳转换为时间 1 转换成形如 2018 年 1 月 4 日 14 00 00 格式 function getD
  • esp32环境安装教程---arduino IDE

    前言 1 最近突然对esp32感兴趣了 源于逛油管的时候 总是看到很多大佬使用esp32cam进行网络图传 做摄像头 个人比较感兴趣 在环境安装过程遇到了很多坑 所以在此跟大家分享一下 2 注意 如果没有魔法的人 本文不用看 因为对你没帮助
  • 使用Javascript(js)技术实现动态时钟效果—北大青鸟

    效果图 代码
  • linux命令大全 find

    参考 linux命令大全 程序员工具箱 1 命令名 find 在某个目录下搜索文件 2 使用样例 在 path 目录下递归找到名字后缀为 access log 的文件 find path name access log 在 path 目录下
  • pandas删除索引具体位置的数据

    import pandas as pd import numpy as np 想删除索引是3 和4的数据 df pd DataFrame 0 我 1 你 2 她 3 我们 5 你们 columns list AB df t df loc d
  • 浪潮 服务器数据安全管理系统,浪潮SSC运维安全管控系统

    浪潮SSC运维安全管控系统提供精细管控 运维无忧的数据中心安全解决方案 统一账号 数据中心内所有各种服务器 数据库 网络设备 中间件 业务系统的账号作为从账号 浪潮SSC的账号作为主账号 进入数据中心的每个运维人员对应一个主账号 主账号用来
  • 卷积:kernel size/padding/stride

    卷积的原理 卷积尺寸变化 输出尺寸 输入尺寸 filter尺寸 2 padding stride 1 宽和高都是这么计算的 输入图片大小为200 200 依次经过一层卷积 kernel size 5 5 padding 1 stride 2
  • 带你解决java内存爆炸和CPU100%的问题

    文章目录 java 内存爆炸 CPU100 问题分析 定位与解决 背景 堆内存溢出 问题思路整理 堆外内存分析 问题思路整理 CPU 100 问题排查 引发原因 java 内存爆炸 CPU100 问题分析 定位与解决 背景 今天给java开
  • Unity半透明物体+投射阴影+接受阴影

    前置 水流动效果 透明 物体实现半透明有透明度测试和透明度混合两种方式 不同方式接受和投射阴影的方式有所差别 透明度测试阴影效果图 正方体的阴影一部分打在了水平面上 一部分在白色平面上 由于透明度测试使得水平面的右半部分为完全透明 所以白色
  • CNVD证书获得及要求

    CNVD证书获得及要求 前言 CNVD证书 简介 要求 挖掘思路 定位目标 搜索案例 漏洞类型 证书展示 文件上传 逻辑漏洞 弱口令 ps 前言 4月份利用闲时时间对学校资产进行了一波渗透测试 发现蛮多的漏洞 这其中就发现了这次证书的漏洞厂
  • 2020-09-10 nginx 流转发 ftp 服务器报错: GnuTLS 错误 -110

    ginx 流转发 ftp 服务器报错 GnuTLS 错误 110 报错信息 filezilla ftp tls 连接 ftp 服务器没问题 访问 nginx 服务 转发到ftp 服务器会报错 如下 错误 GnuTLS 错误 110 位于 g
  • 异常值处理

    异常值处理是数据预处理中的一个重要步骤 随着大数据时代的到来 异常值处理也越来越重要 本文主要总结了一些常用的判断异常值的方法 1 3 准则 要求数据服从正态分布 认为大于 3 或小于 3 的实验数据值作为异常值 其中 为数据均值 为数据标

随机推荐

  • vscode 导入python库_vscode 导入的三方库没有代码提示的问题

    发现在vscode里面 关于tensorflow的内容都不提示 需要一个字母一个字母的敲 在tensorflow包下的 init py文件中定义了一个contrib变量表示tensorflow contrib包下的内容 但是tensorfl
  • QQ空间扫码登录协议 Java

    运行环境 服务器 Centos7 6 Docker Mysql 后端 IDEA2019 3 3 JDK1 8 Maven lombok okhttp SpringBoot fastjson log4j 前端 D2Admin Axios El
  • 为你精选86个本科软件工程专业的计算机毕业设计项目推荐

    对于即将步入毕业设计阶段的计算机专业学生们 找到合适的题目和完成项目的压力也许正在困扰着你 今天 我们会给大四的学生分享一些毕业设计项目 希望可以给正在苦恼的你提供一些帮助 一 成品列表 以下所有springboot框架项目的源码博主已经打
  • 36_windows环境debug Nginx 源码-使用 VSCode 和WSL

    文章目录 配置 WSL 编译 Nginx VSCode 安装插件 launch json 配置 WSL sudo apt get y install gcc cmake sudo apt get y install pcre sudo ap
  • Pandas知识点-逻辑运算

    Pandas知识点 逻辑运算 逻辑运算在代码中基本是必不可少的 Pandas的逻辑运算与Python基础语法中的逻辑运算存在一些差异 所以本文介绍Pandas中的逻辑运算符和逻辑运算 本文使用的数据来源于网易财经 具体下载方法可以参考 ht
  • RuntimeError: CUDA error: initialization error when calling `cusparseCreate(handle)

    原代码 tf swingbase arm torch matmul torch inverse tf base upper torch inverse tf uppernew base 改成 tf swingbase arm torch m
  • vscode中终端字体设置

    整理了一些vscode中终端字体及各种样式的设定 废话不多说 看下面 把下面的粘贴到 setting json 中 根据个人需要可以更改样式 瞎搞的 大部分应该准确 自己调试出来的 workbench colorCustomizations
  • 沈阳师范大学C++ pta第三章 指针引用

    沈阳师范大学C pta第三章 指针引用 判断题 1 字符串常量实质上是一个指向该字符串首字符的指针常量 T 2 定义一个指针数组并初始化赋值若干个字符串常量 则指针数组并不存放这些字符串 而仅仅指向各个字符串 T 3 指向整数指针的指针与指
  • idea 配置详解 (二) 之editor 详解

    3 File Settings Editor 3 1 File Settings Editor General 3 1 1 File Settings Editor General Auto Import 3 1 2 File Settin
  • Qt应用开发(基础篇)——输入对话框 QInputDialog

    一 前言 QInputDialog类继承于QDialog 是一个简单方便的对话框 用于从用户获取单个值 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签 一个输入框和标准按钮 输入内容可以字符 数字和选项 文本
  • html 浏览器存储方式

    浏览器有三种本地存储方式 1 localstorage 2 sessionStorage 3 cookie 浏览器 F12 打开调试模式 可以看到 点击对应域名 可以看到当前域名下存储的数据 是以key value形式存储的 三种方式的共同
  • 自己动手开发编译器之参考博客

    http www cnblogs com Ninputer archive 2011 06 10 2077991 html 2588239 可以参考这个博客进行开发 加油哈
  • 短视频平台-小说推文(番茄小说)推广任务详情

    字节旗下平台 番茄小说 今日头条 抖音故事 抖音漫画官方每周只出一次数据 预计每周二出上周四之前的数据 有时官方回传数据较晚 会延迟到周三出 请达人知悉 注意 再次强调 番茄拉新规则 是以设备第一次下载番茄小说后搜的第一个别名为一个有效拉新
  • vue3实现 多个input框输入 自动聚焦下一个

    我最近要实现 车牌号输入框的功能 vant里有密码输入框 功能一样 但是vant只有数字键盘 不符合我的需求 所
  • java在注解中绑定方法参数的解决方案

    我们有这样子的需求 需要记录用户操作某个方法的信息并记录到日志里面 例如 用户在保存和更新任务的时候 我们需要记录下用户的ip 具体是保存还是更新 调用的是哪个方法 保存和更新的任务名称以及操作是否成功 这里最好的技术就是spring ao
  • scrapyd,scrapy部署

    Library Frameworks Python framework Versions 3 7 bin scrapyd deploy 23 ScrapyDeprecationWarning Module scrapy utils http
  • 腾讯AI战略详解:技术社会与创新图景

    来源 腾讯研究院 概要 11月8日上午 以 开放 创想 为主题的2017腾讯全球合作伙伴大会在成都开幕 11月8日上午 以 开放 创想 为主题的2017腾讯全球合作伙伴大会在成都开幕 来自全球的350位国内外顶级大咖 500家主流媒体 数万
  • jdbc oracle 需要jar,什么jdbc jar用于oracle 11g&jdk 1.6以及如何连接到db本身

    gt Oracle将Jar与Oracle客户端或服务器安装捆绑在一起 可以在 ORACLE HOME jdbc lib ojdbc6 jar中找到 我总是用那个 gt Driver类名是oracle jdbc OracleDriver UR
  • [JavaEE系列] Thread类的基本用法

    文章目录 线程创建 第一类 继承 Thread 类 继承 Thread 类 重写 run 方法 使用匿名内部类 继承 Thread 类 重写 run 方法 第二类 实现 Runnable 接口 实现 Runnable 接口 重写 run 方
  • 趣头条基于 Flink+ClickHouse 构建实时数据分析平台

    摘要 本文由趣头条数据平台负责人王金海分享 主要介绍趣头条 Flink to Hive 小时级场景和 Flink to ClickHouse 秒级场景 内容分为以下四部分 一 业务场景与现状分析 二 Flink to Hive 小时级场景