:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

Blog

cialis erfaring cialis i norge hva er kamagra cialis efeitos secundarios cialis bula viagra effekt viagra norge viagra på nett viagra nettbutikk viagra infarmed levitra comprimidos cialis uten resept cialis pris levitra eller cialis kamagra gel comprar viagra farmacia
  • Mar 20 / 2018
  • 0
Data, Ideas, Tech

技术专栏 | 微服务架构初探

作者:TalkingData 徐蓓

本译文禁止商用,转载请注明来源!

什么是微服务 

首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统Web应用,来理解什么是微服务。

传统的Web应用核心分为业务逻辑、适配器以及API或通过UI访问的Web界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。

一个打车软件的架构图如下:

尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上。

这种单体应用比较适合于小项目,优点是:

  • 开发简单直接,集中式管理
  • 基本不会重复开发
  • 功能都在本地,没有分布式的管理开销和调用开销

当然它的缺点也十分明显,特别对于互联网公司来说:

  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断
  • 代码维护难:代码功能耦合在一起,新人不知道何从下手
  • 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长
  • 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉
  • 扩展性不够:无法满足高并发情况下的业务需求

所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互相连接的微服务。一个微服务完成某个特定功能,比如乘客管理和下单管理等。每个微服务都有自己的业务逻辑和适配器。一些微服务还会提供API接口给其他微服务和应用客户端使用。

比如,前面描述的系统可被分解为:

每个业务逻辑都被分解为一个微服务,微服务之间通过REST API通信。一些微服务也会向终端用户或客户端开发API接口。但通常情况下,这些客户端并不能直接访问后台微服务,而是通过API Gateway来传递请求。API Gateway一般负责服务路由、负载均衡、缓存、访问控制和鉴权等任务。

微服务架构的优点 

微服务架构有很多重要的优点。

首先,它解决了复杂性问题。它将单体应用分解为一组服务。虽然功能总量不变,但应用程序已被分解为可管理的模块或服务。这些服务定义了明确的RPC或消息驱动的API边界。微服务架构强化了应用模块化的水平,而这通过单体代码库很难实现。因此,微服务开发的速度要快很多,更容易理解和维护。

其次,这种体系结构使得每个服务都可以由专注于此服务的团队独立开发。只要符合服务API契约,开发人员可以自由选择开发技术。这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响。

第三,微服务架构可以使每个微服务独立部署。开发人员无需协调对服务升级或更改的部署。这些更改可以在测试通过后立即部署。所以微服务架构也使得CI/CD成为可能。

最后,微服务架构使得每个服务都可独立扩展。我们只需定义满足服务部署要求的配置、容量、实例数量等约束条件即可。比如我们可以在EC2计算优化实例上部署CPU密集型服务,在EC2内存优化实例上部署内存数据库服务。

微服务架构的缺点和挑战 

实际上并不存在silver bullets,微服务架构也会给我们带来新的问题和挑战。其中一个就和它的名字类似,微服务强调了服务大小,但实际上这并没有一个统一的标准。业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程。有些开发者主张10-100行代码就应该建立一个微服务。虽然建立小型服务是微服务架构崇尚的,但要记住,微服务是达到目的的手段,而不是目标。微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署。

微服务的另一个主要缺点是微服务的分布式特点带来的复杂性。开发人员需要基于RPC或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手。

微服务的另一个挑战是分区的数据库体系和分布式事务。更新多个业务实体的业务交易相当普遍。这些类型的事务在单体应用中实现非常简单,因为单体应用往往只存在一个数据库。但在微服务架构下,不同服务可能拥有不同的数据库。CAP原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战。

微服务架构对测试也带来了很大的挑战。传统的单体WEB应用只需测试单一的REST API即可,而对微服务进行测试,需要启动它依赖的所有其他服务。这种复杂性不可低估。

微服务的另一大挑战是跨多个服务的更改。比如在传统单体应用中,若有A、B、C三个服务需要更改,A依赖B,B依赖C。我们只需更改相应的模块,然后一次性部署即可。但是在微服务架构中,我们需要仔细规划和协调每个服务的变更部署。我们需要先更新C,然后更新B,最后更新A。

部署基于微服务的应用也要复杂得多。单体应用可以简单的部署在一组相同的服务器上,然后前端使用负载均衡即可。每个应用都有相同的基础服务地址,例如数据库和消息队列。而微服务由不同的大量服务构成。每种服务可能拥有自己的配置、应用实例数量以及基础服务地址。这里就需要不同的配置、部署、扩展和监控组件。此外,我们还需要服务发现机制,以便服务可以发现与其通信的其他服务的地址。因此,成功部署微服务应用需要开发人员有更好地部署策略和高度自动化的水平。

以上问题和挑战可大体概括为:

  • API Gateway
  • 服务间调用
  • 服务发现
  • 服务容错
  • 服务部署
  • 数据调用

幸运的是,出现了很多微服务框架,可以解决以上问题。

第一代微服务框架 

Spring Cloud

Spring Cloud为开发者提供了快速构建分布式系统的通用模型的工具(包括配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等)。

主要项目包括:

  • spring cloud config:由git存储库支持的集中式外部配置管理。配置资源直接映射到Spring Environment,但是如果需要可以被非Spring应用程序使用。
  • spring cloud netflix:与各种Netflix OSS组件(Eureka,Hystrix,Zuul,Archaius等)集成。
  • spring cloud bus:用于将服务和服务实例与分布式消息传递联系起来的事件总线。用于在集群中传播状态更改(例如配置更改事件)
  • spring cloud for cloud foundry:将您的应用程序与Pivotal Cloudfoundry集成。提供服务发现实现,还可以轻松实现通过SSO和OAuth2保护资源,还可以创建Cloudfoundry服务代理。
  • spring cloud cloud foundry service broker:提供构建管理一个Cloud Foundry中服务的服务代理的起点。
  • spring cloud cluster:领导选举和通用状态模型(基于zookeeper,redis,hazelcast,Consul的抽象和实现)
  • spring cloud consul:结合Hashicorp Consul的服务发现和配置管理
  • spring cloud security:在Zuul代理中为负载平衡的OAuth2休眠客户端和认证头中继提供支持。
  • spring cloud sleuth:适用于Spring Cloud应用程序的分布式跟踪,与Zipkin,HTrace和基于日志(例如ELK)跟踪兼容。
  • spring cloud data flow:针对现代运行时的可组合微服务应用程序的云本地编排服务。易于使用的DSL,拖放式GUI和REST-API一起简化了基于微服务的数据管道的整体编排。
  • spring cloud     stream:轻量级事件驱动的微服务框架,可快速构建可连接到外部系统的应用程序。使用Apache Kafka或RabbitMQ在Spring Boot应用程序之间发送和接收消息的简单声明式模型。
  • spring cloud stream app starters:Spring Cloud任务应用程序启动器是Spring Boot应用程序,可能是任何进程,包括不会永远运行的Spring Batch作业,并且它们在有限时间的数据处理之后结束/停止。
  • spring cloud zookeeper:Zookeeper的服务发现和配置管理
  • spring cloud for amazon web services:轻松集成托管的Amazon的Web Services服务。它通过使用spring的idioms和APIs便捷集成AWS服务,例如缓存或消息API。开发人员可以围绕托管服务,不必关心基础架构来构建应用。
  • spring cloud connectors:使PaaS应用程序在各种平台上轻松连接到后端服务,如数据库和消息代理(以前称为”Spring Cloud”的项目)
  • spring cloud starters:作为基于spring boot的启动项目,降低依赖管理(在Angel.SR2后,不在作为独立项目)
  • spring cloud cli:插件支持基于Groovy预言快速创建spring cloud的组件应用

Dubbo

Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

其核心部分包含:

  • 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及”请求-响应”模式的信息交换方式。
  • 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

但是显而易见,无论是Dubbo还是Spring Cloud都只适用于特定的应用场景和开发环境,它们的设计目的并不是为了支持通用性和多语言性。并且它们只是Dev层的框架,缺少DevOps的整体解决方案(这正是微服务架构需要关注的)。而随之而来的便是Service Mesh的兴起。

下一代微服务:Service Mesh? 

Service Mesh

Service Mesh又译作”服务网格”,作为服务间通信的基础设施层。如果用一句话来解释什么是Service Mesh,可以将它比作是应用程序或者说微服务间的TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心TCP/IP这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用Service Mesh也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如Spring Cloud、OSS,现在只要交给Service Mesh就可以了。

Service Mesh有如下几个特点:

  • 应用程序间通讯的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

Service Mesh的架构如下图所示:

Service Mesh作为Sidebar运行,对应用程序来说是透明,所有应用程序间的流量都会通过它,所以对应用程序流量的控制都可以在Service Mesh中实现。

目前流行的Service Mesh开源软件有Linkerd、Envoy和Istio,而最近Buoyant(开源Linkerd的公司)又发布了基于Kubernetes的Service Mesh开源项目Conduit。

Linkerd

Linkerd是开源网络代理,设计为以服务网格部署:用于管理,控制和监控应用程序内的服务与服务间通讯的专用层。

Linkerd旨在解决Twitter,Yahoo,Google和Microsoft等公司运营大型生产系统时发现的问题。根据经验,最复杂,令人惊奇和紧急行为的来源通常不是服务本身,而是服务之间的通讯。Linkerd解决了这些问题,不仅仅是控制通讯机制,而是在其上提供一个抽象层。

它的主要特性有:

  • 负载平衡:linkerd提供了多种负载均衡算法,它们使用实时性能指标来分配负载并减少整个应用程序的尾部延迟。
  • 熔断:linkerd包含自动熔断,将停止将流量发送到被认为不健康的实例,从而使他们有机会恢复并避免连锁反应故障。
  • 服务发现:linkerd 与各种服务发现后端集成,通过删除特定的(ad-hoc)服务发现实现来帮助您降低代码的复杂性。
  • 动态请求路由:linkerd 启用动态请求路由和重新路由,允许您使用最少量的配置来设置分段服务(staging service),金丝雀(canaries),蓝绿部署(blue-green deploy),跨DC故障切换和黑暗流量(dark traffic)。
  • 重试次数和截止日期:linkerd可以在某些故障时自动重试请求,并且可以在指定的时间段之后让请求超时。
  • TLS:linkerd 可以配置为使用 TLS 发送和接收请求,您可以使用它来加密跨主机边界的通信,而不用修改现有的应用程序代码。
  • HTTP代理集成:linkerd 可以作为 HTTP 代理,几乎所有现代 HTTP 客户端都广泛支持,使其易于集成到现有应用程序中。
  • 透明代理:您可以在主机上使用 iptables 规则,设置通过 linkerd 的透明代理
  • gRPC:linkerd 支持 HTTP/2 和 TLS,允许它路由 gRPC 请求,支持高级 RPC 机制,如双向流,流程控制和结构化数据负载。
  • 分布式跟踪:linkerd 支持分布式跟踪和度量仪器,可以提供跨越所有服务的统一的可观察性。
  • 仪器仪表: linkerd 支持分布式跟踪和度量仪器,可以提供跨越所有服务的统一的可观察性。

Envoy

Envoy 是一个面向服务架构的L7代理和通信总线而设计的,这个项目诞生是出于以下目标:

对于应用程序而言,网络应该是透明的,当发生网络和应用程序故障时,能够很容易定位出问题的根源。

Envoy可提供以下特性:

  • 外置进程架构:可与任何语言开发的应用一起工作;可快速升级
  • 基于新C++11编码:能够提供高效的性能
  • L3/L4过滤器:核心是一个L3/L4网络代理,能够作为一个可编程过滤器实现不同TCP代理任务,插入到主服务当中。通过编写过滤器来支持各种任务,如原始TCP代理、HTTP代理、TLS客户端证书身份验证等。
  • HTTP L7过滤器:支持一个额外的HTTP L7过滤层。HTTP过滤器作为一个插件,插入到HTTP链接管理子系统中,从而执行不同的任务,如缓冲,速率限制,路由/转发,嗅探Amazon的DynamoDB等等。
  • 支持HTTP/2:在HTTP模式下,支持HTTP/1.1、HTTP/2,并且支持HTTP/1.1、HTTP/2双向代理。这意味着HTTP/1.1和HTTP/2,在客户机和目标服务器的任何组合都可以桥接
  • HTTP L7路由:在HTTP模式下运行时,支持根据content type、runtime values等,基于path的路由和重定向。可用于服务的前端/边缘代理
  • 支持gRPC:gRPC是一个来自谷歌的RPC框架,使用HTTP/2作为底层的多路传输。HTTP/2承载的gRPC请求和应答,都可以使用Envoy的路由和LB能力
  • 支持MongoDB L7:支持获取统计和连接记录等信息
  • 支持DynamoDB L7:支持获取统计和连接等信息
  • 服务发现:支持多种服务发现方法,包括异步DNS解析和通过REST请求服务发现服务
  • 健康检查:含有一个健康检查子系统,可以对上游服务集群进行主动的健康检查。也支持被动健康检查。
  • 高级LB:包括自动重试、断路器,全局限速,阻隔请求,异常检测。未来还计划支持请求速率控制
  • 前端代理:可作为前端代理,包括TLS、HTTP/1.1、HTTP/2,以及HTTP L7路由
  • 极好的可观察性:对所有子系统,提供了可靠的统计能力。目前支持statsd以及兼容的统计库。还可以通过管理端口查看统计信息,还支持第三方的分布式跟踪机制
  • 动态配置:提供分层的动态配置API,用户可以使用这些API构建复杂的集中管理部署

Istio

Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来建立已部署服务网络,具备负载均衡、服务间认证、监控等功能,而不需要改动任何服务代码。想要为服务增加对Istio的支持,您只需要在环境中部署一个特殊的边车(sidecar),使用Istio控制面板功能配置和管理代理,拦截微服务之间的所有网络通信。

Istio目前仅支持在Kubernetes上的服务部署,但未来版本中将支持其他环境。

Istio提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。它在服务网络中统一提供了许多关键功能:

  • 流量管理:控制服务之间的流量和API调用的流向,使得调用更可靠,并使网络在恶劣情况下更加健壮
  • 可观察性:了解服务之间的依赖关系,以及它们之间流量的本质和流向,从而提供快速识别问题的能力
  • 策略执行:将组织策略应用于服务之间的互动,确保访问策略得以执行,资源在消费者之间良好分配。策略的更改是通过配置网格而不是修改应用程序代码
  • 服务身份和安全:为网格中的服务提供可验证身份,并提供保护服务流量的能力,使其可以在不同可信度的网络上流转

Istio服务网格逻辑上分为数据面板和控制面板:

  • 数据面板由一组智能代理(Envoy)组成,代理部署为边车,调解和控制微服务之间所有的网络通信
  • 控制面板负责管理和配置代理来路由流量,以及在运行时执行策略

下图显示了构成每个面板的不同组件:

Conduit

Conduit是为Kubernetes设计的一个超轻型服务网格服务,它可透明地管理在Kubernetes上运行的服务的运行时通信,使得它们更安全可靠。Conduit提供了可见性、可靠性和安全性的功能,而无需更改代码。

Conduit service mesh也是由数据面板和控制面板组成。数据面板承载应用实际的网络流量。控制面板驱动数据面板,并对外提供北向接口。

对比

Linkerd和Envoy比较相似,都是一种面向服务通信的网络代理,均可实现诸如服务发现、请求路由、负载均衡等功能。它们的设计目标就是为了解决服务之间的通信问题,使得应用对服务通信无感知,这也是Service Mesh的核心理念。Linkerd和Envoy像是分布式的Sidebar,多个类似Linkerd和Envoy的proxy互相连接,就组成了service mesh。

而Istio则是站在了一个更高的角度,它将Service Mesh分为了Data Plane和Control Plane。Data Plane负责微服务间的所有网络通信,而Control Plane负责管理Data Plane Proxy:

并且Istio天生的支持Kubernetes,这也弥合了应用调度框架与Service Mesh之间的空隙。

关于Conduit的资料较少,从官方介绍看它的定位和功能与Istio类似。

Kubernetes + Service Mesh 

= 完整的微服务框架 

Kubernets已经成为了容器调度编排的事实标准,而容器正好可以作为微服务的最小工作单元,从而发挥微服务架构的最大优势。所以我认为未来微服务架构会围绕Kubernetes展开。

而Istio和Conduit这类Service Mesh天生就是为了Kubernetes设计,它们的出现补足了Kubernetes在微服务间服务通讯上的短板。虽然Dubbo、Spring Cloud等都是成熟的微服务框架,但是它们或多或少都会和具体语言或应用场景绑定,并只解决了微服务Dev层面的问题。若想解决Ops问题,它们还需和诸如Cloud Foundry、Mesos、Docker Swarm或Kubernetes这类资源调度框架做结合:

但是这种结合又由于初始设计和生态,有很多适用性问题需要解决。

Kubernetes则不同,它本身就是一个和开发语言无关的、通用的容器管理平台,它可以支持运行云原生和传统的容器化应用。并且它覆盖了微服务的Dev和Ops阶段,结合Service Mesh,它可以为用户提供完整端到端的微服务体验。

所以我认为,未来的微服务架构和技术栈可能是如下形式

多云平台为微服务提供了资源能力(计算、存储和网络等),容器作为最小工作单元被Kubernetes调度和编排,Service Mesh管理微服务的服务通信,最后通过API Gateway向外暴露微服务的业务接口。

我相信未来随着以Kubernetes和Service Mesh为标准的微服务框架的盛行,将大大降低微服务实施的成本,最终为微服务落地以及大规模使用提供坚实的基础和保障。

参考资料:

  • Introduction to Microservices:https://www.nginx.com/blog/introduction-to-microservices
  • Pattern: Microservice Architecture:http://microservices.io/patterns/microservices.html
  • Spring Cloud for Microservices Compared to Kubernetes:https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes
  • Istio:https://istio.io
  • Envoy:https://www.envoyproxy.io
  • Linkerd:https://linkerd.io
  • 微服务(Microservice)那点事:https://yq.aliyun.com/articles/2764?spm=a2c4e.11153959.blogcont8611.3.7ea85f19HP1APU
  • Istio中文文档:http://istio.doczh.cn
  • Linkerd中文文档:http://linkerd.doczh.cn
  • Mar 19 / 2018
  • 0
Data, Tech

两个工具帮你实现酷炫的数据可视化

你想到的数据可视化

通常可能是这样的

但我们能实现的数据可视化

还可以是这样的

这样的

以及这样的

如此高端大气酷炫的数据可视化

是如何实现的?

秘诀在于两个工具

inMap & iView

inMap

inMap是TalkingData可视化团队开源的一款基于 Canvas 的大数据可视化库,专注于大数据方向的散点、热力图、网格、聚合等方式展示,致力于让大数据可视化变得简单易用。

它具有以下特性:

  • 高性能
  • 多线程
  • 多图层叠加
  • 友好的 AP
  • 可以自定义主题

inMap 采用更加智能的地理可视化框架,主要面向从事数据可视化应用相关的工程师和设计师。

底层绘图引擎:目前基于 canvas 2d 提供基础绘图能力,基于 WebGL 的版本正在规划中;

算法:内置了经纬度墨卡托转换、文字避让算法、最佳标记点算法、自动分组标记配色算法等。

inMap 的每个算法都是为了增强用户体验,追求极致效果,打造伟大的产品。

inMap 的接口设计非常友好,希望让开发者通过简单的配置,就能快速构建出优美的可视化效果。

官网:http://inmap.talkingdata.com

GitHub:https://github.com/TalkingData/inmap

iView

iView 是TalkingData可视化团队开源的一套基于 Vue.js 的 UI 组件库,主要服务于 PC 界面的中后台产品。

它具有以下特性:

  • 高质量、功能丰富
  • 友好的 API ,自由灵活地使用空间,面向任何技术水平的开发者
  • 细致、漂亮的 UI
  • 事无巨细的文档
  • 可自定义主题

同时 iView 也是一整套的前端解决方案,包括了设计规范、多语言(目前 iView 支持 15 国语言)、自定义主题、服务端渲染。

iView 支持 Vue.js 2.x、Vue.js 1.x、服务端渲染、Nuxt.js、Electron等。

iView 目前在 GitHub 上有 13,000 多 star,从 star 数量、口碑和功能性、UI / UE上,iView 都排在全球同类产品的 Top3。

官网:https://www.iviewui.com

GitHub:https://github.com/iView/iView

 iView 新版本发布

在过去的两个多月里,iView 陆续发布了 2.9.0 和 2.10.0 两个重要版本。这两个版本总共有 255 个 commit,超过 40 项更新。来看一下,iView 具体有哪些更新:

一、日期组件 DatePicker 的重构

首先是在 2.10.0 对日期组件 DatePicker 的重构。DatePicker 是 iView 48 个组件里最复杂的组件之一。复杂的功能使得代码逻辑非常重,在许多新特性的支持上,比如兼容不同国家的日历规范等都很难在此基础上迭代,不得不推倒重来。

SergioCrisostomo 之前有开发过日期相关的 JS 库(https://github.com/SergioCrisostomo/js-calendar),所以对日期相关的功能点和 API 非常熟,iView 也是基于此库进行的重构。

新的日期组件主要增加了以下功能:

1. 范围选择支持从右往左选择。

之前在范围选择时,必须先选起点,再选终点,也就是从左往右选,但很多用户的习惯却刚好相反。该版本则同时支持两个方向的选择。

2. 新增 split-panels 属性,开启后,左右两面板可以不联动。

之前在范围选择时,左右两个面板是联动的,也就是右边永远比左边大一个月,任何一个面板切换月份或年份,另一个面板都会自动切换。该版本则可以设置为不联动,这样方便定位起始月份和结束月份。如图所示:

3. 新增 multiple 属性,开启后,可以选择多个日期。

虽然之前版本可以用其它 iView 组件组合出来一个多选的日期,但效果和交互多少会打折扣,该版本只要增加属性 multiple,就可以在一个日期面板上同时选择和呈现多个日期了。如图所示:

4. 新增属性 show-week-numbers,开启后,可以显示星期数。

增加这个属性,就可以在日历面板上显示当前是一年的第几周。如图所示:

还有其它很多项的更新,比如新增 start-date 属性,可以设置面板展开时默认显示的日期。新增属性 time-picker-options,可以在 type 为 datetime 和 datetimerange 下,配置 TimePicker 的属性,比如时间间隔 steps。完整的更新可以产看更新日志,这里不一一列举了。

二、键盘可访问性的支持

键盘的可访问性,主要是通过键盘的方向键、tab键、空格键等完成表单组件的切换和交互。在填写一个表单时(iView Form 组件),尤其有用,你可以离开鼠标,就完成一个复杂表单的填写与提交。

目前 iView 最新版本支持键盘可访问性的组件有:

Button、Input、Radio、Checkbox、Switch、AutoComplete、Slider、InputNumber。更多组件还在陆续支持中。

事实上,原生的表单控件,浏览器都是支持键盘的可访问性的,比如 <button>、<input type=”radio”> 等等。iView 对这些原生控件进行了重塑,不仅仅使得 UI 好看和统一,更重要的是功能的丰富和交互体验的提升。

目前上述的组件,都是可以通过键盘的 tab键 选中的,这是第一步,如图所示:

可以看到,组件在被选中时,外面多了一个高亮层,表明当前选中的控件,这时就可以通过键盘其它按键继续操作了,比如单选组件 Radio,在选中状态下,可以通过键盘的方向键直接切换选项;Checkbox 在被激活时,可以通过空格键选择和取消选择某小项,通过 tab 键激活下一个小项。

三、其他更新

还有一些更新,是无法直接看见和体会到的。

比如更新了大量的依赖:

  • babel 系列全部更新
  • 使用了 browserslist
  • 使用了 sourcemap

部分组件的重构,虽然功能无任何变化,但代码结构和逻辑都做了优化和可维护性设计。

还有部分组件的自动化测试、持续集成对 GitHub travis-ci 的兼容等等。

外表需要优化,内部同样也是,就像一个人,既要有外在美,也要有内在美。

这两个版本都需要感谢两位瑞典大神 SergioCrisostomo 和 Xotic750 的贡献,iView 才得以越来越完善。

完整的更新日志可以到 GitHub releases 查看:

2.9.0: https://github.com/iview/iview/releases/tag/v2.9.0

2.10.0: https://github.com/iview/iview/releases/tag/v2.10.0

数据可视化可以很简约也可以很酷炫

别让工具限制了你的想象力

  • Mar 19 / 2018
  • 0
Data, Ideas

锐眼洞察 | 手把手教你简单快速实现5种数据可视化

作者:George Seif

原文:https://towardsdatascience.com/5-quick-and-easy-data-visualizations-in-python-with-code-a2284bae952f

译者:TalkingData数据工程师 新壮

本译文禁止商用,转载请注明来源!

数据可视化是数据科学家工作中的一个重要部分。在项目的早期阶段,你通常会进行探索性数据分析(EDA),以获得对数据的一些见解。创建可视化确实有助于使数据更易懂,特别是对于更大的高维数据集。在你的项目即将结束时,重要的是能够以清晰、简明和令人信服的方式展示你的最终结果,让你的听众可以理解,而他们通常是不懂技术的客户。

Matplotlib是一种流行的Python库,可以非常容易地用来创建数据可视化。然而,每次创建一个新项目时,设置数据、参数、图形和绘图都会非常混乱和乏味。在这篇博客中,我们会使用Matplotlib库写一些快速且简单的函数,实现5种图形可视化。同时,这里有一个非常好的图表,可以为你在工作中选择合适的可视化提供参考!

根据不同情况选择合适的数据可视化技术

散点图 

散点图很好地显示了两个变量之间的关系,因为你可以直接看到数据的原始分布。您也可以通过颜色编码来查看不同组数据之间的关系,如下图所示。想可视化三个变量之间的关系吗?没问题!只需使用另一个参数,比如点大小,对第三个变量进行编码就可以,如下面的第二个图所示。

颜色分组散点图

按颜色分组并对三个变量进行了大小编码的散点图

现在该展示代码了。我们首先引入Matplotlib的pyplot并命名为“plt”。通过调用plt.subplots()创建一个新的图。我们将X轴和Y轴的数据传入ax.scatter()绘制出散点图。我们还可以设置点大小、点颜色和alpha透明度。你甚至可以设置y轴使用对数刻度。然后针对具体的图像设置标题和轴标签。这是一个好用的函数,它从端到端地创建了一个散点图!

import matplotlib.pyplot as plt
import numpy as np

def scatterplot(x_data, y_data, x_label="", y_label="", title="", color = "r", yscale_log=False):

   # Create the plot object
   _, ax = plt.subplots()

   # Plot the data, set the size (s), color and transparency (alpha)
   # of the points
   ax.scatter(x_data, y_data, s = 10, color = color, alpha = 0.75)

   if yscale_log == True:
       ax.set_yscale('log')

   # Label the axes and provide a title
   ax.set_title(title)
   ax.set_xlabel(x_label)
   ax.set_ylabel(y_label)

线形图 

当你想清楚展示一个变量随另一个变量明显变化时(例如它们有很高的协方差),最好使用线形图。让我们通过下图来说明。

我们可以清楚地看到,所有专业的百分比随着时间的推移有很大的变化。用散点图来绘制这些图形会非常混乱,很难真正理解并看出正在发生的事情。对这种情况来说,线形图则是完美的,因为它们基本上快速地给我们总结了这两个变量的协方差(百分比和时间)。同样,我们还可以使用颜色编码对其分组。

线形图示例

下面是线形图的代码。它和上面的散点图很相似,只是变量有一些细微的变化。

def lineplot(x_data, y_data, x_label="", y_label="", title=""):
   # Create the plot object
   _, ax = plt.subplots()

   # Plot the best fit line, set the linewidth (lw), color and
   # transparency (alpha) of the line
   ax.plot(x_data, y_data, lw = 2, color = '#539caf', alpha = 1)

   # Label the axes and provide a title
   ax.set_title(title)
   ax.set_xlabel(x_label)
   ax.set_ylabel(y_label)
view raw

直方图 

直方图对于显示或发现数据点的分布非常有用。看看下面的直方图,我们画出频率 vs IQ直方图。我们可以清楚地看到均值和中位数是什么。我们也可以看到它遵循高斯分布。使用直方图(而不是散点图)可以让我们清楚地看到每个bin(直方)频率之间的相对差异。使用bin(经过离散化)确实帮助我们看到“更大的图景”,因为如果我们使用所有的数据点而不是离散化后的bin,那么在可视化中可能会有很多噪音,很难看清到底发生了什么。

直方图实例

使用Matplotlib绘制直方图的代码如下所示。有两个参数需要注意。首先,n_bins参数控制我们希望我们的直方图有多少个离散箱。更多的bins会给我们提供更详细的信息,但也可能会带来噪音,使我们远离更大的画面;另一方面,减少bins给我们更多的“鸟瞰”,描述发生了什么事情而没有更详细的细节。其次,cumulative参数是一个布尔值,它允许我们选择我们的直方图是否累积。也就是说选择的是概率密度函数(PDF)还是累积密度函数(CDF)。

def histogram(data, n_bins, cumulative=False, x_label = "", y_label = "", title = ""):
   _, ax = plt.subplots()
   ax.hist(data, n_bins = n_bins, cumulative = cumulative, color = '#539caf')
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)

假设我们要比较数据中两个变量的分布。有人可能认为你必须制作两个单独的直方图,并把它们并排进行比较。但是,实际上有一个更好的方法:我们可以用不同的透明度覆盖直方图。查看下图。均匀分布被设置为透明度为0.5,这样我们就可以看到它后面是什么。这允许直接查看同一图形上的两个分布。

覆盖直方图

在代码中设置了一些用于覆盖直方图的参数。首先,我们设置水平范围来容纳两个变量分布。根据这个范围和所需的箱数,实际上可以计算每个箱子的宽度。最后,我们将两个直方图绘制在同一个图上,其中一个稍微透明一些。

# Overlay 2 histograms to compare them
def overlaid_histogram(data1, data2, n_bins = 0, data1_name="", data1_color="#539caf", data2_name="", data2_color="#7663b0", x_label="", y_label="", title=""):
   # Set the bounds for the bins so that the two distributions are fairly compared
   max_nbins = 10
   data_range = [min(min(data1), min(data2)), max(max(data1), max(data2))]
   binwidth = (data_range[1] - data_range[0]) / max_nbins


   if n_bins == 0
     bins = np.arange(data_range[0], data_range[1] + binwidth, binwidth)
   else: 
     bins = n_bins

   # Create the plot
   _, ax = plt.subplots()
   ax.hist(data1, bins = bins, color = data1_color, alpha = 1, label = data1_name)
   ax.hist(data2, bins = bins, color = data2_color, alpha = 0.75, label = data2_name)
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)
   ax.legend(loc = 'best')

柱状图 

当你试图把类别较少(大概是10个)的分类数据可视化时,柱状图最有效。如果我们有太多的类别,那么柱状图将是非常混乱,并且难以理解。它们对于分类数据是很好的,因为你可以很容易地根据柱状的形状(例如大小)来区分类别之间的区别;类别也很容易划分和进行颜色编码。我们要看3种不同类型的柱状图:常规的、分组的和堆积的。下图中代码的顺序与图的顺序一致。

常规柱状图是下面的第一个图。在barplot()函数中,x_data代表X轴上的tickers和y_data代表Y轴上的柱状高度。error线是一条在每一柱状中间的额外的线,可以画出以显示标准差。

常规柱状图

分组柱状图允许我们比较多个分类变量。看看下面的第二个柱状图。我们首先比较的变量是分数如何根据组(G1,G2等)而变化。我们还通过颜色编码比较了他们的性别。我们来看一看代码,y_data_list变量现在真的是一个列表的列表,其中每个子列表代表一个不同的组。然后我们遍历每个组,对于每个组绘制x轴上的每一个刻度条,每组也是颜色编码的。

分组柱状图

堆积柱状图非常适合可视化不同变量的类别构成。在下面的堆积柱状图中,我们一天天地比较服务器负载。通过颜色编码后的堆,我们可以很容易地看到并理解哪一台服务器每天工作最多,以及一台服务器负载如何与其他服务器进行比较。此代码遵循与分组柱状图相同的样式。除了我们遍历每个组时在旧的上面画新的条,而不是在它们旁边。

堆积柱状图

def barplot(x_data, y_data, error_data, x_label="", y_label="", title=""):
   _, ax = plt.subplots()
   # Draw bars, position them in the center of the tick mark on the x-axis
   ax.bar(x_data, y_data, color = '#539caf', align = 'center')
   # Draw error bars to show standard deviation, set ls to 'none'
   # to remove line between points
   ax.errorbar(x_data, y_data, yerr = error_data, color = '#297083', ls = 'none', lw = 2, capthick = 2)
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)

   
def stackedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
   _, ax = plt.subplots()
   # Draw bars, one category at a time
   for i in range(0, len(y_data_list)):
       if i == 0:
           ax.bar(x_data, y_data_list[i], color = colors[i], align = 'center', label = y_data_names[i])
       else:
           # For each category after the first, the bottom of the
           # bar will be the top of the last category
           ax.bar(x_data, y_data_list[i], color = colors[i], bottom = y_data_list[i - 1], align = 'center', label = y_data_names[i])
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)
   ax.legend(loc = 'upper right')

   
def groupedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
   _, ax = plt.subplots()
   # Total width for all bars at one x location
   total_width = 0.8
   # Width of each individual bar
   ind_width = total_width / len(y_data_list)
   # This centers each cluster of bars about the x tick mark
   alteration = np.arange(-(total_width/2), total_width/2, ind_width)

   # Draw bars, one category at a time
   for i in range(0, len(y_data_list)):
       # Move the bar to the right on the x-axis so it doesn't
       # overlap with previously drawn ones
       ax.bar(x_data + alteration[i], y_data_list[i], color = colors[i], label = y_data_names[i], width = ind_width)
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)
   ax.legend(loc = 'upper right')

箱线图 

我们以前研究过直方图,其对于可视化变量的分布非常有用。但是如果我们需要更多的信息呢?也许我们想更清楚地看一下标准差?也许中位数与平均值有很大的不同,因此我们有很多离群值。如果数据有倾斜,许多值集中在一边呢?

那就是箱线图发挥作用的时候了。箱线图给了我们上面所有的信息实线盒的底部和顶部总是第一和第三分位(即数据的25%和75%),以及箱内的实线总是第二分位(中位数)。“胡须”(例如虚线条一端的条线)从箱中延伸出以显示数据的范围。

由于箱线图绘制自每一个组或变量,所以设置起来相当容易。x_data是组/变量列表。Matplotlib中boxplot()函数对y_data的每一列或y_data序列中的每个向量绘制箱线图;因此x_data中每个值对应于y_data中的列/矢量。所有我们要设定的就是绘图的美学。

箱线图示例

def boxplot(x_data, y_data, base_color="#539caf", median_color="#297083", x_label="", y_label="", title=""):
   _, ax = plt.subplots()

   # Draw boxplots, specifying desired style
   ax.boxplot(y_data
              # patch_artist must be True to control box fill
              , patch_artist = True
              # Properties of median line
              , medianprops = {'color': median_color}
              # Properties of box
              , boxprops = {'color': base_color, 'facecolor': base_color}
              # Properties of whiskers
              , whiskerprops = {'color': base_color}
              # Properties of whisker caps
              , capprops = {'color': base_color})

   # By default, the tick label starts at 1 and increments by 1 for
   # each box drawn. This sets the labels to the ones we want
   ax.set_xticklabels(x_data)
   ax.set_ylabel(y_label)
   ax.set_xlabel(x_label)
   ax.set_title(title)

结论 

以上就是使用Matplotlib简单快速实现的5种数据可视化。把事情抽象成函数总能让代码更易于阅读和使用。希望你喜欢这篇文章,并学到一些新的、有用的东西。如果你没有,就随便给它一些掌声吧~

  • Mar 19 / 2018
  • 0
Ideas

锐眼洞察 | 大数据与商业智能有什么区别?

作者:Dan Kusnetzky

原文:http://www.dataversity.net/big-data-business-intelligence-whats-difference/

译者:TalkingData架构师 曾晓春

本译文禁止商用,转载请注明来源!

大数据近来在媒体上频繁的出现,但其定义和应用仍然被一些企业的决策者所回避。这些企业在商业智能(BI)的流程和应用程序上投入了大量资金,并且希望将他们一直在做的事情冠以“大数据”的名义幸福地生存下去。可惜的是,BI与大数据所处理的事情确实是不同的。

概念战正在进行 

虽然大数据是一个相对较新的学科,但它已经集合了许多新的概念,用以解释如何收集数据、如何分析数据以及如何使用数据。让我们来看看其中的一些。

野生的大数据概念 

当供应商构建产品并提供旨在处理大数据整体或领域中一些部分的服务,他们通常会提出自己的概念。希望他们的概念能够影响到其他人。这样他们可以声称他们创造了这个概念,并且所有其他供应商都在追随他们。

在“机器智能”的旗帜下,业界已开始谈论“人工智能”、“深度学习”和“机器学习”,这些术语可用于描述产品如何处理数据从而让企业从数据中获取价值。它也可用于描述工具如何找到数据中的模式和异常情况,以帮助企业的数据科学家。

如果我们关注数据是如何被使用的,我们会听到诸如“预测分析”、“智能风险评估”,甚至“大数据分析”等词语。在大数据技术用于改进时,这些词语已被大量使用在系统和应用操作、网络性能以及数据和应用安全中。

随着行业的发展,新的概念会定期出现。通常这意味着一个供应商试图以一种新的方式来定位他们的产品和服务,而不是在底层技术上提供明显提升。

最后,当供应商挥舞大数据旗帜时,他们通常会谈论企业如何审查从大量到海量的数据,以找出隐藏的规律,利用各种类型的数据的能力,并基于新的洞察来进行有意义的调整,使他们能够快速采取行动。通常,其显著的区别是在哪里以及如何部署这些技术。

企业决策者需要问的关键问题是:“为企业或组织带来的影响是什么?”以及“我们是否应该了解更多并开始使用大数据?”

BI的重点在于检查已知信息

作者Mary Pratt认为,BI利用软件和服务将数据转化为可操作的情报,从而告知组织的战略和战术业务决策。BI工具可访问和分析数据集,并在报告、摘要、仪表板、图表和地图中提供分析结果,为用户提供关于业务状态的详细情报。换句话说,商务智能是企业提出问题,并从他们的信息系统获得有用的回应。

最终,BI基于企业知识,即正在发生的事情以及需要被跟踪和了解的已经发生的事情。为此,企业建立流程和系统来收集所需数据,分析数据,然后根据分析汇报结果。企业知道需要跟踪什么、如何分析这些数据以及如何报告分析结果以及应该汇报给谁。

BI成为许多供应商的盈利来源。他们开发了构建和利用“数据仓库”的工具,并通过复杂的工具来为决策者提供有用的仪表板和报告工具。

大数据在几个重要方面与BI相关,但它们是不同的。

大数据 

另一边,大数据被认为是处理大量数据,但它的范围更广,尤其是在探索未知方面。通常,目标是通过筛选企业自己的操作和机器数据来了解要提出什么问题。一旦这些问题被知晓,BI流程就可以用于额外的探索和报告。但大数据更有趣的用途之一是在业务活动发生时将分析集成到业务操作中。所以,大数据不仅仅是解释已经发生的事情的更好方式,而是可以直接影响业务结果。

大数据面临的挑战 

大数据希望解决的难点是:

  • 如何有效地获取和存储如此大量的数据
  • 如何分析这些数据,以便企业能够更好地了解自己的业务或客户需求,以及如何满足这些需求
  • 如何收集如此大量的数据并直接支持处理和分析,特别是以一种安全的方式来满足越来越多的隐私条例
  • 企业如何筛选数据,提出重要问题,并将结果可视化
  • 减少延迟和等待时间,以便将分析纳入企业的运营中

另一种看待这个问题的方式是,企业并不完全理解正在发生的事情。它观察到其业务运营或客户需求的变化,但并未完全了解发生了什么。它可能会看到收入突然增加或减少,客户满意度或竞争环境发生变化。实时应对这些变化的能力提供了显著的竞争优势。尤其是,相较之下,BI所主要提供的商业洞察无法全面自动化的发现洞察背后的那些变化。

意想不到的变化 

当企业经历意外的或突然的变化时,他们通常会开始思考为什么会错过以及是如何错过的。

例如,竞争对手可能突然进入市场。老竞争对手可能会消失或被视为局外人的公司收购。还可能开始与其他紧密相关的市场发生合并或冲突,以导致意想不到和被认为是不受欢迎的变化。

海量数据可能提供线索

很多时候,这些企业拥有大量的数据,这些数据已经积累了很长时间,但企业根本不知道该如何处理它。这些数据可能包含运营数据,其中包括销售数据、生产数据、研究数据和天气数据。它也可能有大量来自销售点设备或制造过程控制系统的数据。它也可能包含对监管变化或其他经济变化的信息。

在了解了“大数据”的概念后,企业决策者被鼓励系统地评估这些数据,并寻找模式和异常。这些有价值的信息可以为最近获得的数据提供适当的背景信息。因此,在网页加载时,就可以根据深层的历史数据以及流式和实时操作对客户体验进行优化。

最后,他们发现了该去了解的新问题,以帮助他们了解所发生的事情并推动洞察力。这意味着他们开始明白,他们需要更智能的、由机器学习所驱动的自动化响应,来识别背景和意义,从而改善企业自身的实践。他们的目标当然是增加收入,或降低成本,或两者兼而有之。

企业将很快意识到需要新的工具和专业知识 

一旦企业开始利用大数据,决策者很快就会认识到,它需要一套不同的工具和专门知识。首先,这个领域看起来需要企业“面面俱到”,才能通过整个过程获得价值。当然,这可能是耗费时间的,并且可能最终不会获得在流程开始时所期望的价值。

我们建议最好找一些更有可能产生新价值或容易学习的简单东西。这种学习应该带来新的机会和/或改变对当前业务、产品或服务的认识,而不是对已经显而易见的事情进行痛苦的研究。

一旦踏上这段旅程,企业很快就会发现,亡羊补牢的宝贵见解并不那么具备价值。企业很快就会发现,一遍又一遍地做同样的事情而没有实现流程的自动化,意味着任何好处都可能会在流程本身造成的时间和成本增加的情况下被淹没。

通常,企业意识到它“知道”组织中的某个地方即将发生变化,甚至应该如何处理这些变化。有些时候企业会意识到利用了这些知识并获得了一些重要的好处。其他时候,企业发现没有利用上这些知识,而是被事件“蒙蔽”了。

现在是时候了 

大数据工具和流程已经发展到足够让企业在学习如何利用它们时有安全感。他们很快就会了解到,这个领域已经迅速开发出新的工具、新的方法和新的思维方式。许多专家认为数据流(Data Logistics)是关键(可参考Ted Dunning和Ellen Friedman撰写的关于“机器学习流(Machine Learning Logistics)”的文章了解更多信息)。

不要单干 

既然大数据的概念已经发展了一段时间,那么企业决策者就不必再觉得需要自食其力,并且没有路线图、没有既定的道路、也没有指引。现在有许多供应商提供工具、现成的流程和专业服务,可以很好地利用。记得从小处着手,积累经验,并在过程中逐步获得实际价值。

  • Mar 19 / 2018
  • 0
Data, Ideas

技术专栏 | 走进分布式一致性协议

作者:TalkingData 战鹏弘

本文由TalkingData原创,转载请获取授权。

在分布式系统中,每一个机器节点虽然都能明确的知道自己在进行事务操作过程中的结果是成功或失败,但却无法直接获取其它分布式节点的操作结果。因此,当一个事务操作需要跨越多个分布式节点的时候,为了保证事务处理的ACID特性,需要引入一个成为“协调者”的组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点则被称为“参与者”。协调者负责调度参与者的行为,并最终决定这些参与者是否要把事务真正进行提交。基于这个思想,衍生出了二阶段提交(2PC)和三阶段提交(3PC)。

2PC

为了使分布式系统下所有节点在进行事务处理的时候能够保持原子性和和一致性而设计的算法。

两个阶段

阶段一:提交事务请求

协调者向各个参与者发送事务内容,询问是否可以执行事务操作,等待参与者响应。

参与者接收到询问之后,执行事务操作,但是不commit,将undo和redo信息保存到事务日志中。

参与者根据执行情况向协调者返回是否可以执行事务的响应。

阶段二:执行事务提交

阶段一参与者都返回yes

协调者收到所有的yes信号之后,通知参与者执行最后的commit,参与者执行完成之后,想协调者返回ACK信息。

协调者接收到所有的ACK信息之后,完成分布式事务操作

阶段一某个参与者返回no

说明其中一个参与者无法成功执行事务,协调者通知所有参与者回滚事务。

参与者进行事务回滚,完成之后向协调者返回ACK信息

协调者接收到所有的ACK信息之后,事务中断完成

协调者的作用

阶段一

发送给参与者信息

接收参与者反馈,确定下一步需要发送给参与者的信息

阶段二

根据阶段一获得的响应,确定需要发送给参与者的信息(此时如果协调者出问题,无法通知参与者执行commit,参与者的资源会一直被锁住)

接收参与者的反馈,事务结束

注意问题

同步阻塞
第一阶段各个参与者执行事务操作的过程都是阻塞的,各个所有参与者全部完成响应之前,资源都是被加锁的,无法进行其它操作。

协调者的单点问题
两个阶段都需要协调者进行协调,第二阶段中协调者向参与者发送事务commit的新号时,一旦出问题,参与者将无法提交commit操作,资源一直会处于锁定状态,无法释放。

数据不一致
第二阶段协调者发送事务commit信息时,如果与某个参与者的连接出问题,会出现其他参与者成功提交事务,而该参与者事务无法提交,各个参与者的数据会出现不一致的情况。

3PC

阶段一(canCommit)

区别于2PC,3PC的第一阶段会询问所有的参与者是否可以进行事务提交,但是不去执行事务(2PC的第一阶段实际上去执行了事务,但是没有commit而已),这一阶段可以在不锁定资源的前提下,判断各个参与者是否能够执行事务,当然各个参与者返回yes不代表后续执行事务一定会成功。

2PC的第一阶段会真正执行事务,如果某个参与者出现问题,消耗了很长时间返回给协调者no信号,再这个很长时间内,其它的参与者会一直锁定资源,block在那里。3PC的第一阶段有效的解决了该问题。

阶段二(preCommit)

阶段二同2PC的阶段一实际上是相同的,会执行事务但是不提交,但是很大程度上减少了2PC在他的阶段一出现阻塞的问题

阶段一参与者都返回YES

各个参与者执行事务,但是不提交,返回给协调者ACK信号

阶段一有某个参与者返回no

协调者通知参与者中断事务,因为第一阶段中没有执行操作,所以不需要回滚

阶段三(doCommit)

阶段二所有参与者返回yes

说明各个参与者事务执行成功,通知参与者进行commit,返回给协调者ACK,完成事务

阶段二某个参与者返回No

通知所有参与者回滚事务,返回给协调者ACK,中断事务

注意问题

进入阶段三之后,如果协调者出现故障或者与参与者之间的连接出现问题,参与者等待commit信号超时之后,会继续进行事务提交。这种机制一定程度上在协调者故障或者连接出问题时,解决数据不一致问题。

2PC和Paxos

2PC和Paxos作为分布式一致性协议,分别适用于两类一致性:操作原子性和副本一致性。

2PC:保证分布式环境中的多台机器的操作的原子性,要么全部成功,要么全部不成功

Paxos:保证同一个数据分片的多个副本之间的数据一致性

Paxos算法

Paxos算法是莱斯利-兰伯特于1990年提出的一种基于消息传递且具有高度容错性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。

Paxos算法需要解决的问题是如何在一个可能发生机器宕机或者网络异常等异常的分布式系统中,快速且正确的在集群内部对某个数据的值达成一致,并且保证无论发生上述任何异常,都不会破坏整个系统的一致性。

分布式系统的存在为了解决单点问题,例如典型的master slave模式,一旦master宕机之后,需要将slave节点切换为master节点,条件是slave和master节点的数据是一致的,也就是说在master上的一切操作都需要同步到slave节点上,这样的slave才具备选举为master的条件。Paxos算法可以为这种数据一致性提供有效的保障。

Paxos算法可以分为两个阶段,prepare阶段和accept阶段,下面简单阐述一下这两个阶段。

prepare阶段

假设现在分布式集群中有三个节点:A、B、C,A把申请操作的请求发送给A、B、C,发送的请求会携带一个Sequence Number(这个值会不断递增,且是唯一的),接受节点在prepare阶段会拒绝接受到的任何提案号小于当前提案号的请求。

如果接受节点接收到的提案号大于当前提案号,节点会给节点A返回yes,并且不在接受提案号更小的提案,也就是说节点总会对最新的提案号做承诺。

accept阶段

如果提案者A收到了半数以上的节点返回yes,他会再次向接收节点发送accept request,仍会携带一个sequence number(n),当接收节点收到accept request信号之后,如果n是接收者接收到的最新的提案号,那么会最终通过提案,如果发现存在比n更大的提案号,拒绝该request,同时提案者会重新进行第一阶段(prepare阶段)。

具体的执行过程如下图所示:

(图片来自:https://www.cnblogs.com/cchust/p/5617989.html)

分布式一致性算法的工程实践

Chubby

Google Chubby是一个有名的分布式锁服务,Google的GFS和Big Table等大型分布式系统都是用它来解决分布式写作、元数据存储和Master选举等一系列与分布式锁相关的问题。

假设Chubby集群中有5台服务器:A B C D E,其中A是当前的master,另外4台服务器实际上是A的副本。Chubby实际运行过程中,只有作为master的A服务器会对外提供写操作服务,其他四台服务器通过Paxos协议从A服务器中同步数据的操作,Paxos协议能够有效的保证副本节点的数据和master节点之间保持一致性。

Chubby中每次提案value的选定是一个Paxos instance,提案由多个proposer提出,最终得到一个value。每次提案的选举都会计入到底层的log日志中,由于Chubby需要不间断的对外提供服务,因此会不断产生Paxos instance,事务日志也会不断增长。每个Paxos instance负责确定一个value,多个instance之间是互不相关的,可以并发进行。将Paxos每两个阶段的提交prepare→promise→propose→accept记作一个round,每个Paxos instance执行过程中可能会经历多轮round,最终才能确定最后的提案。

上述基本的Paxos算法执行过程存在可优化的地方:多个proposer的活锁问题会严重影响效率,导致一个instance最终选定提案需要执行多轮round。

实际执行过程中,可以将多个instance的prepare阶段合并成一个阶段。首先必须在多个proposer中选举出一个master作为唯一的proposer,原本多个instance之间是互相独立的,只需要保证instance内部的round序号不重复即可。现在为了合并prepare阶段,多个instance之间公用一套序号,具体做法如下:

当某个replica通过选举获得master资格后,用新分配的编号N广播一个prepare消息,这个prepare消息被所有未达成一致的instance和将来还未开始的instance共用。

当acceptor接收到prepare后,现在必须对多个instance同时做出回应,这可以封装在一个数据包中,假设最多允许K个instance同时选举,那么:

当前至多有K个未达成一致的instance,将这些未决的instance各自最新accept的value(若没有用null代替)封装进一个数据包,作为promise消息返回

同时,标记这些未决instance和所有未来instance的highestPromisedNum为N,如果N比它们原先的值大的话。这样,这些未决instance和所有未来instance都不能再accept编号小于N的proposal。

然后master就可以对所有未决instance和所有未来instance分别执行propose→accept阶段,始终使用编号N,如果这个master保持稳定的话,就再也不需要prepare→promise了。但是,一旦发现acceptor返回了一个reject消息,说明另一个master启动,用更大的编号M>N发送了Prepare消息,这时自己就要分配新的编号(必须比M更大)再次进行prepare→promise阶段。

ZooKeeper

在ZooKeeper中,client向ZooKeeper提出一个事务,例如创建一个znode,请求会发送到ZooKeeper中的所有机器上,leader需要协调事务的执行,只要集群中半数以上的机器成功执行了该事务,leader便会通知follower进行事务提交。leader作为ZooKeeper中最重要的角色,协调事务执行过程中会保存一个全局的变更序列,可以保证如果一个状态变更已经被处理了,那么所有以来的状态变更应该已经被提前处理了。
ZooKeeper中使用的分布式一致性协议ZooKeeper Atomic Broadcast(ZAB,ZooKeeper原子消息广播协议),ZAB协议的消息广播过程使用的是一个原子广播协议,类似于一个二阶段提交过程。根据客户端的事务请求,leader服务器会为其生成对应的事务poposal,并发送给集群中其余所有的机器,然后收集各自的选票,最后进行事务的提交。

与二阶段提交不同的是,ZAB协议移除了终端逻辑,所有的follower服务器要么正常反馈leader提出的事务proposal,要么抛弃leader服务器,这意味着leader可以在过半的follower服务器已经反馈ACK信号之后就开始提交事务proposal,而不需要等待所有的follower服务器都反馈响应。当时,这种简化的二阶段提交下,无法处理leader服务器崩溃退出而带来的数据不一致问题,因此ZAB协议添加了崩溃恢复模式来解决这个问题。

ZAB协议的执行过程

ZAB主要包括消息广播和崩溃恢复两个过程,进一步可以分为三个阶段,分别是发现(Discovery)、同步(Synchronization)、广播(Broadcast)阶段。ZAB的每一个分布式进程会循环执行这三个阶段,称为主进程周期。

发现:选举产生PL(prospective leader),PL收集Follower epoch(cepoch),根据follower的反馈,PL产生new epoch(每次选举产生新Leader的同时产生新epoch)。

同步:PL补齐相比follower多数派缺失的状态、之后各Follower再补齐相比PL缺失的状态,PL和follower完成状态同步后PL变为正式leader(established leader)。

广播:leader处理客户端的写操作,并将状态变更广播至follower,follower多数派通过之后leader发起将状态变更落地(deliver/commit)。

在正常运行过程中,ZAB协议会一直运行于阶段三来反复进行消息广播流程,如果出现崩溃或其他原因导致leader缺失,那么此时ZAB协议会再次进入发现阶段,选举新的leader。

leader可能在事务提交完成或者提交了一半的时候崩溃,因此leader选举算法需要确保提交已经被leader提交的事务的proposal,同时丢弃已经被跳过的事务proposal。

如果让leader选举算法能够保证新选举出来的leader服务器拥有集群中所有机器最高编号(ZXID最大)的事务proposal,那么就可以保证这个新选举出来的leader一定具有所有已经提交的提议,更为重要的是如果让具有最高编号事务的proposal机器称为leader,就可以省去leader服务器查询proposal的提交和丢弃工作这一步骤了。

  • Mar 19 / 2018
  • 0
Events

活动 | 组队打击广告欺诈,重金召唤你的加入

“广告无处不在,如果广告点击都是假的,

我们的世界将会怎样?”

如果广告点击都是假的

广告无处不在,它早已是我们生活中不可或缺的一部分,但你是否想过,如果广告点击是假的,我们的世界会怎样?

或许有人会庆幸,广告点击是假的,就无所谓广告主投放的广告需要与目标受众匹配,心急火燎地追剧时不必关心等待数十秒的广告是否会有惊喜,刷朋友圈时也无需再动动手指查看“赞助商提供的广告信息”,点击“我不感兴趣”。

但要知道,广告可是不少科技巨头的重要收入来源,无论国外的 Google、Facebook,还是国内 BAT,广告都是其营收的重要组成部分,且有逐年上涨的趋势。

图片来自:Visual Capitalist

广告也是广大企业触达客户、吸引关注、提升业务的重要方式,如果广告点击不能真实反映广告效果,不仅会让企业无法准确评估营销策略和执行,还会带来运营成本的巨大浪费。

如果这些广告点击都是假的,引发的经济问题和社会问题恐怕难以想象。

广告欺诈现象严重

广告创造如此多的商业利润,却难掩其尴尬之处,美国百货商店之父 John Wanamaker 那句广为流传的名言一语道破天机:

我知道我在广告上的投资有一半浪费了,但问题是我不知道是哪一半。

事实上,在巨额的商业利益驱动下,广告带来的不止尴尬、还有欺诈,浪费的广告费也远不止一半。

图片来自:TalkingData 2017 移动广告行业报告

TalkingData 2017 移动广告行业报告显示,2017 年移动效果广告点击总量相比 2016 年增长超过 17 倍,其中 iOS 平台点击量同比增长 1776.2%,安卓平台点击量同比增长 366.2%。

而与此同时,2017 年移动效果广告推广激活总量同比增长 41.9%,其中 iOS 平台同比增长 17.1%,安卓平台同比增长 123.2%。

点击量增速远超激活量,虚假点击刷量严重。

TalkingData

全球广告反欺诈算法大赛

一方面是广告所带来的重要价值,另一方面广告欺诈触目惊心,广告反欺诈刻不容缓。在这样的背景下,TalkingData 联合 Kaggle 共同发起 TalkingData 全球广告反欺诈算法大赛。

本次大赛将于 UTC 时间 3 月 5 日至 5 月 7 日举行,赛题已正式在 Kaggle 平台上线,5 月 28 日,获奖团队将进行结果展示。

本次大赛前三名共将获得 25,000 美元奖金,其中第一名获得奖金 12,500 美元。除此之外,你还有机会解决真正的商业问题。

  • 万元美金奖励

第一名将获得奖金 12,500 美元

  • 解决真正的商业问题

    让面向 2 万多广告主的数据驱动的广告监测产品更有效

参赛方式:

  1. 点击:https://edu.talkingdata.com/competition#/了解比赛详情
  2. 点击首页“我要参赛”前往 Kaggle 官网
  3. 注册登录 Kaggle,即可参赛

我们为你答疑解惑

如果你之前没有参加过 Kaggle 比赛或对赛题还有疑问,别担心,我们来为你答疑解惑。

3月28日晚 20:00-21:00,我们将举行一场线上微信群文字直播,为大家答疑解惑。

我们邀请了去年入选京东金融数据探索者大赛商业组Top5的 TalkingData Sniper 战队 以及算法组挑战猪脸识别、同时也是本次大赛的出题人 TalkingData 数据科学家殷尧,为大家分享以往的参赛经验,也为大家解答关于本次赛题的疑问。

直播参与方式:

1. 扫描下方二维码入群

2. 如果群成员已达上限,请扫描下方二维码或搜索添加微信号 TDU2018 (需备注:姓名+学校+专业或者姓名+公司+职位),直播开始前会统一拉大家入群。

此外,我们也准备了一些奖品,直播结束后的抽奖环节等你。

有队友携手、有奖金收获,赶快参赛吧!

  • Mar 19 / 2018
  • 0
Data

锐眼洞察 | 如何正确构建数据平台

作者:Michelle Knight

原文:Predictive Customer Analytics — Part Ihttp://www.dataversity.net/data-architecture-need-choose-right-data-platform/

译者:TalkingData数据工程师 孙强

本译文禁止商用,转载请注明来源!

做了不够理想的数据架构和数据平台,就像是买东西时找不到钱包或现金。 正如McKnight咨询集团总裁McKnight在其DATAVERSITY Database Now! Online 2017 Conference的主题演讲中提到的:“我们可能会被数据淹没,该选择合适的平台了!”

McKnight是一位经验丰富的信息管理战略家,也是《信息管理:利用数据获得竞争优势的策略》的作者。他在发言中强调:

“我们的经济完全依赖于数据的自然资源。 我们的组织拥有(数据)这个黄金资产。我们的组织在未来十年如何竞争并获得优势,完全取决于我们如何使用数据。”

作为推荐数据平台的专家,McKnight在他的职业生涯中进行了多项成熟的研究。他指出,那些更充分运用数据的行业以及行业内的企业,比那些没有充分运用数据的行业和企业做的更好。 McKnight观察到“这些表现最佳的行业和企业们正在扩展其大数据应用。”

那么,为什么现在要考虑数据架构呢? McKnight表示,我们需要摆脱“快我一些数据”和“高效的给我优质的数据”的思路,转向“快速、高效的提供所有数据”。为了实现这种需求,“是时候做些跳出常规、与众不同的事情了。”McKnight表示:

“要处理超出能力范畴的需求很难。 但是我们必须使平台正确适用于工作负载,并使其与数据集成和数据可视化一起工作。 数据仓库不再是宇宙的中心。 那些非关系型平台实际上为我们提供了有价值的参考。”

选择数据平台时该考虑什么?

对于在组织的整个数据架构中构建更高效的数据平台来说,选择正确的数据存储类型至关重要。

McKnight表示:“过去一切都是数据库。 但是现在还有很多其他的选择,比如“严格来讲不在位和字节级的数据库”的基于文件的扩展系统。 基于文件的扩展系统没有围绕数据的相同框架。他建议这样的系统尤其适用于非结构化或半结构化数据。 其他必要考虑的包括:

  • 数据存储位置:McKnight表示:“并不是必须将数据存储在数据中心。”现在有很多更具性价比的云可供选择。 比如私有云、公有云和很多混合云的选择。
  • 工作负载架构:“区分操作性或分析性的工作负载,”McKnight建议。 “短交易请求和更复杂(通常更长)的分析请求需要不同的体系结构。”分解工作负载的需求并围绕这些工作负载正确设计数据平台至关重要。
  • 内存:McKnight观察到,很多人仍执迷于HDDs(硬盘驱动器),他敦促组织“开放一点点”。现在市场上还有很多选择,比如固态硬盘(SSD) 、内存(In-Memory)以及其他较低成本的存储器。

他举了可提供超快速性能的内存数据存储作为示例: “对于选择性的工作负载,它具有很高的专用功能性,为ROI提供更多机会。 我们现在开始更多探索内存的利用。”

他将内存选择比喻为“吹动风帆的风”,这让帆船行驶的更快,并超越其他竞争对手。他表示,内存可能会“在我们进行设计过程时给出更多的容错空间。

不要忘记Data Profile

所谓数据成熟度,就是“创建一个高效的环境,我们可以向环境里添加内容,而无需每次重新开始。”为此,组织需要查看Data Profile。 “我们中的许多人在排列优先事项时是颠倒的。”McKnight说:

“我可以从Data Profile中获得很多信息。 比如数据的大小和类型、是结构化的还是非结构化的、一些示例记录以及数据输入的频率。数据来自哪里? 被访问的频率如何?数据的质量如何?”

云提供了有吸引力的选择

McKnight表示,当他与客户一起为数据平台选项融资时,“许多公司不想处理资本化支出。 他们更愿意操作他们,这就是云模式,对吧?“在思考云时,紧密集成是势在必行。

McKnight提供了以下例子:

“你可能会把你的数据仓库放到云中。 那商业智能呢,你会把它们放到云端吗?数据集成如何? MDM呢,可以放在云端吗? 以上所有都是可以的。 当开始认真思考数据,这些问题就会随之产生。”

他表示,一个成熟的数据架构“现在不是有一些、而是有很多云可以选择”。McKnight强调说,现在有不同的云模型,重要的是找到适合的。

新的选择维度

除了上述因素之外,还需要为数据平台权衡新的选择维度。 如:

  • SQL的稳健性:“SQL中有一些新发现的功能使其具有重要意义。”
  • 内置优化:全面考虑云和数据虚拟化。 优化器现在有更多的作用。
  • 即时弹性:问问自己,是否真的拥有它? 是否真的需要它?
  • 动态环境适应性:评估同时使用并发使用模式的能力。
  • 将计算从存储中分离出来:这对于云计算来说非常重要,可以分别对这两种情况进行扩展。
  • 支持多种数据:需要考虑到,会有JSON、XML和各种形式的非结构化数据流入企业数据环境。

用数据平台取得成功

基于McKnight过去几年所合作的客户,他指出:“用户数量、性能预期、数据量、分析复杂性等方面需求已经开始大幅增加”。因此,成功建立数据平台至关重要,可以通过以下方式来确定:

  • 性能:McKnight将性能视为首要点。他认为:

“我们可以通过平台决策为用户提供更好的性能。 随着他们在数据中的能力而增长并不会受到限制,因为每个查询将需要5分钟。 如果这些查询出现,他们将进入更深层次。 如果您一段时间没有考虑数据平台,那这些就不会发生。”

  • Provisioning:McKnight将其描述为“可以多快地启动并运行数据平台? 它有多敏捷?“
  • 规模:建议考虑:“我可以从小型开始再逐步扩大吗?”
  • 成本:不要过度消耗成本。 保持在组织所能负担的成本。

用数据平台取得成功

McKnight为成功搭建数据平台提供了七条最终建议:

  1. 针对不同规模的企业,现在有各种数据平台可供选择
  2. 选择正确的平台并按规划进行
  3. 从数据的存储类型、布局和工作负载架构开始
  4. 将Data Profile作为选择正确平台的重要依据
  5. 确保数据平台能够支持现有的和未指定的需求
  6. 分析平台应该是分级操作数据存储(ODS)或数据仓库(DW)或数据集市(来自DW或专门供应)或Hadoop
  7. 云现在能够提供更经济的更有吸引力的选择
  • Mar 19 / 2018
  • 0
Data

重磅!TalkingData2017年移动互联网行业发展报告

本文由TalkingData原创,转载请获取授权。

自2016年第二季度起,中国移动智能终端规模增速连续七个季度低于2%。增长困局下,移动数据的应用场景细化、与线下消费的深度融合成为了破局点。2017年的新零售、无人货架等热点,皆是围绕这两个主题。智慧经济,就是将人工智能、 大数据、互联网自动化能力融入各行各业。移动互联网推动了各行业的数字化进程。从业务数字化到效益数字化,线上线下数据融合后的数据资产将帮助企业和组织实现智能化决策,打造智慧经济。

本报告中,我们将关注增长困局下的人本洞察、移动应用、智能终端,回顾移动数据与各行各业的深化融合,并提出智慧经济趋势下的数字化转型方法论。

移动智能终端低增速时代开启已有七个季度

中国移动智能终端设备规模季度增速放缓,自2016年第二季度起,移动智能终端增速就跌破2%。移动智能终端用户规模步入低增速时代已有七个季度。

移动智能终端用户在经济发达地区集中度更高

截至2017年12月,我国移动智能终端用户TOP10省份占据了整体近六成用户。位居2017省市人均GDP排名前六位的北京、江苏 、浙江、广东作为经济发达地区,移动智能终端用户集中度更高,其智能终端用户占比要高于人口占比,人才吸附能力更强。

城市人生活愈加繁忙,生活半径在增大、通勤距离在增加

通过分析北京地区上班族的活动范围,可以观察到现代人在城市中的生活半径在扩大,长距离通勤的人群比例在增加,都市生活愈加繁忙,人们对于生活、交通便捷性的需求值得被关注。

城市存在时空折叠,均衡的资源不代表将被均衡利用

通过分析北京地区高消费与低消费人群利用商业设施的状况发现,虽然北京不同区域的商业设施配置和分布相对均衡,但两个群体对设施的利用在时间和空间上却鲜少重合。

 

男性用户占比下降,性别分布趋于平衡

2017年,随着移动智能终端用户趋于饱和,移动智能终端用户性别特征逐渐趋近人口学特征,预计2018年中国智能终端用户中男性用户占比将会下降至52.5%。

 

年轻人群仍为用户主体,90后成未来消费主力

2017年,我国移动智能终端用户中35岁及以下用户的比例达69.9%,年轻用户仍然是移动互联网用户的主体。

随着更多90后人群步入职场,他们将成长为消费主力。相比80后,他们的生活状态已被移动互联网深度影响。

90后人群开始逃离北上广深

 相比80后,90后人群城市层级分布中一线城市占比要更低。90后人群开始逃离北上广深,更多的选择郑州、武汉等区域中心城市作为个人发展的起点。

活跃用户规模下降,主流行业应用增长乏力

2017年,通讯社交、视频、游戏等主流行业应用活跃用户规模增长乏力,而教育、旅游、健康美容等行业类别应用覆盖率及活跃率出现双增长,行业潜力正在释放。

每日打开应用数量下降,首屏应用竞争加剧

移动智能终端用户平均安装与平均每日打开应用款数已连续两年出现下滑,设备一个屏幕上的应用已可基本满足日常使用。存量时代移动应用对于用户的争夺更加激烈,现有数据价值的深挖成为运营关键。

头部应用把持主流用户,新应用面临艰巨挑战

2017年,移动互联网头部应用覆盖率领先优势明显,细分行业中的TOP5应用覆盖了行业主流用户。

OPPO、vivo市场份额增长,线下渠道价值得到体现

2017年表现最为亮眼的移动智能设备品牌是主打线下渠道的OPPO与vivo,两个品牌的市场份额分别从2016年12月份的8.6%、7.3%增长至2017年12月份的12.6%、10.3%。

从派生到原生,资源融合丰富用户数据价值

移动互联网已从派生模式发展到原生模式,相比于新闻资讯、搜索、视频等派生模式服务内容,原生模式对于线下资源的融合度更高,实体资源为服务商带来更多的用户流量与交互数据资产。

运营模式过重,原生模式赛道洗牌速度加快

资源融合加重移动互联网原生模式运营成本,行业竞争成为资本之争。头部应用融资、并购速度加快,而缺少资本支持的小玩家迅速走向消亡。

资本热潮之后,共享经济用户向二三线城市下沉

作为2017年原生模式新赛道的代表,共享充电宝、无人货架在经历了初期的资本热潮后,运营模式逐渐向二三线城市倾斜,用户下沉成为验证商业模式的突破口。

双管齐下,互联网巨头布局数据融合生态

通过手机支付、微信小程序等数据融合工具的运营,以及线下对百货商超、零售集团、生鲜超市等零售业态的投资布局,阿里巴巴与腾讯正在围绕线下消费打造数据融合生态。

重构人、货、场,数据融合推动零售新探索

以盒马鲜生等生鲜超市为代表,移动数据正在融入零售各个环节,人、货、场关系被重构,交易、交互等数据的融合在推动零售产业链的数字化探索。

精准触达,移动数据深化金融服务场景

借助移动应用数据,金融服务能够精准触达大货车司机、留学生等细分人群,围绕应用描绘人群理财偏好。线上数据的融入让金融服务触达的服务场景更加细化,金融普惠性得到提升。

从数字到数字,业务决策将走向智能化

以业务数字化为起点,以效益数字化为节点,通过数据资产化、分析模型化、应用场景化、流程自动化四项能力构建,线上线下数据融合后的数据资产将帮助企业和组织实现智能化决策,打造智能化组织。

获取本报告完整版

请点击:http://mi.talkingdata.com/report-detail.html?id=719

  • Mar 19 / 2018
  • 0
Events

制衡刷量“四大术”,TalkingData Ad Tracking上线高级版作弊防护功能

在TalkingData发布的《TalkingData-2017移动广告行业报告》中,TalkingData用数据揭示了过去一年移动广告行业井喷式的刷量作弊现象。“基于TalkingData Ad Tracking移动广告监测平台数据,2017年,移动效果广告点击总量相比2016年增长超过17倍;移动效果广告推广激活总量同比增长41.9%,点击量增速远超激活,利用虚假点击刷量情况依然不容忽视。”

另一方面,从2017年的TalkingData Ad Tracking反作弊系统中,发现刷量手段层出不穷,我们归类为以下四大“术”

作弊手段一:隐身术

为了阻止监测平台利用广告追踪ID追溯设备广告行为,某些广告平台带来的新增激活用户中,70%~80%的用户开启了广告追踪限制,利用手机操作系统属性阻止监测平台获取广告追踪ID,开启“隐身模式”为所欲为。

作弊手段二:易容术

通过刷机手段,改变设备属性,每一次数据上报均为“全新身份”,规避监测平台设备唯一标识策略,利用统一设备多次上报“激活”。

作弊手段三:瞬移术

在大量基于设备ID匹配的新增激活中,存在大量点击与激活IP地址不一致的情况,比例超出合理范围,利用设备ID库“精准”刷量。

作弊手段四:分身术

在“洪水”般的点击中,同一设备在同一时间上报多次点击数据,真可谓“分身有术”。

正所谓“魔高一尺道高一丈”,所有“小伎俩”并未躲过TalkingData Ad Tracking反作弊系统的监测。针对愈发“专业”的作弊手段,近日TalkingData Ad Tracking上线了高级版作弊防护功能:

  • 可疑设备分析:基于TalkingData设备库与用户行为分析结果,监测统计“隐身”设备与“易容”设备,分析其带来的点击、激活数据。
  • 转化异常分析:针对“瞬移术”激活,新增IP位置迁移激活占比分析;在基础版转化时差分析基础上,提供秒级转化时差分布分析。
  • IP频次分布:提供不同广告行为频次IP下的行为分布分析,更直观发现高频异常广告行为。
  • 点击碰撞分析:实时监测统计“分身术”设备带来的异常广告行为数据。

福利来了!福利来了!福利来了!

新年伊始,TalkingData为所有用户提供了作弊防护高级版7日免费试用权限,预知更多详情,欢迎登录TalkingData使用高级版作弊防护(地址:http://www.talkingdata.com/product-AdTracking.jsp?languagetype=zh_cn)!

  • Mar 19 / 2018
  • 0
Ideas

技术专栏 | 利用HDFS备份实现Elasticsearch容灾

作者:TalkingData数据工程师 杨双亮

本文由TalkingData原创,转载请获取授权。

01 问题

Elasticsearch 副本提供了高可靠性;它们让你可以容忍零星的节点丢失而不会中断服务。但是,副本并不提供对灾难性故障的保护。对这种情况,你需要的是对集群真正的备份——在某些东西确实出问题的时候有一个完整的拷贝。

02 解决方案

通过快照的方式,将Elasticsearch集群中的数据,备份到HDFS上,这样数据即存在于Elasticsearch(以下简称ES)集群当中,又存在于HDFS上。当ES集群出现不可恢复性的故障时,可以将数据从HDFS上快速恢复。

ES集群快照存在版本兼容性问题,请注意:

  • A snapshot of an index created in 5.x can be restored to 6.x.
  • A snapshot of an index created in 2.x can be restored to 5.x.
  • A snapshot of an index created in 1.x can be restored to 2.x.

03 操作步骤

插件GitHub地址:https://github.com/elastic/elasticsearch-hadoop/tree/master/repository-hdfs

下载地址:https://download.elastic.co/elasticsearch/elasticsearch-repository-hdfs/elasticsearch-repository-hdfs-2.2.0-hadoop2.zip

  • 在线安装

进入ES的目录,执行命令:bin/elasticsearch-plugin install repository-hdfs

  • 离线安装

现将下载好的zip包,放在指定目录,如/home/hadoop/elk/es-reporitory.zip,然后执行命令:bin/plugin install file:///home/hadoop/elk/es-reporitory.zip

显示:

-> Installing from file:/home/hadoop/elk/elasticsearch-repository-hdfs-2.2.0-hadoop2.zip…
Trying file:/home/hadoop/elk/elasticsearch-repository-hdfs-2.2.0-hadoop2.zip …
Downloading ……………..DONE
Verifying file:/home/hadoop/elk/elasticsearch-repository-hdfs-2.2.0-hadoop2.zip checksums if available …
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
ERROR: Plugin [repository-hdfs] is incompatible with Elasticsearch [2.3.3]. Was designed for version [2.2.0]

注意:应当选择与你使用ES版本的插件,由于我们使用的ES版本是2.3.3,而使用的插件版本是2.2.0 ,故可以先解压,修改plugin-descriptor.properties

解压,修改plugin-descriptor.properties:

name=repository-hdfs
description=Elasticsearch HDFS Repository
version=2.3.3
classname=org.elasticsearch.plugin.hadoop.hdfs.HdfsPlugin

elasticsearch.version=2.3.3
java.version=1.7
jvm=true

重新打包为es-reporitory.zip,再执行(最好使用root权限);使用Hadoop权限,会出现以下信息:

bin/plugin install file:///home/hadoop/elk/es-reporitory.zip
-> Installing from file:/home/hadoop/elk/es-reporitory.zip...
Trying file:/home/hadoop/elk/es-reporitory.zip ...
Downloading ......................DONE
Verifying file:/home/hadoop/elk/es-reporitory.zip checksums if available ...
NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessClassInPackage.sun.security.krb5
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission loadLibrary.jaas_nt
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission shutdownHooks
* java.lang.reflect.ReflectPermission suppressAccessChecks
* java.security.SecurityPermission createAccessControlContext
* java.util.PropertyPermission * read,write
* javax.security.auth.AuthPermission getSubject
* javax.security.auth.AuthPermission modifyPrincipals
* javax.security.auth.AuthPermission modifyPrivateCredentials
* javax.security.auth.AuthPermission modifyPublicCredentials
* javax.security.auth.PrivateCredentialPermission org.apache.hadoop.security.Credentials "*" "*" read
See http://docs.oracle.com/javase/ ... .html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
Installed repository-hdfs into /home/hadoop/elk/elasticsearch-1/plugins/repository-hdfs

3.2 ES集群添加配置 

ES集群各个node节点的config/elasticsearch.yml文件添加一下配置,然后滚动式重启:

security.manager.enabled: false
repositories.hdfs:
   uri:"hdfs://172.23.5.124:9000"
   path:"/es"

注意:这里是简单的配置,还有其它的参数,这里就采用默认的了。

3.3. 常用的快照命令 

建立仓库命令:

curl -XPUT 'http://172.20.33.3:9200/_snapshot/es_backup' -d ' {"type":"hdfs", "settings":{ "path":"/user/ysl", "uri":"hdfs://172.23.5.124:9000" } }'

至于快照命令,常用的快照命令,简单记录如下:

创建存储快照的仓库:

curl -XPUT 'http://172.20.33.3:9200/_snapshot/backup' -d '{"type":"hdfs", "settings":{ "path":"/user/ysl", "uri":"hdfs://172.23.5.124:9000" } }'

快照特定的索引:

curl -XPUT 'http://172.20.33.3:9200/_snapshot/backup/snapshot_1' -d '{"indices":"logstash-gatewaylog"}'

恢复特定索引:

curl -XPOST 'http://172.20.33.3:9200/_snapshot/my_backup/snapshot_1/_restore?pretty'

查看特定快照信息:

curl -XGET  'http://172.20.33.3:9200/_snapshot/backup/snapshot_20171223'

删除快照:

curl -XDELETE 'http://172.20.33.3:9200/_snapshot/backup/snapshot_20171223'

监控快照:

curl -XGET 'http://172.20.33.3:9200/_snapshot/backup/snapshot_20171223/_status'

响应包括快照的总体状况,但也包括下钻到每个索引和每个分片的统计值。这里展示了有关快照进展的非常详细的视图。分片可以在不同的完成状态:

  • INITIALIZING:分片在检查集群状态看看自己是否可以被快照。这个一般是非常快的。
  • STARTED:数据正在被传输到仓库。
  • FINALIZING:数据传输完成;分片现在在发送快照元数据。
  • DONE:快照完成!
  • FAILED:快照处理的时候碰到了错误,这个分片/索引/快照不可能完成了。检查你的日志获取更多信息。

监控恢复快照:

Curl -XGET  'http://172.20.33.3:9200/logstash-gatewaylog/_recovery'

要获取一个仓库中所有快照的完整列表,使用 _all 占位符替换掉具体的快照名称:

curl -XGET  'http://172.20.33.3:9200/_snapshot/backup/_all'

取消一个快照:

curl -XDELETE 'http://172.20.33.3:9200/_snapshot/backup/snapshot_20171223'

备份集群:

https://www.elastic.co/guide/cn/elasticsearch/guide/current/backing-up-your-cluster.html

快照恢复:

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_restoring_from_a_snapshot.html

3.4 脚本 

/home/hadoop/elk/script/snapshot_all_hdfs.sh
#!/usr/bin
current_time=$(date +%Y%m%d%H%M%S)
command_prefix=" http://172.20.33.3:9200/_snapshot/es_backup/all_"
command=$command_prefix$current_time
echo $command
curl -XPUT $command -d '{"indices":"index*,logstash*,nginx*,magicianlog*,invokelog*,outside*"}'
/home/hadoop/elk/script/snapshot_gatewaylog_hdfs.sh

3.5 crontab

0 0 */1 * * /bin/bash /home/hadoop/elk/script/snapshot_all_hdfs.sh>>/home/hadoop/elk/task_log/snapshot_all_day.log 2>&1

注意:这里采用的是每天一份快照,快照的频率可以自己控制。

04 恢复时间

我们采用的测试环境:

ES集群:四个节点,每个节点:10G内存,ES版本:2.3.3,每个索引5个主分片,一个replica.

4.1 备份数据 

第一次快照是全量的(gatewaylog_20171226),第二次快照则是增量的快照(gatewaylog_20171228):

gatewaylog_20171226的详细数据:

gatewaylog_20171228的详细数据:

4.2 恢复数据

第一次是全量的数据恢复,第二次则是在第一次恢复的基础上进行的:

以下是各个分片的数据恢复的详细数据:

gatewaylog_20171226 恢复详细数据:

Gatewaylog_20171228 恢复详细数据:

通过将ElasticSearch的数据备份到HDFS,我们再也不用担心数据会丢失了。

页面:12345678...49
随时欢迎您 联系我们