Stan's Tech Blog

好记性不如烂键盘!

深度剖析Spark分布式执行原理

让代码分布式运行是所有分布式计算框架需要解决的最基本的问题。 Spark是大数据领域中相当火热的计算框架,在大数据分析领域有一统江湖的趋势,网上对于Spark源码分析的文章有很多,但是介绍Spark如何处理代码分布式执行问题的资料少之又少,这也是我撰写文本的目的。 Spark运行在JVM之上,任务的执行依赖序列化及类加载机制,因此本文会重点围绕这两个主题介绍Spark对代码分布式执行的处理。本文假设读者对Spark、Java、Scala有一定的了解,代码示例基于Scala,Spark源码基于2.1.0版本。阅读本文你可以了解到: Java对象序列化机制 类加载器的作用 Spark对closure序列化的处理 Spark Application的class是如何加载的 Spark REPL(spark-shell)中的代码是如何分布式执行的

为效率而生:开源Mac版Google Authenticator认证客户端GoldenPassport

最近运维同学为了提高安全性,用Google Authenticator对服务器加了双重认证,此后登录服务器需要先输入动态密码,在输入服务器密码。Google Authenticator相当于软token,对他不了解的同学可以看下这篇文章:谷歌验证 (Google Authenticator) 的实现原理是什么?。 运维同学的出发点是好的,但是我原来写的各种自动登录服务器的脚本统统失效了。蛋疼的是我现在登录服务器的流程变成了: 掏手机(我的是iPhone) 解锁,碰上指纹解锁失败的情况还需要输入密码解锁 打开Authenticator客户端,等待Verification Code更新大概1s 记住Verification Code,然后到Mac端输入 输入服务器密码,

自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持

SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...)这种语法了(下文简称add columns语法)。如果你的Spark项目中用到了SparkSQL+Hive这种模式,从Spark1.x升级到2.x很有可能遇到这个问题。 为了解决这个问题,我们一般有3种方案可以选择: 启动一个hiveserver2服务,通过jdbc直接调用hive,

git diff a b与git diff b a的区别

git diff用的时间也挺久了,不过一直没有注意过git diff a b,和git diff b a有什么区别,用的也是稀里糊涂的,不就是比较a和b的不同么?两种比较方式会有什么不一样呢? 实际操作后,发现确实是两种不同的对比。 我们的a文件,内容如下: 1 2 b文件的内容为: 1 3 执行git diff a b,
git

如何修改Hadoop的默认日志级别,还真是麻烦

鄙人使用的Hadoop版本为2.6.4。Hadoop的默认日志级别为INFO,对于百台以上的集群,如果文件操作频繁的话,NameNode会狂打日志,对性能会有一定的影响。 我们可以通过http://<namenode:50070>/logLevel在线修改NameNode的日志级别。如下所示: 但是,如果NameNode重启的话,又得重新设置,好麻烦。 怎么设置默认的日志级别为WARN呢? Hadoop使用的是log4j记录日志,我们理所当然会想到去修改${HADOOP_HOME}/etc/hadoop/

Scala模式匹配的`@`操作符

阅读Spark源码的时候,经常碰到模式匹配中带着@这样的写法,如: object CombineLimits extends Rule[LogicalPlan] { def apply(plan: LogicalPlan): LogicalPlan = plan transform { case ll @ Limit(le, nl @ Limit(ne, grandChild)) => Limit(

解决Mac下使用pip安装M2Crypto报错的问题

和Mac系统升级有关,/usr/include目录没有了,且没有权限修改。 正确的安装方法(前提,已安装brew): sudo env LDFLAGS="-L$(brew --prefix openssl)/lib" \ CFLAGS="-I$(brew --prefix openssl)/include" \ SWIG_FEATURES="-cpperraswarn -includeall -I$

Mac/Linux下管理多个版本的jdk

最近搞的一个项目是基于jdk1.7,打算升级到jdk1.8需要做一段时间的测试,也就是说开发依然在1.7的版本,同时要测试1.8。 安装 需要什么版本的jdk直接去oracle官网下载dmg安装包直接安装即可。 修改~/.bashrc或~/.zshrc 添加以下代码 # 尼玛,写这篇日志其实主要是为了记录jdk在Mac下的安装路径~~~ export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_

Python性能分析——cProfile

cProfile是python内置的模块,是比较常用的性能分析工具,可以非常方便的辅助我们找出程序的性能瓶颈,类似的内置工具还有profile,hotshot,使用方法和cProfile类似。本文重点介绍cProfile几种常用的分析方法。 直接针对一个文件进行分析: python -m cProfile test.py,-m表示运行一个模块,这里直接运行了cProfile模块,对test.py进行性能分析,分析结果直接输出到控制台中,还可以通过-o参数将结果输出到指定文件中。 很多情况下,我们可能需要对一块具体的代码进行分析,可以这么做: # 在代码中嵌入cProfile模块相关分析代码 from cProfile import