Spark SQL 原理
Spark SQL的发展历程为了给熟悉的 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具,Hive 应运而生,他是当时唯一运行在 Hadoop 上的SQL-On-Hadoop 工具。 但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL 的执行效率,大量的 SQL-On-Hadoop工具开始产生,而 Shark 是其中一个表现较为突出的项目。 Shark是伯克利实验室 Spark 生态环境的组件之一,它主要修改了内存管理,物理计划和执行三个模块,值得它能运行在 Spark 的引擎上,从而提高 SQL 查询的效率。 但是随着 Spark 的发展,Shark 对 Hive 过多的依赖制约了 Spark 的设计理念和各个组件之间的相互继承,所以 Spark 团队停止了对 Shark 的开发,提出了 SparkSQL 项目。 因为摆脱了Hive 的过度依赖,Spark SQL在数据兼容性,性能优化和组件扩展等各个方面都得到了极大的方便和发展。 提出了 SparkSQL 项目之后,SQL On...
gradle 总结
gradle.xmind 这里的 AIDL 是 Android Interface Definition Language 的意思。Dex 是 Dalvik executable format 的意思。 基本概念gradle 是一个自动化构建工具(build automation,而不是像 maven 一样标榜自己是个 project management 工具),通过组织一系列 task 来最终完成自动化构建,所以 task 是 gradle 里最重要的概念之一, 以打包生成 apk 为例,整个过程要经过资源的处理,javac 编译,dex 打包,apk 打包,签名等等步骤,每个步骤就对应到 gradle 里的一个 task。因为这些 task 是 gradle 的生命周期里特有的,所以 gradle 的插件应该不能移植到其他构建工具里- maven 和 gradle 的插件不互通。 gradle 是事实上的 android/Kotlin 默认构建工具,虽然基于 JVM,但是可以用来构建其他语言。 每一个插件新增在 gradle 脚本里,都会带来新的...
《枪炮、病菌和钢铁》札记
...
Unix 常用命令
一般场景12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# 分屏显示ls|morecat file|more# 制造符号链接ln -s from created# 删除 gradlebrew rm gradle# 寻找 Formulaebrew search gradle# 查看 gradle 最新的信息brew info gradle# 安装 sdkmancurl -s "https://get.sdkman.io" | bash# 搜索 gradlesdk list gradle# 安装特定版本sdk install gradle 5.2# 查看磁盘空间(diskfree)df -lh /usr/local# 强烈推荐直接使用这个命令df -lh ./# 查看已使用空间(diskused)du -h /usrdu -h ./# 压缩一个目录tar -zcvf...
Spring AOP 笔记
AOP 的基本概念Aspect: A modularization of a concern that cuts across multiple classes. 方面,横跨多个类的模块化关注点。如果只是简单地横跨多个类,可以考虑使用继承 + 组合 + 设计模式。如果使用某种模式匹配来横跨多个类,才需要考虑使用 Aspect。 Join point: A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution. 结合点是我们最需要关注的东西,既包括了方法执行过程,也包含了异常处理过程。 Advice: Action taken by an aspect at a particular join point. 方面针对结合点采取的行动。对 Advice 而言,join point...
ThreadLocal 的设计模式
基础版本123456789101112131415161718192021222324252627282930313233// 定义基础的 Context 类型public class ServerContext {}// 为这个基础类型装载一个 threadlocal 容器,然后为这个容器准备一个静态工具类public class Context { // 这个容器如果是泛型的(如存储 dapper 的 trace 或者 span),可以考虑用 T 或者用 Object。 private static final ThreadLocal<Object> SERVER_CONTEXT = new ThreadLocal<Object>(); public static Object getServerContext() { return SERVER_CONTEXT.get(); } public static void...
Java 注解和配置
Java 的原生注解meta annotation@Inherited@Inherited 是一个元注解(annotations applied to other annotations 注解其他注解的注解),也是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。 @Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。其查找过程是:反射 API 会在查找 @Inherited 标注的注解的时候,自底向上往继承树上方查找。 12345678910111213141516171819202122@Inherited@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyAnnotation { String value() default "Default...
Mac 使用技巧
修复文件不能打开的问题《应用程序不能打开?一条命令就搞定!》 显示隐藏文件在 macOS Sierra,我们可以使用快捷键: command + shift + . 来快速(在 Finder 中)显示和隐藏隐藏文件。 Mac 出现正在运行安装包脚本或等待其他安装完成的解决办法Mac 出现正在运行安装包脚本或等待其他安装完成的解决办法 打开 Mac 触控板的三指拖移功能打开 Mac 触控板的三指拖移功能 macOS 修改 HostsmacOS 修改 Hosts 显示隐藏文件夹Mac系统如何显示隐藏文件? Command+Shift+. 可以显示隐藏文件、文件夹,再按一次,恢复隐藏; 1234# showdefaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder# hidedefaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder 如何清洁苹果产品如何清洁 Apple...
Optional 的正确用法
Optional 的不正确实践首先,不要直接拿来做if-else的判定条件,这肯定是错的: 123456Optional<User> user = ...... if (user.isPresent()) { return user.getOrders();} else { return Collections.emptyList();} 而且get()要配合isPresent()才安全。 其次,尽量不要用 Optional 拿来做成员变量,特别是 pojo 的成员变量,这很容易让读 pojo 的框架出问题。 再次,不要拿来做方法参数,因为很可能写成 if (user.isPresent()) {}式的代码。 最后,Optional 的关注点在它的 value 的后续处理身上,如果这个 value 只是一个 flag,还是要乖乖地用if-else;如果这个 value 被用在多路返回里,也不能使用 Optional。 正确的用法选对构造器Optional.of(T...
缓存的套路
什么时候应该使用缓存?所有高耗时,需要吞吐量,而不太严格依赖强一致性的场景-不管是计算密集型还是 io 密集型,都可以使用缓存加速。 多级缓存问题大多数情况下不要使用多级缓存。多级缓存要严格设计差异化的冷热数据分离策略,还要考虑分布式的缓存失效+更新的问题,很复杂。 勉强可用的多级缓存应该是远端一级缓存,近端二级缓存。 本地多级缓存非常容易出一致性问题-慎用 MyBatis 和 Hibernate 的二级缓存。 外部缓存设计思路外部缓存通常指的是分布式缓存组件或者中间件。 内文直接参考《缓存更新的套路》 缓存更新的设计模式.xmind Redis内部缓存的用法内部缓存通常指的是进程内缓存,in-memory-cache。 Spring Cache 依靠一个 CacheManager SPI 机制,来跟不同的 cache 实现打交道。大多数时候我们应该用 CacheManager 封装好的 wrapper api 来跟缓存打交道,极少数情况下我们应该 getNativeCache 来使用专有 API。 Guava Cache 就是给 ConcurrentHashMap...