GT

Flume也扛不住的千亿级数据,OPPO如何靠自研提升

核能气质少年 提交于 2020-03-23 23:10:25
3 月,跳不动了?>>> 一、背景 OPPO互联网业务每天产生海量的数据,如调用链跟踪系统ESA Trace,每日采样的请求数据超过千亿级别,我们需要对这些数据进行归类,聚合、过滤和存储,同时我们需要对采集到的数据进行多通道并行处理,比如并行进行关键指标告警和写入存储集群。 而数据采集系统的性能、通道隔离性、吞吐量等因素对于我们来说是一个挑战。在我们的应用场景中,开源Flume在可视化、监控、性能,以及通道隔离性等方面无法满足我们的需求。 ESA DataFlow是由OPPO互联网自研的一款高性能的数据流采集、聚合和传输框架,单节点的日均处理数据量超过百亿条。相较Flume在运维可视化、路由、并行处理能力等方面有较大的提升。 二、基本概念 ESA DataFlow是一款高性能数据流处理框架,它具有: 消息路由: 灵活的路由规则,把消息分发到不同的通道处理。 高性能: 单节点具备日处理100亿以上条数据能力。易扩展:内置常用Source、Sink,Channel开发者可灵活自定义扩展Source、Channel、Sink,也可自定义序列化方式。 监控运维: 内置管理控制台,能实时查看数据输入、缓冲以及消费速率等各项数据统计。 其内部结构如下: 1、DataEvent DataEvent是DataFlow端到端传输的基本单元,它由body和headers信息构成,由K

银行选型和排坑实战:用开源软件自建分布式数据服务平台

时光总嘲笑我的痴心妄想 提交于 2020-03-23 23:10:09
3 月,跳不动了?>>> 之前 设计篇 讲了数据拆分的方式、场景、优缺点以及实施步骤,偏方法与理论。技术篇会介绍分布式数据服务平台设计与实现,讲述如何通过技术手段解决数据拆分带来的各种问题,以及各中间件的架构与原理。 平台主要包括分布式数据访问中间件(SDK、Proxy)、平滑扩容、数据集成、管控平台等四部分。 一、分布式数据访问中间件 数据拆分后,分散在多个库与表中,但应用开发时怎样才能准确访问数据库,换言之,如何才能拿到准确的数据库连接,拼接出正确的sql(主要是实际表名),然后执行返回结果集呢? 为了尽可能减少业务侵入性,应用少做改造,往往都会抽象出一个数据访问层负责上述功能。数据访问层按实现方式不同,可分为应用自定义、数据中间件、分布式数据库三种方式,在我们项目中采用的是中间件方式,其技术架构如下: 分布式数据访问层 按照接入方式不同,数据访问中间件可以分为 SDK、Proxy (云原生架构下可能还会有sidecar方式)。 一个典型的分库分表中间件由JDBC接口实现(SDK模式)、MySQL报文解析(Proxy、Sider模式)、SQL解析器,路由计算、SQL重写, SQL执行、聚合处理、结果集合并、数据源管理、配置管理等部分构成。 1、JDBC接口实现 JDBC接口实现起来并不太难,数据库连接池都是基于此实现,本质上就是一种装饰器模式,主要就是java

【算法】莫队算法粗略讲解

混江龙づ霸主 提交于 2020-03-23 23:08:25
3 月,跳不动了?>>> 原文链接: https://cnblogs.com/ctjcalc/p/post8.html 莫队是由莫涛大佬研究出的一种非常优秀的离线算法 ,主要用来解决区间问题,甚至可以在非强制在线的情况下离线处理包括修改的操作。本文主要讲解普通莫队算法。 Copyright (C) 2020 ctjcalc,转载请注明URL,并给出原文链接,谢谢。 前置知识 分块思想 熟练掌握 STL 算法 莫队思想 先来看一道例子,给出下面的一个序列,给出一个区间,求区间和: 下标 1 2 3 4 5 6 \(A\) 2 1 1 3 4 3 如果这道题不涉及修改操作,大家都会想到预处理前缀和。现在我强制要求使用莫队,要怎么做呢?假设我们要求 \(S_{[2,4]}\) 的和,并且知道了 \(S_{[2,3]}\) ,可以想到用 \(S_{[2,3]}\) 加上 \(A_4\) ,这样就能够得到答案了。同理,如果我们知道了 \(S_{[3,4]}\) , \(S_{[2,4]} = S_{[3,4]} + A_2\) 。这些操作实际上就是移动区间的一个端点,同时把新的端点的答案合并。莫队就是这样,如果已经知道了一个区间的答案,就试图通过移动区间边界,把原来的答案与新的边界的值合并,最终让当前区间与询问的区间重合,然后记录答案。 但是,现在又有一个问题了,如果有一个序列,长度为 \

springMVC中使用 RequestBody POST请求 415 (Unsupported Media Type)

て烟熏妆下的殇ゞ 提交于 2020-03-23 23:06:40
3 月,跳不动了?>>> 前端代码: < html > < head > < base href ="<%=basePath %>" /> < meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" /> < title > Insert title here </ title > </ head > < body > < form method ="post" action ="<%=basePath%>user/login2" > < label for ="name" > 用户名 </ label > < input id ="name" type ="text" name ="username" > < br > < label for ="pass" > 密码 </ label > < input id ="pass" type ="text" name ="password" > < button type ="submit" > 提交 </ button > </ form > </ body > </ html > 后端代码: @PostMapping("/login2" ) public String loginLogic2(@RequestBody User user) {

SparkRDD函数详解

≯℡__Kan透↙ 提交于 2020-03-23 23:05:53
3 月,跳不动了?>>> 1 、 RDD 操作详解 启动spark-shell spark-shell --master spark://hdp-node-01:7077 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例: scala> val a = sc.parallelize(1 to 9, 3) scala> val b = a.map(x => x*2) scala> a.collect res10: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> b.collect res11: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18) 上述例子中把原RDD中每个元素都乘以2来产生一个新的RDD。 2) filter filter 是对RDD中的每个元素都执行一个指定的函数来过滤产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 val rdd = sc.parallelize(List(1,2,3,4,5,6)) val filterRdd = rdd.filter(_ > 5) filterRdd.collect(

如何在 Linux 中更改 MAC 地址

眉间皱痕 提交于 2020-03-23 22:49:07
3 月,跳不动了?>>> 在向你展示如何在 Linux 中更改 MAC 地址之前,让我们首先讨论为什么要更改它。 可能有几个原因。也许你不希望在公共网络上公开你的实际 MAC 地址 (也称为物理地址)?还有可能是网络管理员可能已在路由器或防火墙中阻止了特定的 MAC 地址。 一个实用的“好处”是某些公共网络(例如机场 WiFi)允许在有限的时间内免费上网。如果你还想继续使用,那么伪造 Mac 地址可能会欺骗网络,让它认为是一台新设备。这也是一个有名的原因。 我将展示更改 MAC 地址(也称为欺骗/伪造 MAC 地址)的步骤。 在 Linux 中更改 MAC 地址 让我们一步步来: 查找你的 MAC 地址和网络接口 让我们找出一些 关于 Linux 中网卡的细节 。使用此命令获取网络接口详细信息: ip link show 在输出中,你将看到一些详细信息以及 MAC 地址: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu

你知道吗,Flutter内置了10多种Button控件

佐手、 提交于 2020-03-23 22:47:14
3 月,跳不动了?>>> 注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Flutter内置了10多种Button(按钮)类控件供我们使用,了解这些控件有助于提高我们的开发速度。 RaisedButton RaisedButton是一个material风格”凸起“的按钮,基本用法: RaisedButton( child: Text('Button'), onPressed: (){ }, ) 效果: onPressed 为null或不设置时,按钮是禁用状态。 onHighlightChanged 为高亮变化回调,按下时处于高亮状态,抬起处于不高亮状态,用法如下: RaisedButton( onHighlightChanged: (high){ }, ... ) 按钮可以设置字体及各种状态颜色,总结如下: 属性 说明 textColor 字体颜色 disabledTextColor 禁用状态下字体颜色 color 背景颜色 disabledColor 禁用状态下背景颜色 highlightColor 高亮颜色,按下时的颜色 splashColor 水波纹颜色,按下松开会有水波纹效果 以textColor为例,用法如下: RaisedButton( textColor: Colors

✏️Canvas实现图片上绘画、缩放、移动和保存历史状态,纯干货(附css3转换公式)

筅森魡賤 提交于 2020-03-23 22:45:39
3 月,跳不动了?>>> 哈哈哈俺又来啦,这次带来的是canvas实现一些画布功能的文章,希望大家喜欢!这个css3变化公式可以适用于平常我们使用的 transform 属性或者是移动端我们缩放地图啊之类的都可以哟! 前言 因为也是大三了,最近俺也在找实习,之前有一个自己的小项目: github.com/zhcxk1998/S… 面试官说可以往深层次思考一下,或许加一些新的功能来增加项目的难度,他提了几个建议,其中一个就是 试卷在线批阅,老师可以在上面对作业进行批注,圈圈点点等 俺当天晚上就开始研究这个东东哈哈哈,终于被我研究出来啦! 采用的是 canvas 绘制画笔,由css3的 transform 属性来进行平移与缩放,因为呢考虑到如果用canvas的 drawImage 或者 scale 等属性进行变化,生成出来的图片也会有影响,想着直接css3变化,canvas用来做画笔等功能。大佬们有何妙招,在评论区指点指点! ( 希望大家可以留下宝贵的赞与star嘻嘻 ) 效果预览 动图是放cdn的,如果访问不了,可以登录在线尝试尝试: test.algbb.cn/#/admin/con… 公式推导 如果不想看公式如何推导,可以直接跳过看后面的具体实现~ 1. 坐标转换公式 转换公式介绍 其实一开始也是想在网上找一下有没有相关的资料,但是可惜找不到,所以就自己慢慢的推出来了

【你应该掌握的】深入浅出typescript

浪尽此生 提交于 2020-03-23 22:44:55
3 月,跳不动了?>>> 团队: skFeTeam  本文作者:高扬 介绍 TypeScript 是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集,最终会被编译为JavaScript代码。 TypeScript可以解决JavaScript弱类型和没有命名空间,难以模块化的问题,同时也增强了代码的可读性,在团队协作和大型项目中体现出更大的优势。 本文将从“基础用法、高阶用法、模块、react项目实践中的应用”四个方向展开文章,方便大家理解,都会备注列子、codesandbox上的远程代码。 基础用法 1.变量类型 代码示例 src/components/baseVar.tsx TypeScript提供与JavaScript几乎相同的数据类型( 布尔值boolean,字符串string,数字number,数组[],元组 ),此外还提供了 枚举enum 类型。 当不确定变量的数据类型或者数据类型会在代码运行过程中变化时,使用 any 来标记这些变量,使它们通过编译阶段的检查。 object 表示原始类型以外的类型,即number,string,boolean,symbol,null,undefined以外的类型。 void 用于表示没有任何类型,通常用于方法没有返回值时。void类型的变量只能赋值undefined或者null。 null 和 undefined

也许你知道 0.1 + 0.2 === 0.3 为 false,但是 1.1 + 0.2 === 1.3 呢?

一曲冷凌霜 提交于 2020-03-23 22:41:44
3 月,跳不动了?>>> 因吹斯挺 在浏览器调试窗口中输入下面两段代码,会发现一个因吹斯挺的现象: console .log( 0.1 + 0.2 === 0.3 ) // false console .log( 1.1 + 0.2 === 1.3 ) // true 复制代码 明明都是浮点数的加法,为什么表现出来的效果不一样呢?让我们一步步来揭晓谜底。 十进制转二进制 首先我们需要知道十进制是怎么转为二进制的,下面以 6.1 为例来进行说明。 整数部分 整数部分转为二进制如下图所示: 6 / 2 = 3...0 => 0 3 / 2 = 1...1 => 1 1 / 2 = 0...1 => 1 6 => 110 复制代码 也就是不断的将商除以二得到余数,直到商为0。 小数部分 小数部分转为二进制如下图所示: 0.1 * 2 = 0.2 => 0 0.2 * 2 = 0.4 => 0 0.4 * 2 = 0.8 => 0 0.8 * 2 = 1.6 => 1 0.6 * 2 = 1.2 => 1 0.2 * 2 = 0.4 => 0 … 0.1 => 000110011001100110011001100110011001100110011001100110011... 复制代码 不断的乘以二然后拿掉整数部分,直到积为0。 结合两部分,得到: 110