分类
大数据

Flink的时间与watermarks详解

当我们在使用Flink的时候,避免不了要和时间(time)、水位线(watermarks)打交道,理解这些概念是开发分布式流处理应用的基础。那么Flink支持哪些时间语义?Flink是如何处理乱序事件的?什么是水位线?水位线是如何生成的?水位线的传播方式是什么?让我们带着这些问题来开始本文的内容。

分类
Java

分布式自增ID算法 – 雪花算法

一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式、UUID、雪花算法。

方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID。这种呢,优点是可以体现全局的递增趋势(优点只能想到这个),缺点呢,倒是一大堆,比如,依赖中间件,假如中间件挂了,就不能提供服务了;依赖中间件的写入和事务,会影响效率;数据量大了的话,你还得考虑部署集群,考虑走代理。这样的话,感觉问题复杂化了

方案二,通过UUID的方式,java.util.UUID就提供了获取UUID的方法,使用UUID来实现全局唯一ID,优点是操作简单,也能实现全局唯一的效果,缺点呢,就是不能体现全局视野的递增趋势;太长了,UUID是32位,有点浪费;最重要的,是插入的效率低,因为呢,我们使用mysql的话,一般都是B+tree的结构来存储索引,假如是数据库自带的那种主键自增,节点满了,会裂变出新的节点,新节点满了,再去裂变新的节点,这样利用率和效率都很高。而UUID是无序的,会造成中间节点的分裂,也会造成不饱和的节点,插入的效率自然就比较低下了。

方案三,基于redis生成全局id策略,因为Redis是单线的天生保证原子性,可以使用原子性操作INCR和INCRBY来实现,注意在Redis集群情况下,同MySQL一样需要设置不同的增长步长,同时key一定要设置有效期,可以使用Redis集群来获取更高的吞吐量

方案四,通过snowflake算法如下:

SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

分类
大数据

ES聚合操作 – Fielddata is disabled on text fields by default

使用ES聚合操作对字段(projectCode)去重:

GET bury-point-click/_search
{
  "size": 0,
  "aggs": {
    "group_by_project": {
      "cardinality": {
        "field": "projectCode"
      }
    }
  }
}

执行报错:Fielddata is disabled on text fields by default. Set fielddata=true on [projectCode] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.

分类
编程

Git创建一个空的分支

1.创建一个空白的分支的需求

在Git中创建分支,是必须有一个父节点的,也就是说必须在已有的分支上来创建新的分支,如果工程已经进行了一段时间,这个时候是无法创建空分支的。但是有时候就是需要创建一个空白的分支。

分类
大数据

Flink的状态后端(State Backends)

当使用checkpoint时,状态(state)会被持久化到checkpoint上,以防止数据的丢失并确保发生故障时能够完全恢复。状态是通过什么方式在哪里持久化,取决于使用的状态后端。

可用的状态后端

  • MemoryStateBackend
  • FsStateBackend
  • RocksDBStateBackend

注意:如果什么都不配置,系统默认的是MemoryStateBackend

分类
大数据

Flink运行架构剖析

本文主要介绍 Flink Runtime 的作业执行的核心机制。首先介绍 Flink Runtime 的整体架构以及 Job 的基本执行流程,然后介绍Flink 的Standalone运行架构,最后对Flink on YARN的两种模式进行了详细剖析。

分类
Java 编程

Spring Data 使用 Redis 自增方法报错

Spring Data Redis 的 RedisTemplate 对 Redis 进行了封装。在对某值调用increment()方法时报错:

redis ERR value is not an integer or out of range

redisTemplate.opsForValue().increment(key);

大家都知道redis序列化是将key,value值先转换为流的形式,再存储到redis中。

RedisTemplate是使用的JdkSerializationRedisSerializer序列化,序列化后的值包含了对象信息,版本号,类信息等,是一串字符串,所以无法进行数值自增操作。

而StringRedisTemplate序列化策略是字符串的值直接转为字节数组,所以存储到redis中是数值,所以可以进行自增操作。

分类
Java

Flink:ElasticsearchSinkFunction is not serializable

用Java把Flink结果数据下沉到Elasticsearch,执行时执出ElasticsearchSinkFunction is not serializable异常:

The implementation of the provided ElasticsearchSinkFunction is not serializable. The object probably contains or references non-serializable fields.

分类
Nginx PHP 笔记

站点优化笔记

本站开通也有好几年了,除了更新几次主题,自定义几个样式和几处微调,没什么做大的改动。这次心血来潮把它优化一波,为后面使用打下基础。

次此优化主要是:

  1. 优化php配置
  2. 优化wordpress一些不适合国情的东西(你懂的)
  3. 优化链接便于搜索引擎收录
分类
Java Linux

Linux环境启动Elasticsearch错误

Elasticsearch默认启动监听的是本地127.0.0.1端口,现需要把服务发布出来,供其他机器访问。修改Elasticsearch配置文件(config/elasticsearch.yml):

network.host: 0.0.0.0
discovery.seed_hosts: ["0.0.0.0"]

启动后报错,如图:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]