年终复盘与展望(2017年)

“2013,给自己的评分是不及格;2014,总算是步入正轨;2015年,努力让自己心安理得;2016年,不能说不努力,但感觉遇到了一些瓶颈。” 2017,完成了诸多人生大事,成了家买了房,算是重要的承前启后的一年吧。

17年可以说是大事不断,5月换工作,7月硕士毕业,9月上女朋友家门,10月父母来上海同女朋友父母见面并且开始看房子,18年1月和女朋友领证之后开始进入买房交易流程,2月拿到房产证把老婆带回福建老家拜年。去年的复盘里说到:“希望16年是承前启后的一年”,看来17年才是真正的承前启后年……攘外必先安内,家和万事兴……这一年,娶到了心仪的体贴的姑娘,完成了买房大事,有了稳固的大后方希望自己在事业上也能蒸蒸日上吧。 继续阅读年终复盘与展望(2017年)

年终复盘与展望(2016年)

“2013,给自己的评分是不及格;2014,总算是步入正轨;2015年,努力让自己心安理得。”2016年,不能说不努力,但感觉遇到了一些瓶颈,希望是承前启后的一年吧。

往年的年终总结都只写工作,今年开始把工作和生活都记录一下,然后以复盘和展望的形式结束一年开始新的一年吧。 继续阅读年终复盘与展望(2016年)

Spark log4j 配置

Spark的ml包提供了非常好用的调参功能,通过ParamGridBuilder构建待选参数(如:logistic regression的regParam),然后数据量小的时候可以用CrossValidator进行交叉验证,数据量大的时候可以直接用trainValidationSplit,这样Spark就会找到最佳的参数组合并训练模型。

千万不要小瞧这个功能,个人实际工作中的情况来看,logistic regression调整regParam参数,测试集的准确率可以从55%提升到83%(从质疑人生的意义到重新获得生活的希望)。但有个问题是CrossValidator和trainValidationSplit训练得到新model之后,你无从得知所使用最优的参数组合到底是什么,特别是1.6版本的TrainValidationSplitModel你甚至无法保存,这实在太不合理了,应该找时间去github上提个issue……

好在经过一番Google后,在老朋友StackOverflow上找到了解决方案:How to print best model params in Apache Spark Pipeline?

2015-10-21 12:57:33,831 [INFO  org.apache.spark.ml.tuning.TrainValidationSplit]
Best set of parameters:
{
    hashingTF_79cf758f5ab1-numFeatures: 2000000,
    nb_67d55ce4e1fc-smoothing: 1.0
}

2015-10-21 12:57:33,831 [INFO  org.apache.spark.ml.tuning.TrainValidationSplit]
Best train validation split metric: 0.7358721053749735.

就是在训练的过程中INFO级别的日志里是有最优参数结果的,因为Spark在console里默 继续阅读Spark log4j 配置

R语言码农的Scala学习心得

为了MLib,最近是铁了心要学好Spark。关注本博客的朋友应该知道我的主力语言是R,无论是训练模型还是做Elasticsearch,都是通过R脚本来操作的。之前的《通过 Spark R 操作 Hive》这篇博文中我对通过R来操作Spark还存在幻想,实际使用之后基本放弃了这种想法,因为目前的Spark R可用功能十分有限,并且运行效率也不理想,干脆就决定好好学一下原生的Scala!本文将类比R与Scala,从R语言码农的角度介绍一下Scala的学习心得:

注:本文不求全,只求实用,想学习详细语法推荐阅读《快学Scala》

1.变量

R:直接给变量赋值

test = 1

Scala:val代表不可变,var代表可变,可以不写变量类型,scala会根据所赋的值进行推断

val test:Int = 1
val test1 = 1
var test2 = 1

2.判断与循环

继续阅读R语言码农的Scala学习心得

在集群上运行Spark应用

初识Spark真的存在很多疑问:Spark需要部署在集群里的每个节点上吗?Spark怎么有这么多依赖,这些依赖分别又有什么用?官网里边demo是用sbt构建的,难道还有再学一下sbt吗?

……就是这么多的问题令人对使用Spark望而生畏,最近总算认真刷了一下官方文档,在这篇blog里汇总整理一下这些问题。

1.如何提交Spark应用

1.1 将应用与依赖打包在一起

如果自己的Spark项目里依赖其他的项目,官方文档建议把项目代码和依赖打包在一起,称为assembly jar(Spark与Hadoop的依赖由于集群中已经有了,所以可以在maven依赖设置的scope中设为provided)。

1.2 使用spark-submit脚本执行应用

./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]
  • class:作为应用入口的main函数所在的类
  • master:集群的URL
  • deploy-mode:部署模式分为:cluster与client,在下一节会详细介绍
  • conf:key=value格式的Spark配置属性,如果value中包含空格,用引号包起来”key=value”
  • application-jar:1.1中打包好的assembly jar,jar包必须是整个集群都可以访问到的,可以是hdfs://或者每个节点上都有的本地文件file://
  • application-arguments:可选的传给main函数的参数

继续阅读在集群上运行Spark应用

通过 Spark R 操作 Hive

作为数据工程师,我日常用的主力语言是R,HiveQL,Java与Scala。R是非常适合做数据清洗的脚本语言,并且有非常好用的服务端IDE——RStudio Server;而用户日志主要储存在hive中,因此用HiveQL写job也是日常工作之一;当然R的执行效率确实不靠谱,因此还需要Java(Elasticsearch,Hadoop的原生语言)与Scala(Spark的原生语言)的帮助。

R和python一样也是一个很好的胶水语言,在搜索引擎的实战中,我就是用R来完成了ES集群索引的全量/增量更新操作。既然是一瓶胶水,你很难不希望它粘合上越来越多的东西。对于一个有处女座倾向的双鱼座,因为RHive的安装和配置太复杂而一直没法把R和Hive粘合起来是我长期以来的苦恼。最近要用Spark的Mlib做文本分类工作于是开始重新鼓捣Spark,没想到歪打正着地发现用Spark的R语言api可以操作Hive,搞通之后真是感到Awesome as fuck!

一、编译安装带有hive与R的Spark

官网上预编译好的spark都是不带hive支持的,因此只能自己从源码重新编译(在这里要感谢spark老司机同事的指点)。

# 从官网下载源码包
wget http://mirrors.hust.edu.cn/apache/spark/spark-1.6.1/spark-1.6.1.tgz

# 解压
tar zxvf spark-1.6.1.tgz

# 为编译R的支持做准备
spark-1.6.1/R/install-dev.sh

# 编译安装带有hive与R的spark
spark-1.6.1/make-distribution.sh --name hadoop2.5 --skip-java-test --tgz -Psparkr -Pyarn -Dhadoop.version=2.5.0 -Dscala-2.10.4 -Phive -Phive-thriftserver

# 把编译好的包解压到自己习惯的目录(参考elasticsearch放在/usr/share/目录下)
tar zxvf spark-1.6.1/spark-1.6.1-bin-hadoop2.5.tgz
mv spark-1.6.1/spark-1.6.1-bin-hadoop2.5 /usr/share/

继续阅读通过 Spark R 操作 Hive

CentOS 6.7 hadoop free版本Spark 1.6安装与使用

最近的工作主要围绕文本分类,当前的解决方案是用R语言清洗数据,用tm包生成bag of words,用libsvm与liblinear训练模型。这个方案可以hold住6/70万的训练集:

LIBLINEAR is efficient for large-scale document classification. Let us consider a large set rcv1 test.binary with 677,399 instances.

$ time liblinear-1.21/train -c 0.25 -v 5 rcv1_test.binary Cross Validation Accuracy = 97.8538% 68.84s

Note that reading the data takes most of the time. The training of each training/validation split is less than four seconds

当前我们用3万的训练集已经得到不错的分类结果,所以这个方案应该是足够用的;但是,在特征构造上R存在比较严重的性能缺陷,一方面暂时没有看到tm包与word2vec的结合方案,另一方面用R做PCA就是一个灾难(非常吃内存,也进一步导致计算很慢)。这时,碰巧看到spark mlib的文档里有一堆文本挖掘相关的工具,如:word2vec以及pca等等,因此下定决心把spark用起来。

spark安装

1.需要提前安装的软件:Java 7+, Scala 2.10, Hadoop

继续阅读CentOS 6.7 hadoop free版本Spark 1.6安装与使用

OS X Maven 安装与使用简介

Java真的很重很复杂,连项目构建和编译都得专门拉出来学,这里整理一下在OS X上使用Maven的注意事项。

一、安装

1.从http://maven.apache.org/download.cgi下载二进制文件,如:
apache-maven-3.3.9-bin.zip

2.将文件解压,并放在合适的目录,如:
/Users/xiexiaowen/bin/apache-maven-3.3.9

3.创建一个符号链接(方便以后升级)
ln -s apache-maven-3.3.9 apache-maven

4.配置好java与maven相关环境变量,vim ~/.bash_profile
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home"
export PATH=$JAVA_HOME/bin:$PATH
export M2_HOME="/Users/xiexiaowen/bin/apache-maven"
export PATH=$PATH:$M2_HOME/bin
export MAVEN_OPTS="-Xms1024m -Xmx4096m -XX:PermSize=1024m"

5.检查maven安装情况
echo $M2_HOME
mvn -v

6.让maven做一些初始化工作:
mvn help:system

7.用户范围的配置文件:
cp $M2_HOME/conf/settings.xml ~/.m2/settings.xml

8.修改IDE中Maven Home,不要使用IDE内嵌的Maven

继续阅读OS X Maven 安装与使用简介

工作第三年(2015)小结

往年的年终总结都是放在元旦跨年时写,但细想之后还是觉得放在春节写来得合适,毕竟春节前往往是最忙最有事情做的时段,只有回到家之后这一年的工作才算完。但是年后发生了各种事……所以拖到了今天才做总结,还是得过去的15年一个好好的交代。

“2013,给自己的评分是不及格;2014,总算是步入正轨”,2015年,应该说是努力让自己心安理得吧。

CS229

CS229是Andrew Ng在斯坦福大学开设的一门机器学习课程,相信非常多的同行是看着这个公开课入行的,向Andrew和提供视频翻译与课件的网易公开课脱帽致敬!这里就引用一下当时学完监督学习部分前11课后的总结吧:“从过年期间(第一篇笔记发布于2月24号)到清明假期(今天4月5号),历经40天左右的时间终于把CS229监督学习的部分过了一遍。期间解开了无数困惑已久的机器学习领域的问题,感觉整个人神清气爽。感谢网易公开的翻译,并且细心地提供了讲义下载,当然更感谢Andrew大神的精彩授课。接下来需要先掌握一个好的工具箱;然后开始践行先Implement something quick-and-dirty,再通过error analyses优化重点环节。像个ml专家一样去战斗!”

复旦研究生

担心未来本科文凭不够用,所以14年报考了复旦大学软件学院云计算大数据方向的工程硕士。15年3月开始正式上课,也拉开了周末单休的序幕。虽然陆陆续续还是延续了大学时翘课的习惯,但是在这里认识各行各业的同学,交到了有趣的朋友,还能及时向资深的教授以及教授带的全日制研究生同学请教,收获颇丰。 继续阅读工作第三年(2015)小结

不做就不做,要做就做最好

最近其实不太顺利,做了四个月的搜索项目总算在论坛PC端上线了,自认为合理的排序算法并不被老用户认可,改为和老版本使用一样的时间降序排列后得以使得新老版本的数据表现相似,可惜新版搜索的点击数据还稍逊一些;再加上App端在过年前要接入搜索功能,使得最近不得不来了一阵疯狂加班,也因此腾不出来优化搜索算法;并且还有搜索产品化的需求堆在哪儿;另外我厂在局面大好的情况下,硬生生被利物浦扳平了,sigh……

周五,实在加不动班了,回家想刷一刷GTA3的剧情也打不起啥精神,于是打开豆瓣电影,想找找足球相关的电影,然而没能找到理想的结果……好在突然想起体育相关的内容肯定还是要来我大虎扑搜索,于是用了自己设计的综合搜索算法,瞬间找到了一篇关于足球电影的讨论,算是给了自己一个大大的安慰吧。

一番挑选之后,决定看《一球成名》,一部讲述社会底层的业余球员如何被球探发现,最终实现自己职业球员梦想的励志片。整体来说是部不错的电影(槽点是一些细节比较生硬)。我对整体电影感触最深的不是励志鸡血,而是以下这个画面:

一球成名

继续阅读不做就不做,要做就做最好