Qzone-天涯-163-百度-新浪 拣尽寒枝不肯栖

Spark学习——map & mapValues

  • Posted on:
  • By: Du00
  • With:

  有时候觉得会不会从来没看过源码会是种遗憾,尝试着去看spark源码时又发现看不懂……

  map和mapValues的区别其实很大,最重要的区别是mapValues只对Tuple2的第二个元素进行操作,保留第一个元素key不变(废话)。先上结论:

  • mapValues在不改变数据分区的情况下对数据进行一些转换操作,从而避免在进一步的join/reduce之类的操作中产生不必要的shuffle开销,如果想要制造narrow dependency,这一点还是需要知道;
  • map操作过后partitioner会丢失,仿上——join/reduce之类的操作时会产生shuffle

Spark源码中map/mapValues的相关体现:

//RDD中的partitioner
/** Optionally overridden by subclasses to specify how they are partitioned. */
@transient val partitioner: Option[Partitioner] = None

//MappedRDD
private[spark]
class MappedRDD[U: ClassTag, T: ClassTag](prev: RDD[T], f: T => U)
extends RDD[U](prev) {

override def getPartitions: Array[Partition] = firstParent[T].partitions

override def compute(split: Partition, context: TaskContext) =
firstParent[T].iterator(split, context).map(f)
}

Spark问题备忘

  • Posted on:
  • By: Du00
  • With:

  想当年被mapreduce虐得死去活来,换上Spark其实是接着虐,记录在此仅作备忘。

1. Spark/Scala在Eclipse中的设置

  IntelliJ IDEA也有相应插件,在此不提。基于Eclipse的方案中可以安装ScalaIDE的插件,但还是建议使用ScalaIDE,而且是Milestone版本。IDE的新版本不同于硬件驱动,往往是添加了更好的新功能,不需要坚持用一个老版本,况且开源的东西对老版本的东西感觉好像不维护的样子。

  scala工程在Eclipse中有一些基本上逃避不了的问题:

  1. 首先,怎么创建一个scala的maven工程?
      参考Spark/Scala的入门材料,建一个新工程,在pom中配置scala的maven编译插件即可。
  2. 引入一个scala的maven工程后需要哪些设置?
    情况可能各有不同,一条一条对照检查即可:
    • 未识别出工程为Scala工程(工程文件夹图标有M、J标记,没有S)——需要添加工程的Scala特性
      工程->右键->Configure->Add Scala Nature
    • 未能识别scala代码(没有变成java的package管理)——添加Scala代码路径为Source Folder
      比如src/main/scala文件夹下有scala源文件——scala代码文件夹-> 右键 ->Build Path -> Use as Source Folder
    • 可能的兼容性问题:修改JDK兼容版本从1.5到1.6——JRE System Library -> 右键 -> Properties -> 选择Java SE-1.6(比如thrift需要至少JDK1.6支持,如果没有飘红忽略亦可)
  3. Scala版本的依赖版本冲突
      在Problems的View中可能会有红色的错误提示说xx.jar是用2.10编译的,而你使用的是2.11,这时对着问题ctrl+1或者右键-> Quick Fix -> 下拉Scala Installation选择相应版本(2.10)
  4. IDE在Build workspace时缓慢、报内存不够
      调整最大内存分配。这个还是很有必要的,菜单栏->Scala->Run Setup Diagnostics->选中Use recommended default settings,如果Heap settings中的有1.5G以上就不用改了,如果有需要,修改eclipse.ini(去安装文件夹下找,把512m改成2048m)即可。

Scala点点滴滴-JSON/正则/命令行解析

  • Posted on:
  • By: Du00
  • With:

1. JSON处理包

正如JSON4S官网所说,现在已经有6个Scala的JSON解析库了,为什么要使用这一个呢?——快速,简单!JSON4S可以将字符串解析成对象、容器,什么复杂的就免了,我只想学最简单的抽成Map的方法,其它的就交给我自己来处理好了。

1.1 依赖

  如果是使用的Spark,它的依赖中已经有json4s这个包了,无需再添加。如果没有可以在maven中添加:

<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-native_${scala.version}</artifactId>
<version>3.2.11</version>
</dependency>
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_${scala.version}</artifactId>
<version>3.2.11</version>
</dependency>

1.2 样例

  我最喜欢的例子(我也只用到了这个)

import org.json4s._
import org.json4s.jackson.JsonMethods._ //下面只用到了其中的parse方法

implicit val formats = DefaultFormats //不加这一句会提示formats找不到,并且还提示了将org.json4s.DefaultFormats提到前面
val s = """{"a":"","b":"mobile","c":"dior","d":"stable","e":"4.4.2"}"""
val deviceInfo = parse(s, false).extract[Map[String, String]]
println(deviceInfo)
// Map(e -> 4.4.2, a -> , b -> mobile, c -> dior, d -> stable)

利用GitHub搭建个人博客-美化(3)

  • Posted on:
  • By: Du00
  • With:

  美化调整其实是重头戏,但是对于像我这种不懂Html/JS的人来说美化就只有两步:

  1. 使用别人的主题
  2. 调参——对各项参数进行微调
    这部分的内容比较繁杂,大多数都是在耗在反复对比上了。

应用主题

  Hexo的爱好者们DIY了很多各式各样的主题,并且还分享出来了。有很多非常的酷,可以尝试尝试。安装方法很简单,比如要安装metro-light,在博客的主目录下执行

git clone https://github.com/halfer53/metro-light.git themes/metro-light

然后在主目录中的_config.yml中设置theme为metro-light即可。别人共享的站点中都有如何安装的说明,以及有哪些配置项,记得扫一眼!

注意:如果用GitHub来同步整个博客,记得把themes/metro-light下的.git文件夹删掉。

配置参数

  参数配置很简单,作者都留好了入口,挨个填就可以 了。首先要注意区分根目录和主题目录下的各有一个_config.yml文件,参数需要分别在两个地方进行配置。

  • 配置主目录_config.xml
      主目录的_config.xml的配置不能够马上反映的本地站点(hexo s)上,需要hexo g一次,主题内的配置文件修改完就可以在网页上刷新看到。下面列出了至少需要配置的内容,按自己的情况一一修改,不放心就本地预览。
# Site
title: Oh Captain, My Captain - Du00
subtitle: Qzone-天涯-163-百度-新浪,削足适履,不如亲手打造
description: Du00的博客
author: Du00
email: du00cs@gmail.com
language: zh-CN

# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://du00cs.github.com

# Extensions
theme: metro-light

# Deployment
deploy:
  type: github
  repo: https://github.com/du00cs/du00cs.github.io.git
  • 配置主题中的_config.yml
      每个主题中可配置的项各不一样,下面还是以metro-light为例说明一些配置,主要是评论系统和分享按钮。
#duoshuo_short_name是需要去“多说”申请的,填错无效……
comment:
 duoshuo: true
 duoshuo_short_name: du00cs
## to enable disqus, you need to fill in the disqus_shortname in config.yml
## to enable duoshuo, you need duoshuo id and set duosuo to true

#share plugins at the bottom of the article
share:
  enable: true
  jiathis: true ## Jiathis是一个面向国内的分享插件,你不会想分享到google/twitter的……
  twitter: false
  google: false

bottom_link:
  github: du00cs ## 填写用户名即可
  weibo: du00cs ## 填写微博数字ID或者用户名(不是昵称)
  renren: ##e.g. 333333333 for http://www.renren.com/333333333

#google analytics id, 这个可以用来对网站进行统计,同样需要申请
google_analytics: UA-56718947-1

点点滴滴,需要耐心

  • hexo是一个台湾学生写的,不得不佩服
  • 首行缩进:英文首行有没有缩进无所谓,中文不写就很难看了——输入两个全角空格即可(一般可用shift+space切换到全角输入)
  • 添加公式支持:网上有加语句的,事实上加个插件就好了(尤其是对我这种小白)
    hexo install hexo-renderer-mathjax --save

并在_config.xml标明使用了该插件(注意空格)

plugins:
  - hexo-renderer-mathjax

  • Atom公式预览:安装markdown-preview-plus,注意Display的公式需要写成

    $$
    ax^2+bx+c=0
    $$
  • 调整markdown的样式:别人设置的样式可能有你不喜欢的,如果你看见“引用”部分居中了想修改,去metro-light/source/css/_partial/article.styl中修改即可。或者如果你有喜欢的样式,比如Mou中的GitHub2的表格是有颜色间隔的,这时可以找一个css转stylus的工具(npm install stylus),在生成的文件中把table部分代码贴过来替换掉即可。同理,如果文本是两边对齐的想替换成左对齐,可以先用浏览器的“审查元素”的功能,定位到相应的文本域,查看它的CSS就可以进行相应定位了。

  • 文章预览只显示部分内容:原始模板中首页的预览把所有文章都显示了,如果主题没有只显示部分的功能,可以手工在文章中加上<!-- more -->,这一句之后的部分就不会在首页中显示了。

  主题、插件这两个东西需要好好借助它们来为自己服务,相关的文章其实还是不少的,但是大同小异。如果不懂JS之类的,可以调整的范围也非常有限,但是试试总是没有坏处吧~最后多看看别人的主题,偷偷代码改一改,说不定会有惊喜的。最后,用Hexo搭博客就是为了好好写东西,内容,还是最重要的。

利用GitHub搭建个人博客-利其器(2)

  • Posted on:
  • By: Du00
  • With:

  工欲善其事,必先利其器。话虽然是这么说,但是在接触新事务的时候往往是相反的——先发现事情比较有意义,做着做着发现是不是做得太傻了,然后再发现其实运用某些工具可以让事情开展得更舒服。经历过这一过程的人来讲东西怎么用一般还是会把故事倒过来讲的。
  搭建博客的工具的调整主要还是在工具的微调上,具体说来有几点:

  1. 掌握hexo的基本命令,这个一看就懂,无非就是创建文章、生成页面、预览和发布;
  2. (可选,推荐)安装Atom并配置Markdown Writer
  3. (可选,推荐)用github来跟踪blog的源文件

  Linux/Mac OSX中配置这些简直是太简单了,只有Windows才会有各种麻烦。

1. hexo相关命令

  以下均是在命令行中进行的

1.1 创建文章

hexo new [layout] title

  layout不写默认就是post,会在source/_posts中创建以title命名的文件title.md,整个写博客的过程就是编辑符合markdown规范的文本。这也是hexo/jeklly号称能够让用户更专注的内容生产的原因。
  即将发布的文章layout为post没有问题,但是也如果修改了一篇需要重新发布,而另外一篇才写了一半,这时就需要做些区分了。这时可以选layout为draft,文件就会被放到source/_draft中,在生成页面时会忽略这个目录,最后再文章完成之后再拖动文件到_posts中或者

hexo publish [layout] <filename>

就可以了。

利用GitHub搭建个人博客-工具准备(1)

  • Posted on:
  • By: Du00
  • With:

  最近两个星期对Github Pages这个东西非常着迷,这东西竟然可以DIY成自己的博客! 两个星期的探索后终于摸索出一条比较好的安装/环境配置的方法,记录在此,就权当是备忘吧。

1. 什么是Github Pages?

  Github Pages是Github交给用户自己定义的主页,自定义的程度非常高(仅限于静态页面)。至于怎么被人挖掘出来做个人博客,这个我就不得而知了,我只是觉得用起来很爽……先看看下面的效果图,有没有觉得跳出了新浪、百度等等烦人的框架后清新了许多? 博客首页截图

2. 博客搭建工具一览

  其实吧,完整搭起这个博客除了文章是我自己写的(需要掌握Markdown,相信我,学会了之后你会爱上它的),其它都是借鉴(抄袭)的别人的……这个网页中我实际写的其实是这些,而看到的是下面这个页面。确实做到了让用户更关注于内容的产生,而不是各种要注意的特别格式。
markdown原始文件
  如果不是那些(姑且)称作“极客”的人开发了那么那么多的工具,你很难想象自己纯手工打造有多困难,尤其是针对像我这种对html/js/css一无所知的人。搭建工具包括:

  1. node.js
  2. hexo
  3. git/github

Thrift序列化/反序列化方法对比

  • Posted on:
  • By: Du00
  • With:

还记得最初到公司的时候thrift序列化还是用的JSON模式,现在想想效率还是太低了。先上结论部分

结论

Thrift提供了(至少)三种序列化方法,Json、Binary和Compact,三者之间性能差距还是比较大的。Json方式的选取往往不是基于效率的选择,下面是两种二进制模式Binary和Compact之间的比较:

  1. 序列化:compact模式压缩节省19.3%的空间,耗时节省20.4%
  2. 反序列化:compact模式耗时增加3.3%
方法 长度 耗时
序列化 binary 26039 16.433
compact 21020 13.085
json 25096 56.137
反序列化 binary 8.963
compact 9.257
json 61.511

测试用例

  1. thrift定义
    struct STestObject{
    1: i64 userId;
    2: i64 timestamp;
    3: list<string> apps;
    4: list<i32> pos;
    }

Functional Programming Principles in Scala - Week 1

  • Posted on:
  • By: Du00
  • With:

老文章了,正好是用Markdown写的,直接贴过来了

本来以为这只是一门编程语言的课,还是比较犹豫是否要学习。不想学习新语言也是缘于在本科的时候学“计算机考古学语言”COBOL之后留下的后遗症。上完第一周的课程再加上完成作业才发现我的想法完全错了——老师不仅仅是在教一门语言,还在推销一种编程思想——函数式编程。

  自从全球刮起了MOOC风,学习(尤其是入门)就变得简单多了,很难想象分文不花就可以跟着优秀的老师学习前沿课程。还记得以前下的Machine Learning的视频,没有字幕就算了(还能勉强听懂),那昏暗的视频、需要偷偷去找的讲义以及令人捉急的黑板板书……不得不承认这是个好时代,只要愿意学习,各种机会总是能够提供给你。我也在论坛见过了不少跟我一样的学生,在工作之余坚持上一两门课,有时候作业还真不是那么简单。为自己的努力加油吧~学了有什么用?也许没什么用,但是至少可以保持学习心态。

Spark/Scala极速入门材料

  • Posted on:
  • By: Du00
  • With:

Spark/Scala的一点入门材料,希望能对想快速了解的人有所帮助,对自己则是一个备忘。

Scala极速入门

如果需要一些感性认识,可以先读一读Scala的官方介绍。简单地说,Scala是一种更偏函数式的函数式、命令式的混合编程语言,同时也是面向对象的,函数是顶级对象,运行在Java虚拟机上,能与Java无缝结合。

package com.xiaomi.data.ctr.feature.analysis

/**
* Scala极速入门材料,可以直接贴入ScalaIDE的worksheet
*/

object test {
println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet
//val(ue) 是引用不变,不能改变val值变量的『值』
val n = 8 //> n : Int = 8
//n += 1 : value += is not a member of Int

//var(riable) 是变量,能用val用val,技穷用var
var nn = 7 //> nn : Int = 7
nn += 1
nn //> res0: Int = 8

//tuple - 使用得非常重的数据结构,同python,但是不能(显式地)按下标取到每个元素
val t = (1, "a", None) //> t : (Int, String, None.type) = (1,a,None)
t._1 //> res1: Int = 1
t._2 //> res2: String = a
t._3 //> res3: None.type = None
//纯语法,相信看过就不会忘记的
val (no, name, score) = t //> no : Int = 1
//| name : String = a
//| score : None.type = None

//collections, 取下标用()
val list = List(1, 2, 3) //> list : List[Int] = List(1, 2, 3)
list(0) //> res4: Int = 1
val m = Map(
"a" -> 1,
"c" -> 2,
"b" -> 3,
"d" -> 4) //> m : scala.collection.immutable.Map[String,Int] = Map(a -> 1, c -> 2, b -> 3
//| , d -> 4)
//取前两个
m.take(2) //> res5: scala.collection.immutable.Map[String,Int] = Map(a -> 1, c -> 2)
m("a") //> res6: Int = 1
//删除一个键,得到一个新的map
m - "a" //> res7: scala.collection.immutable.Map[String,Int] = Map(c -> 2, b -> 3, d ->
//| 4)

//函数:变量名在前、类型在后,函数头到函数体之间有“=”号
def isPalindrome(str: String) = (str == str.reverse.toString())
//> isPalindrome: (str: String)Boolean
//函数:可以显式指定返回值类型,函数的返回值就是最后一行的值
def isPalindromeDetail(str: String): Boolean = {
println(str)
str == str.reverse.toString
} //> isPalindromeDetail: (str: String)Boolean

def isPalindromeDetailUn(str: String): Boolean = ???
//> isPalindromeDetailUn: (str: String)Boolean
//函数式编程:map/filter/reduce,其它的基本都是变种
val ab = List(1, 2, 3, 4, 5, 6) //> ab : List[Int] = List(1, 2, 3, 4, 5, 6)
//每个元素乘3
ab.map(_ * 3) //> res8: List[Int] = List(3, 6, 9, 12, 15, 18)
//取出偶数
ab.filter(_ % 2 == 0) //> res9: List[Int] = List(2, 4, 6)
//reduce实现sum
ab.reduce(_ + _) //> res10: Int = 21
//reduce实现max
ab.reduce((x, y) => if (x > y) x else y) //> res11: Int = 6
}

Github Pages, 晚安

  • Posted on:
  • By: Du00
  • With:

  好久没有写博客了,有时候就是因为觉得麻烦,尤其是在百度空间的那段经历让我总觉得自己就是任人宰割的。还记得那时要对公式排个版可以说是非常辛苦,如果是简单的$x^2$这样的,可以勉强用百度空间那奇弱的编辑器用上下脚标完成。一点都不复杂的,比如$$ \frac{x - \min}{\max - \min} $$要写成上下行形式的都需要用图片了。一篇笔记在Word中写完了,想发出来还需要再编辑一个小时,这可是一点都不好玩。

  后来百度空间强推改版,不顾空间用户在贴吧几万楼的反馈,还是上了轻博客。不管轻博客如何简单、如何清新,我只知道我的格式没有了,我的插图也没有了(插图位置也是需要人工调整的)。后来出走到了新浪博客,算是安稳了一点,但是这种繁琐的编辑模式再也让人提不起兴趣了。

  直到我遇到Markdown,我才发现原来好好写写文档并且有比较好的排版是不冲突的!其间用了一段时间的在线 Markdown编辑器,后来用得比较多的还是与Evernote/印象笔记结合的“马克飞象”,是校友开发的,体验真的非常优秀。但是印象笔记还是不利于分享,我也总是想写点什么,在Coursera上上的课记点笔记什么的,贴出来也是个促进。

  至于用上Github Pages,还是昨天在Github上提交作业的时候心血来潮,折腾这玩意直到3点。开始用的是Jekyll,说实话到最后我也没配好 (虽然是码农,但是我对Web前端一无所知 ),今天中午找到了hexo这么个玩意——太简单了,一下就可以把博客建起来了。然后试了试各种主题,添加了评论、分享插件,想不到就这样完成了。

  这东西确实有一种新鲜的感觉,再加上我平时的东西也是用Markdown写的,发发博文再也不会太浪费时间了。一天在网上搜的资料那么多,如果不记下来,也是一种罪过。

  分享是人的天性。