Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Funktionale Parallelität in Scala
Search
Tobias Neef
June 13, 2013
Programming
71
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Funktionale Parallelität in Scala
Tobias Neef
June 13, 2013
More Decks by Tobias Neef
See All by Tobias Neef
One night at a METRO depot
tobnee
0
96
Reactive Play and Scala
tobnee
1
280
Behavioural Abstractions in Play
tobnee
0
160
Functional Parallel Architecture
tobnee
1
110
OO in Scala - The unloved side of the cake?
tobnee
2
140
Play Techtalk - Async Play
tobnee
2
520
Other Decks in Programming
See All in Programming
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
150
数百円から始めるRuby電子工作
tarosay
0
160
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
260
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
160
今さら聞けない .NET CLI
htkym
0
190
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.7k
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1k
Android CLI
fornewid
0
220
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
240
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
240
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
710
Rails Girls Zürich Keynote
gr2m
96
14k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
What's in a price? How to price your products and services
michaelherold
247
13k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
250
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
230
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
450
Transcript
Funktionale Parallelität in Scala
Procedural Parallelism vs. Functional Parallelism
How vs. What
A uniform API for parallelism
map / / transform from a -> b flatMap /
/ transform a -> a1..ax filter / / only use certain values zip / / combine computations reduce / / transform a1..ax -> b
Divide and Conquer
Parallel Sum
Technical View
Slice P P P W W
API View
def sum(numbers:Seq[Long]) = numbers.reduce(_+_)
A Scala ForkJoin Interface
def sum(numbers:Seq[Long]) = numbers.par.reduce(_+_)
Async IO Processing
Reduce Blocking -> Increase parallelism
None
0 20 40 60 80 Deal2 Deal1 Deal5 Deal4 Deal3
Deals Berlin
None
App Index Page Deal 1 Deal 2 Deal X HTML
Parser Output Gen
App Index Get D1 Get D2 Get DX Result Parse
D1 Parse D2 Parse DX Merge Time
Futures
java.util.concurrent
None
None
scala.concurrent
map flatMap filter forEach zip andThen ...
val f = for { a ˡ Future(10 / 2)
/ / 10 / 2 = 5 b ˡ Future(a + 1) / / 5 + 1 = 6 c ˡ Future(a - 1) / / 5 - 1 = 4 if c > 3 } yield b * c
Back to the example
App Index Get D1 Get D2 Get DX Result Parse
D1 Parse D2 Parse DX Merge Time
A chain of dependent operations happening in the future
def dealOverviewData(city: String) = for { links <-
dealLinksForCity(city) dealPriceAndDiscounts <- fetchAndExtractDeals(links) if !dealPriceAndDiscounts.isEmpty } yield dealPriceAndDiscounts
App Index Get D1 Get D2 Get DX Result Parse
D1 Parse D2 Parse DX Merge Time
def dealLinksForCity(city: String) = { WS.url(url+city).get() .map(_.body.toString) .map(extractLinks) }
App Index Get D1 Get D2 Get DX Result Parse
D1 Parse D2 Parse DX Merge Time
def dealOverviewData(city: String) = for { links <-
dealLinksForCity(city) dealPriceAndDiscounts <- fetchAndExtractDeals(links) if !dealPriceAndDiscounts.isEmpty } yield dealPriceAndDiscounts “Parallel Looping”
def fetchAndExtractDeals(links:List[String]) = .... links.map(fetchAndExtractDealData) ....
def fetchAndExtractDealData(link: String) = { WS.url(link).get() .map(_.body.toString) .map(extractDealData) }
App Index Get D1 Get D2 Get DX Result Parse
D1 Parse D2 Parse DX Merge Time
def fetchAndExtractDeals(links:List[String]) = Future.sequence( links.map(fetchAndExtractDealData) )
def dealOverviewData(city: String) = for { links <-
dealLinksForCity(city) dealPriceAndDiscounts <- fetchAndExtractDeals(links) if !dealPriceAndDiscounts.isEmpty } yield dealPriceAndDiscounts
https:/ /github.com/ tobnee/play-async-ws- demo
Parallel (Distributed) Batch Processing
MapReduce
map (k1,v1) ˠ list(k2,v2) reduce (k2,list(v2)) ˠ list(v3)
Distributed WordCount http:/ /commons.wikimedia.org/wiki/File:Rosetta_Stone.JPG
map(String key, String value): for each word w in value:
EmitIntermediate(w, "1");
reduce(String key, Iterator values): int result = 0; for each
v in values: result += ParseInt(v); Emit(AsString(result));
http:/ /de.wikipedia.org/wiki/Datei:Mapreduce_(Ville_Tuulos).png
Lets get real
1 package org.myorg; 2 3 import java.io.IOException; 4 import java.util.*;
5 6 import org.apache.hadoop.fs.Path; 7 import org.apache.hadoop.conf.*; 8 import org.apache.hadoop.io.*; 9 import org.apache.hadoop.mapreduce.*; 10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 11 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 13 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 14 15 public class WordCount { 16 17 public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 18 private final static IntWritable one = new IntWritable(1); 19 private Text word = new Text(); 20 21 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 22 String line = value.toString(); 23 StringTokenizer tokenizer = new StringTokenizer(line); 24 while (tokenizer.hasMoreTokens()) { 25 word.set(tokenizer.nextToken()); 26 context.write(word, one); 27 } 28 } 29 } 30 31 public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { 32 33 public void reduce(Text key, Iterable<IntWritable> values, Context context) 34 throws IOException, InterruptedException { 35 int sum = 0; 36 for (IntWritable val : values) { 37 sum += val.get(); 38 } 39 context.write(key, new IntWritable(sum)); 40 } 41 } 42 43 public static void main(String[] args) throws Exception { 44 Configuration conf = new Configuration(); 45 46 Job job = new Job(conf, "wordcount"); 47 48 job.setOutputKeyClass(Text.class); 49 job.setOutputValueClass(IntWritable.class); 50 51 job.setMapperClass(Map.class); 52 job.setReducerClass(Reduce.class); 53 54 job.setInputFormatClass(TextInputFormat.class); 55 job.setOutputFormatClass(TextOutputFormat.class); 56 57 FileInputFormat.addInputPath(job, new Path(args[0])); 58 FileOutputFormat.setOutputPath(job, new Path(args[1])); 59 60 job.waitForCompletion(true); 61 } 62 63 }
FP equivalent in Scala
val lines = fromTextFile("hdfs:/ /in/...") ! val counts = lines.flatMap(line
=> line.split(" ")) .map(word => (word, 1)) .groupByKey .combine(_+_) ! persist(counts.toTextFile("hdfs:/ /out/...", overwrite=true))
We have seen classic examples of parallel computations MapReduce ForkJoin
Async Workflows
Some of these concepts can be expressed in a uniform,
monadic way This style of programming is well suited for functional languages like Scala, Haskell, Clojure or F#