Arganzheng's Blog

stay hungry, stay foolish

使用CompletableFuture异步编程

Future vs. CompletableFuture JDK 5引入了 Future 模式。Future 接口是Java多线程 Future 模式的实现,在java.util.concurrent包中,可以来进行异步计算。 Future 模式是多线程设计常用的一种设计模式。所谓Future,顾名思义,就是结果在未来完成,先给你一个凭据。Future的接口很简单,只有五个方法: public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); ...

gitlab如何checkout某个group中的所有项目

gitlab 是一个非常棒的基于git的代码版本控制平台,跟 github 非常类似,但是有一个非常重要的功能是缺失的,就是搜索代码。这时候只能将所有的分支拉到本地,进行grep。为了方便管理,我们的项目都是按照 group,也就是 namespace 分开管理的,问题在于 gitlab 并没有在界面上直接提供下载整个 group 中的所有项目的功能,谷歌了一下,发现大家基本都是利用 Gitlab API 提供的查询所有项目的接口,然后封装一个 shell 脚本来实现这个功能。 比如 这个 sync-projects 。但是写的稍微有点复杂,我做了简单的优化: 使用 "${BASE_PATH}api/v3/groups/$GROUP_NAME/projec...

创建Hadoop FileSystem报Provider org.apache.hadoop.fs.azure.NativeAzureFileSystem not a subtype异常

为了验证一个线上问题,写了一个简单的Spark任务,在提交节点上听过spark-submit命令提交任务,总是跑不起来。 报如下错误: 18/12/26 16:37:24 ERROR study.Application: error java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.fs.azure.NativeAzureFileSystem not a subtype at java.util.ServiceLoader.fail(ServiceLoader.java:239) at j...

git分支与maven版本之间的联动

对于 java 开发,项目联合开发的时候往往是通过maven仓库而不是分支源码依赖进行,而且为了让变更立即可见,需要采用 maven 的 snapshot 版本机制;而对于稳定版本(release版本),为了能够拉取更新以及记录变更,也是需要升级版本号的。也就是说二方库有自己的(maven)版本管理机制, 需要跟 git 的分支机制联动起来。 为了方便说明,我们举一个具体的二方库作为例子。假设有这么一个二方库,它的 pom 文件定义如下: <groupId>life.arganzheng.internet.ai.platform</groupId> <artifactId>large-scale-algorithms</...

Git分支管理策略

在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践,即如何管理仓库中作用不同的各类分支。 GitFlow 演进 洪荒时代 —— 单主干开发 (Trunk-based development, TBD) 单主干的分支实践(Trunk-based development, TBD)在 SVN 中比较流行。trunk 是 SVN 中主干分支的名称,对应到 Git 中则是 master 分支。 在项目初期,一切都是从0开始,不存在多分支并行开发一说,所以基本上都是基于主干开发和发布。 Pros 简单,只需要维护一个分支 冲突第一时间发现和解决 Crons 主干一直在变化,没有一个稳定的版本来进行测试和发布 因为主干分支是所有开...

Spark数据倾斜及其解决方案

什么是数据倾斜 对 Spark/Hadoop 这样的分布式大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。 对于分布式系统而言,理想情况下,随着系统规模(节点数量)的增加,应用整体耗时线性下降。如果一台机器处理一批大量数据需要120分钟,当机器数量增加到3台时,理想的耗时为120 / 3 = 40分钟。但是,想做到分布式情况下每台机器执行时间是单机时的1 / N,就必须保证每台机器的任务量相等。不幸的是,很多时候,任务的分配是不均匀的,甚至不均匀到大部分任务被分配到个别机器上,其它大部分机器所分配的任务量只占总得的小部分。比如一台机器负责处理 80% 的任务,另外两台机器各处理 10% 的任务。 『不患多而患不均』,这是分布式环境下最大的问题。意味着计算能...

Spark Executor内存管理

我们都知道 Spark 能够有效的利用内存并进行分布式计算,其内存管理模块在整个系统中扮演着非常重要的角色。为了更好地利用 Spark,深入地理解其内存管理模型具有非常重要的意义,这有助于我们对 Spark 进行更好的调优;在出现各种内存问题时,能够摸清头脑,找到哪块内存区域出现问题。 首先我们知道在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程,前者为主控进程,负责创建 Spark 上下文,提交 Spark 作业(Job),并将作业转化为计算任务(Task),在各个 Executor 进程间协调任务的调度,后者负责在工作节点上执行具体的计算任务,并将结果返回给 Driver,同时为需要持久化的 RD...

Spark RDD

RDD核心抽象和概览 1. 什么是 RDD The main abstraction Spark provides is a resilient distributed dataset (RDD), which is a fault-tolerant collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. 2. 怎样创建 RDD RDD 可以通过如下方式创建: parallelizing an existing collection in your driver program. extern...

设计模式分享

开发模式 (OOP) 面向对象编程 (DDD) 领域驱动开发 (TDD) 测试驱动开发 设计模式的8个基本原则 单一职责原则(Single Responsibility Principle): 一个类只负责一个功能领域中的相应职责(只做一类事情) 里氏代换原则(Liskov Substitution Principle): 任何基类可以出现的地方,子类一定可以出现 依赖倒转原则(Dependence Inversion Principle): 核心面向接口编程,依赖于抽象而不依赖于具体实现 接口隔离原则(Interface Segreg...

log4j2如何动态的创建logger和appender

背景 平台现在通过页面通过 SparkLauncher 提交Spark训练任务,随着而来的一个问题就是任务出错之后不知道哪里出问题,而日志在提交节点上,并且所有的任务混在一起打印日志,很不方便查看。能不能把 Spark 任务的日志分别打印在自己的日志文件呢? 解决方案 Spark2.x 有 redirectToLog 方法可以把任务日志重定向,但是 Spark1.x 没有提供这个功能,也不具备扩展性,所以只能自己解决了。 解决方案其实蛮简单的,就是不同的 task 创建属于自己的 Logger(即 loggerName 不一样), 每个Logger有自己的 FileAppender,FileAppender 指向自己的日志文件(文件名称用 taskId 命名...

×