Scalding初探之二:动手来做做小实验
输入文件
Scalding既可以处理HDFS上的数据,也可以很方便地在本地运行处理一些test case便于debug,Source有好多种
1 TextLine(filename)
TextLine(args("input"))或者TextLine("~/data/input.txt")
对每行数据,产生包含'line和'offset两个field的tuple
2 Csv和Tsv
本地文件和HDFS文件都可以用,读时可以指定field名
Tsv(args("input"), ('userid, 'computerguid, 'event, 'json)).read
第一行如果有headers还可以自动处理field名
3 WritableSequenceFile
读取HDFS上的Sequence压缩文件,将每一行解析为(Long, String)
WritableSequenceFile(args("input"), ('serialNo, 'data))
4 IterableSource
由scala的Iterable变量创建pipe
IterableSource(List(4,8,15,16,23,42), 'foo)
创建名为'foo的field
5 NullSource
Scalding有一个隐蔽的优化,如果job中对一个pipe进行变换而最终没有write到任何地方,这段中间代码就不会被执行,如果job中一个write操作就直接抛异常了。
如果分布式计算程序只是为了产生side effect,而不需要将pipe变换的结果,比如说这种场景,仅仅从HDFS读取一些计算结果,然后将进一步计算的数据发送到数据可视化平台,又或者你只是想打印pipe的前几行Csv(input).limit(10).debug,这种优化就是一个坑了。
因此你需要Csv(input).limit(10).debug.write(NullSource)来确保side effect被执行
更多请参考Scalding-Sources, Field rules
reduce和foldLeft的区别
reduce函数必须是associative的,类似combiner,会先在map side做中间结果合并的工作。
foldLeft函数可以不是associative的,而且output的类型可以与input类型不同,结果合并只在reduce side发生。
scald.rb有坑请注意
这个不知道为啥在我这儿不能使,倒腾了几次提示我可以scald.rb --clean看看
于是乎悲剧就发生了,这个操作删除了maven下载的一系列包,对于本月已经流量超了24个G的妹子来说是沉重的打击,龟速更新完之后其他job也跑不了了,悲愤
error: error while loading <root>, error in opening zip file
error: scala.tools.nsc.MissingRequirementError: object scala not found.
一开始看了Stackoverflow上面的讨论
Scala SBT / Maven2 Error on OSX: “Error Opening Zip File” -> MissingRequirementError
然后冲过去把scalac -classpath 后面跟的jar包全都chmode a+rwx了一把,我了个。。。。。。。。。完全没用!而且~/.sbt/boot/scala-2.9.3/这个目录根本就没有蒙谁呢。。。
然后看这个 Running your Scalding jobs in Eclipse
本地写法:
Eclipse runtime configuration:
Main class: com.twitter.scalding.Tool
Program Args: <Fully Qualified Path to Job Class> <Other CLI Args>
Example: org.hokiesuns.scaldingtest.WordCountJob --local --input ./input/input.txt --output ./output.txt
VM Args: -Xmx3072m
Hadoop写法:
hadoop jar scaldingsample-0.0.1-SNAPSHOT.jar org.hokiesuns.scaldingtest.WordCountJob --hdfs --input <some path> --output <some path>
又参考这个Using IntelliJ with Twitter’s Scalding
I am able to do a local or local-hdfs run from the sbt-console:
|
1
2
|
> run-main com.twitter.scalding.Tool com.wordnik.WordCountJob --local --input doc.txt --output /tmp/notice.tsv> run-main com.twitter.scalding.Tool com.wordnik.WordCountJob --hdfs --input doc.txt --output /tmp/NOTICE_JOB |
Note that the syntax is slightly different from the the Ruby scald.rb script — local hdfs mode is indicated with ‘–hdfs’. You’ll probably often want to run sbt with more memory than this.
想着是不是可以像唐大神一样完全抛弃scald.rb自己写个bash脚本运行scalding job啊。。。
各种方法未果决定重新编译scalding,从19:05开始借流量,到22:28Google看到一个link命令scripts/scald.rb --local XXX.scala前加了sudo,试试看之后简直不敢相信,神坑被fix了。。。
scalac -classpath /Users/wei.li/.sbt/boot/scala-2.9.3/lib/scala-library.jar:/Users/wei.li/codes/scalding/scalding-core/target/scala-2.9.3/scalding-core-assembly-0.9.0rc4.jar:/tmp/maven/hadoop-core-1.1.2.jar:/tmp/maven/commons-codec-1.8.jar:/tmp/maven/commons-configuration-1.9.jar:/tmp/maven/jackson-asl-0.9.5.jar:/tmp/maven/jackson-mapper-asl-1.9.13.jar:/tmp/maven/commons-lang-2.6.jar:/tmp/maven/slf4j-log4j12-1.6.6.jar:/tmp/maven/log4j-1.2.15.jar:/tmp/maven/commons-httpclient-3.1.jar:/tmp/maven/commons-cli-1.2.jar:/tmp/maven/commons-logging-1.1.1.jar:/tmp/maven/zookeeper-3.3.4.jar -d /tmp/script-build tutorial/Tutorial1.scala
这些jar包的路径跟以前截然不同!开心得要转圈圈~
不过最后我还是抛弃了scald.rb,在本地跑直接用sbt+Eclipse,在Hadoop上跑直接用sbt+shell script
Tuple里到底发生了什么
下面这个PPT很详细地解释了不同操作对Field的影响(此处应有翻墙)
Scalding大法好,退MR保平安
Scalding将HDFS的输入抽象成一个分布式集合(和数据库中Tuple和Field的概念是一致的),与MR不同,他可以很直观地进行两个表Join的操作。
可以运行的教程
https://github.com/twitter/scalding/tree/master/tutorial
https://github.com/sharethrough/scalding-emr-tutorial
一个更复杂的例子是
Generating Recommendations with MapReduce and Scalding
Movie recommendations and more via MapReduce and Scalding
你会发现Scalding代码真的长得很像Spark
Movie Recommendations and More With Spark
再来对比一下
这个PPT里提到了Scalding可以跑在Spark上,不过除了Summingbird(scalding for hadoop, storm for realtime)里提了下,鲜有这方面实践的资料
SBT让程序跑起来
REPL交互式Shell支持
今天发现其实有个很简单的方式,直接运行
~/codes/scalding/scripts/scald-repl.sh
就可以成功地导入并找到Scalding包啦
scalding> import com.twitter.scalding._
import com.twitter.scalding._
如果遇到一些找不到scala之类的问题,sudo一下试试看
可以在~/.bash_profile中加入
alias scalding="sudo ~/codes/scalding/scripts/scald-repl.sh"
好用得飞起来
如果你想加入第三方包(比如说json解析包)
可以vi scald.rb
参考MVNrepository的写法
libraryDependencies += "org.json4s" % "json4s-jackson_2.10" % "3.2.7"
在第33行"depends" => [ "org.apache.hadoop/hadoop-core/1.1.2", 后面照着它的格式加入你需要的包依赖

然后就可以在REPL里面导入这个包啦
scripts$ sudo scald-repl.sh

可以试着玩玩儿,但还是有坑,IDE里的SpreadSheet其实更方便
添加IDE支持
在项目的project/plugins.sbt中加入
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")
或者
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
在项目的build.sbt中添加Dependency,按照MVNrepository的写法加入依赖
libraryDependencies ++= Seq(
"com.twitter" % "scalding-core_2.10" % "0.9.0rc12" exclude("com.esotericsoftware.minlog", "minlog"),
"org.apache.hadoop" % "hadoop-core" % "1.2.1" % "provided",
"org.json4s" %% "json4s-jackson" % "3.2.8"
)
sbt update
sbt eclipse
或者
sbt gen-idea
然后重新导入Eclipse就可以啦,我选择Eclipse主要是因为它有集成Scala 2.10支持的版本下载,比配IntelliJ省事儿些,而且可以设置Eclipse在每次保存的时候自动format代码,拯救了我的强迫症,知道在IntelliJ里怎么实现该功能的亲可以教教我哦~

Plugin for sbt to create Eclipse project definitions
Using IntelliJ with Twitter’s Scalding
Scalding初探之二:动手来做做小实验的更多相关文章
- 微信小程序开发入门教程(四)---自己动手做个小程序
前面已将基础知识准备的差不多了,下面实际做一个小程序. 一.目标 用于上传照片和文字. 2个主要页面:我me,设置set 二.开始制作 1.打开微信开发者工具(我用的1.02.1907160 Wind ...
- Codeforces Round #578 (Div. 2) 二维差分 可做模板
题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...
- VB 共享软件防破解设计技术初探(二)
VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- 使用PixiJS做一个小游戏
PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...
- 从零开始学做微信小程序,看这些就够了!
随着正式开放公测,微信小程序再次万众瞩目,越来越多的企业和个人涌入到小程序开发的大军中.小程序究竟是什么?适合做小程序的产品有哪些?做小程序需要提前准备什么?如何零基础学做小程序?此文,将列出OSC上 ...
- 用RecyclerView做一个小清新的Gallery效果
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
随机推荐
- R----ggplot2包介绍学习
分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无 ...
- EXCEL计算数字、汉字、英文单元格的计数
1.数字COUNT(A1:A100)2.汉字{=SUMPRODUCT(IF(LEN(A1:A100)LENB(A1:A100),1,0)*1)}3.英文{=SUMPRODUCT(IF(ISTEXT(A ...
- uploadify springMVC
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 用TCGA收集的mRNA表达数据作差异表达
做差异表达的软件DEseq和edgeR所需要的数据格式必须是原始counts,经过normalization和log2后的数据都不适合,所以对于做差异表达计算的童鞋可以使用ExperimentHub下 ...
- 从容而优雅(leisurely and elegant)
每时每刻, 我都变得更好了. ----- 法国心理学家 埃米尔 . 库埃 每时每刻, 我都变得更忙了. ----- 罗伯特 . 西奥迪尼 咬牙切齿的寒风, 昏暗的路灯, 默默的走过那一段从教室到寝 ...
- 使用自己的CSS框架(转)
[经典推介]CSS框架选择向导 不少CSS框架已经存在了一段时间,但大多数Web开发人员避免使用它们. 相反最有经验的开发者希望创建自己的CSS框架,提供个性化解决方案的优势,并减少对第三方的解决方案 ...
- centos7 安装mysql5.7.16
1 下载地址http://dev.mysql.com/downloads/mysql/#downloads 2. 解压 -linux-glibc2.-x86_64.tar.gz 3.移动解压出来的文件 ...
- Django1.9开发博客(10)- 全文搜索
Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架. django-haystack能为Django提供whoosh,solr,Xapian和Elastic ...
- mysql跟踪和日志
mysql 打开 general log 后,所有的查询语句都会记录在 general log 文件,文件为只读方式,但这样general log文件会非常大,所以默认是关闭的. 但有时需要查错等原因 ...
- Svn与Git的一些区别(转载)
把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本 ...