Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Funktionale Parallelität in Scala
Search
Tobias Neef
June 13, 2013
Programming
75
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
Transcript
54 slides
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#
More Decks by Tobias Neef
See All by Tobias Neef
One night at a METRO depot
tobnee
0
100
Reactive Play and Scala
tobnee
1
290
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
530
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
270
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
380
仕様駆動開発入門 (何を作るかを先に決めて渡す) | 目指せ Kiro マスター 05
inariku
PRO
2
130
LLM 101: Exploring LLMs, Starting with Tokens.
dalinaum
0
100
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4k
LLM 101
dalinaum
0
480
作れるエンジニアから、価値を届けるエンジニアへ
ryunakayama
1
270
Claude Code ハーネスDeep Dive – 君はどこまで制御する? -
takateeen_knj
6
5.6k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
560
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
25k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
300
Context Engineering - Making Every Token Count
addyosmani
9
1.3k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
750
Highjacked: Video Game Concept Design
rkendrick25
PRO
2
560
Building Applications with DynamoDB
mza
96
7.3k
Ethics towards AI in product and experience design
skipperchong
2
460
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
630
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
520
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
800
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.7k