SlideShare uma empresa Scribd logo
1 de 97
Baixar para ler offline
Apache Spark チュートリアル
東北大学 乾・岡崎研究室
山口健史
2015-04-28
MapReduceのはなし
1
単語の頻度カウントを例に
2
素朴な実装 3
frequency = defaultdict(int)
for line in opened_file:
for word in some_splitter(line):
frequency[word] += 1
for word in frequency:
some_output(word, frequency[word])
ファイル
frequency
メモリに
辞書/ハッシュ/
連想配列/Mapを
持つ頻度(Pythonic)
frequency = collections.Counter(
word
for line in opened_file
for word in some_splitter(line))
for word, count in frequency.iteritems():
some_output(word, count)
巨大なファイルだと…… 4
:
for line in opened_file:
for word in some_splitter(line):
frequency[word] += 1
:
巨大な
ファイル メモリが
足りない!!
入力を分割する 5
頻度
ファイル
ファイル
頻度
同じ単語が両方のファイルに入ってるので
統合するときになにか工夫しないとやっぱり
メモリが足りない
出力を分割する 6
frequency = defaultdict(int)
for line in opend_file:
for word in some_splitter(line):
if hash(word) % 2 == 1:
frequency[word] += 1
:
frequency = defaultdict(int)
for line in opend_file:
for word in some_splitter(line):
if hash(word) % 2 == 0:
frequency[word] += 1
:
巨大な
ファイル
頻度
頻度
ハッシュの
剰余で間引いて
半分に
ある単語は一方の
ファイルにだけ存在
単純に結合すればOK
もう一度読む
残り半分
組み合わせる 7
f = [defaultdict(int)
for i in range(2)]
for l in of:
for w in sp(l):
f[hash(w) % 2]
[w] += 1
ファイル
ファイル
同じ単語が
入っている
ファイル同士を
統合する
剰余で分割
ファイルを
分割
単純な
結合でOK
並列可能
これだとスケールアウトする
 並列に実行できるようになっている
 ファイル読み込みの部分が並列実行可能
 それでもメモリが足りなくなるなら
分割数を増やせばいい
 100〜10,000分割でも動くアルゴリズム
8
でもHadoopは簡単じゃなかった
 簡単なことにたくさんソースを書く
 Hadoopの仕組みを知らないと作れない
 たいていのフレームワークはそうだけど……
9
でもHadoopは簡単じゃなかった
 定型部分の方が多い
 何度もMapReduce
する処理を書こうと
すると、
ほとんど同じで
微妙な違いしかない
ソースがたくさん
できる
10
/*
* 仮型引数
* FileInputFormatだと第1引数はLongWriteable, 第2引数はtext。
* 第3引数がmap出力のkey, 第4引数がmap出力のvalue
*/
public static class Map
extends Mapper<LongWritable, Text, Text, LongWritable> {
private Text outKey = new Text("LINES");
private LongWritable outValue = new LongWritable(1);
@Override
protected void map(LongWritable inputKey,
Text value,
Context context)
throws IOException, InterruptedException {
context.write(outKey, outValue);
}
}
/*
* <map出力のkey=reduce入力, map出力のvalue=reduce入力,
* reduce出力のkey, reduce出力のvalue>
*/
public static class Reduce
extends Reducer<Text, LongWritable, Text, LongWritable> {
private LongWritable outValue = new LongWritable();
@Override
protected void reduce(Text key,
Iterable<LongWritable> values,
Context context)
throws IOException, InterruptedException {
long total = 0L;
for (LongWritable value : values) {
total += value.get();
}
outValue.set(total);
context.write(key, outValue);
}
}
←行数をカウントする
MapReduce
個人の感想です
Apache Spark のはなし
11
Sparkとは
 Hadoop MapReduceにインスパイア
された分散処理基盤
 Hadoop-HDFSのような分散ファイルシステムを
ベースとして利用する
 Scala製。PythonやJavaでも使える
12
Sparkのうれしいところ
 ScalaやPythonのコードが
MapReduceのように動く
 SparkやHDFSがなにをしてくれるかは知らなく
ても書ける(理解しておいた方はよい)
 途中のデータをメモリに保持できる
 Sparkが高速と言われる理由
 Hadoop-MapReduceは必ずディスク保存だった
13
Sparkは簡単
 例)タブ区切りの5カラム目を切り出し
”拡散希望”が含まれるものを抽出
 これで分散処理される
14
(Python)
sc.textFile(u'tweets.txt').
map(lambda x: x.split('t')[4]).
filter(lambda x: u'拡散希望' in x)
Sparkは簡単
 例)タブ区切りの5カラム目を切り出し
”拡散希望”が含まれるものを抽出
 これで分散処理される
15
(Scala)
sc.textFile("tweets.txt").
map(_.split("t")(4)).
filter(_.contains("拡散希望"))
研究室の環境について
 研究室のマシンではSparkクラスタが
常時起動しているわけではない
 Hadoop-YARNにリソースを要求して
必要な時にクラスタを起動する
16
クラスタの起動と解消
 要求/確保したリソースでクラスタを
構成する
executor(並列処理のワーカー)6個分の
メモリを要求している
 spark-shellの終了がクラスタの解消
 終了しないとリソースを確保した状態のまま
17
spark-shell --master yarn-client --num-executors 6
Sparkのコンポーネント 18
node00 node01 node02 node03
node04 node05 node20
driver
executor
executor
master
executor
executor
executor
executor
executor
executor
executor
executor
executor
(shell実行モードの場合)
driver
19
node00 node01 node02 node03
node04 node05 node20
driver
executor
executor
master
executor
executor
executor
executor
executor
executor
executor
executor
executor
利用者が見ているコンソール(spark-shell)
WebUIも提供する
定数・関数などの定義(定義したものは各
executorに分散され共有される)
executor
20
node00 node01 node02 node03
node04 node05 node20
driver
executor
executor
master
executor
executor
executor
executor
executor
executor
executor
executor
executor
実際にジョブを実行している部分
master
21
node00 node01 node02 node03
node04 node05 node20
driver
executor
executor
master
executor
executor
executor
executor
executor
executor
executor
executor
executor
SparkではなくHadoop YARNのコンポーネント
なにをしているかはわかってない
YARN Resource Managerとやりとりしている(?)
Sparkを体験する
22
かんたんSpark体験
 ローカルで2つのexecutorで実行する
23
#Mac Homebrewで
brew install apache-spark
#Scalaシェル
spark-shell --master "local[2]"
#Pythonシェル
pyspark --master "local[2]"
WebUI
24
http://localhost:4040/jobs/WebUI
かんたん並行処理
 a.reduceは2プロセスで
b.reduceは1プロセスで実行される
 Pythonプロセスと実行時間で確認
25
(Python)
# 0から999999999までの総和を計算する
from operator import add
a = sc.parallelize(xrange(1000000000), 2)
b = sc.parallelize(xrange(1000000000), 1)
a.reduce(add)
499999999500000000
b.reduce(add)
499999999500000000
かんたん並行処理
 Scalaではスレッドが使われる
26
(Scala)
// 0から999999999までの総和を計算する
val a = sc.parallelize(1L until 1000000000, 2)
val b = sc.parallelize(1L until 1000000000, 1)
a.reduce(_ + _)
499999999500000000
b.reduce(_ + _)
499999999500000000
SparkContext
 scはspark-shell起動時に生成される
SparkContext型のインスタンス
 SparkContextはジョブの実行状態や
参加しているexecutorの状態を持つ
27
a = sc.parallelize(xrange(1000000000), 2)
RDD "Resilient Distributed Dataset"
 分散データを扱う抽象コレクション
 データの実体がどこにあるのかを意識しない
 並列動作する変換操作(map, filter,,)
 キャッシュの選択肢
 メモリにキャッシュ, ディスクにキャッシュ
28
RDD : 作成
 RDDの作成はSparkContextから
29
(Python)
sc.parallelize([1, 2, 3, 4, 5])
# ローカルコレクションをRDDに変換
sc.textFile("file.text")
sc.textFile("directory/*.gz")
# 文字列のコレクションになる
# テキストファイルを指定してRDDを作成
# クラスタがローカル実行ならローカルのファイルから
# クラスタがHadoop-YARN上にあるならHDFSから
# クラスタがAWS上にあるならS3から読みこんだり
# 圧縮ファイルなら解凍後のデータを読む
# 実行してもすぐにファイルを読みこまない
Spark-Shellのメモリ上で
インスタンス化している
という意味
RDD : アクション(1) 30
(Python)
nums = sc.parallelize([4, 3, 2, 5, 1])
nums.collect()
# => [4, 3, 2, 5, 1]
# 全ての要素をローカルのコレクションにする
nums.take(3)
# => [4, 3, 2] 冒頭3個の要素
nums.top(3)
# => [5, 4, 3] 自然順序づけで大きい方から3つの要素
 RDDから具体的なデータへ変換する
(ローカルコレクション, 値, ファイル)
Pythonだとcmp()関数
Java/ScalaだとComparable
での比較
RDD : アクション(2) 31
(Python)
nums = sc.parallelize(xrange(1000))
nums.count()
# => 1000
# 要素数
nums.reduce(lambda x, y: x + y)
# => 499500
# 畳み込み (((…(((0+1)+2)+3)+…+998)+999)
nums.saveAsTextFile("destination")
# テキストファイルとして出力
 RDDから具体的なデータへ変換する
(ローカルコレクション, 値, ファイル)
RDD : 変換(基本)
 RDDを元に別のRDDを定義する
 RDDはイミュータブル(書き換え不能)
32
(Python)
nums = sc.parallelize([1, 2, 3])
nums.map(lambda x: x * x)
# => [1, 4, 9] 関数適用
nums.filter(lambda x: x % 2 == 0)
# => [2]フィルタリング
nums.flatMap(lambda x: range(x))
# => [0, 0, 1, 0, 1, 2]
# 「1つの値からコレクションを返す」関数を元に複数データを生成
RDD : 変換(2-value tuple)
 2値タプルのRDDに追加されるメソッド
33
(Python)
pets = sc.parallelize(
[("cat", 1), ("dog", 1), ("cat", 2)])
pets.groupByKey()
# => [("cat", [1, 2]), ("dog", [1])]
pets.reduceByKey(lambda x, y: x + y)
# => [("cat", 3), ("dog", 1)]
pets.sortByKey()
# => [(cat, 1), (cat, 2), (dog, 1)]
RDD : 変換(2つの2-value tuple)
 2値タプルのRDDに追加されるメソッド
34
(Python)
pets = sc.parallelize(
[("cat", 1), ("dog", 1), ("cat", 2)])
names = sc.parallelize(
[("cat", "Tama"), ("dog", "Pochi")])
pets.join(names)
# => [("dog", (1, "Pochi")),
# ("cat", (1, "Tama")),
# ("cat", (2, "Tama"))]
pets.cogroup(names)
# => [("dog", ([1], ["Pochi"])),
# ("cat", ([1,2], ["Tama"]))] 相当
RDD : メソッド群 35
アクション
データの具体化
変換
抽象コレクションの操作
foreach
collect
reduce
fold
count
saveAsTextFile
map
flatMap
filter
collect
distinct
sample
sortByKey
groupByKey
reduceByKey
zip
cartesian
union
intersection
subtract
repartition
join
cogroup
etc…
take
first
top
takeOrdered
etc…
メタ操作
cache
unpersist
checkpoint
etc…
こっちのcollectは
Pythonにはない
RDD : 資料
 http://spark.apache.org/docs/latest/api/scala/index.html#or
g.apache.spark.rdd.RDD
 http://spark.apache.org/docs/latest/api/python/pyspark.ht
ml#pyspark.RDD
 http://www.ne.jp/asahi/hishidama/home/tech/scala/spark/R
DD.html
36
(mezcalのSparkバージョンに合わせて1.2.0へのリンク)
RDDと並列可能性
37
並列コレクション 38
node1 node2 node3
executor executor executor
(executorが3つの場合)
(Python)
sc.parallelize(xrange(100), 3) #パーティション数3を指定
sc.count() # 3並列で処理される
0
1
2
3
:
32
33
34
35
36
:
65
66
67
68
69
:
99
RDD
パーティション
並列コレクション 39
(Python)
sc.parallelize(xrange(100), 1) #パーティション数1を指定
sc.count() # 1並列で処理される
node1 node2 node3
executor executor executor
0
1
2
:
98
99
RDD
(executorが3つの場合)
分割可能なファイル
 ローカリティを考慮してなるべくデータを保持するノードで処理する
40
(executorが3つの場合)
(Python)
sc.textFile("/work/test/data.txt") # 128MB未満
sc.count() # 1並列で処理される(HDFS上のファイルの場合)
node1 node2 node3
executor executor executor
data.txt
RDD
分割可能なファイル
 HDFSはファイルを128MBごとに
分割して分散させている(研究室の設定では)
 プレーンテキストとbzip2ファイルが
分割可能なファイル形式
 分割可能なファイルはブロック単位に並列分散
処理される
41
分割可能なファイル 42
(executorが3つの場合)
(Python)
sc.textFile("/work/test/large.txt") # 300MBぐらい
sc.count() # 3並列で処理される
node1 node2 node3
executor executor executor
large.txt
(block1)
large.txt
(block2)
large.txt
(block3)
RDD
分割可能なファイル
 128MBの境界で文が分かれてしまわな
いの?
 心配いらない
改行をまたぐ部分がネットワークを移動して
文単位で処理される
43
分割可能なファイル
 境界をまたぐ分が移動してから処理が始まる
44
(executorが3つの場合)
(Python)
sc.textFile("/work/test/large.txt") # 300MBぐらい
sc.count() # 3並列で処理される
node1 node2 node3
executor executor executor
large.txt
(block1)
large.txt
(block2)
large.txt
(block3)
RDD
分割可能でないファイル
 分割可能でないファイル
 例えばgzip圧縮ファイルとか
 128MBを超えるファイルは後ろのブロックが
すべてネットワーク越しにコピーされてから
処理が始まる=分散されない!!
 128MBを超えないぐらいの大きさに抑える
 トータルのパフォーマンスはこの置き方が一番いい
45
分割可能でないファイル 46
node1 node2 node3
executor executor executor
data.gz
(block1)
data.gz
(block2)
data.gz
(block3)
HDFS
Spark
300MBのgzipファイルがあって
こんな風に分散されているとすると
分割不可能なファイル 47
(executorが3つの場合)
(Python)
sc.textFile("/work/test/data.gz") # 300MBぐらい
sc.count() # 1並列でしか処理されない
node1 node2 node3
executor executor executor
data.gz
(block1)data.gz
(block2)
data.gz
(block3)
data.gz
(block2)
data.gz
(block3)
ネットワーク
越しのコピー
RDD
分割可能でないファイル
 この形が一番効率がいい
48
(executorが3つの場合)
(Python)
sc.textFile("/work/test/p*.gz") # 該当する3ファイル(128MB未満)
sc.count() # 3並列で処理される
node1 node2 node3
executor executor executor
p0.gz p1.gz p2.gz
RDD
Spark実例
(頻度カウント再び)
49
変換の連鎖
 ここまで実行してもまだ
テキストを読みこんでない
(RDDからRDDへの変換操作だから)
50
(Python)
src = sc.textFile("hightemp.txt")
# ファイルを指定してRDDを作成する
tuples = src
.map(lambda x: x.split("t"))
.filter(lambda x: len(x) > 3)
# 100本ノック12
col1 = tuples.map(lambda x: x[0])
col2 = tuples.map(lambda x: x[1])
tabで分割
要素数4
以上
1列目
2列目
高知県t江川崎t41t2013-08-12
埼玉県t熊谷t40.9t2007-08-16
岐阜県t多治見t40.9t2007-08-16
山形県t山形t40.8t1933-07-25
山梨県t甲府t40.7t2013-08-10
:
アクション
 いつの間にか並行処理されている
51
(続き)
col1.count()
24
# ここではじめてファイルを読みこんで
# split->filter->map->count が実行される
col1.saveAsTextFile("col1")
# またファイルを最初から読みこんで
# split->filter->map->saveAsTextFile が実行される
# これでcol1というテキストが作成される……かと思いきや
# col1というディレクトリができている
# ローカル実行だと2ファイルある(part-00000 part-00001)
かもしれないし、されないかもしれない
キャッシュの制御 52
(続き)
# 毎回ファイルを読みこむのは効率が悪い
col1.cache()
# これで可能ならばメモリに保持するようになった
col1.count()
24
# またファイルから読んでsplit->filter->map->count
col1.distinct().count()
12
# 異なり数を数える(100本ノック17)
col1.take(2)
[u'u9ad8u77e5u770c', u'u57fcu7389u770c']
ここではもう
ファイルを
読んでいない
もうちょっと変換 53
(続き)
# 2カラム目でソート
sorted_by_col2 = tuples.sortBy(lambda x: x[1])
# 3カラム目(数値)で降順ソート(100本ノック18)
sorted_by_col3 = tuples
.sortBy(lambda x: float(x[2]), False)
# 1コラム目の頻度の高い順にソート(100本ノック19)
from operator import add
frequency = col1.map(lambda x: (x, 1))
.reduceByKey(add)
.sortBy(lambda x: x[1], False)
# ここに書いたのは全部RDD変換定義のみで出力はない
昇順
降順
何をしているか(100本ノック19)
54
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
:
String
[高知県,江川崎,41,2013-08-12]
[埼玉県,熊谷,40.9,2007-08-16]
[岐阜県,多治見,40.9,2007-08-16]
[山形県,山形,40.8,1933-07-25]
:
高知県
埼玉県
岐阜県
山形県
:
String
(高知県,1)
(埼玉県,1)
(岐阜県,1)
(山形県,1)
:
(String, Int)
(高知県,[1].reduce(add))
(埼玉県,[1,1,1].reduce(add))
(岐阜県,[1,1].reduce(add))
(山形県,[1,1,1].reduce(add))
:
(String, Int)
map(x.split("t"))
filter(len(x)>3)
map(x[0])
map((x, 1))
reduceByKey(add)
Array[String]
col2
sortBy(x[1], False)
tuples
型名はScala準拠
(埼玉県,3)
(山形県,3)
(山梨県,3)
(群馬県,3)
:
frequency
もうちょっとアクション 55
(続き)
import json
def pp(obj):
print json.dumps(obj, ensure_ascii=False)
pp(sorted_by_col3.take(3))
[["高知県", "江川崎", "41", "2013-08-12"], ["埼玉県",
"熊谷", "40.9", "2007-08-16"], ["岐阜県", "多治見",
"40.9", "2007-08-16"]]
# 先頭から3個
pp(col1.takeOrdered(3))
["千葉県", "千葉県", "和歌山県"]
# 自然順序づけで小さい方から3個
pp(col1.top(3))
["高知県", "静岡県", "静岡県"]
# 自然順序づけで大きい方から3個
もうちょっとアクション 56
(続き)
for data in frequency.take(10):
print u'({}, {})'.format(*data)
(埼玉県, 3)
(山形県, 3)
(山梨県, 3)
(群馬県, 3)
(静岡県, 2)
(岐阜県, 2)
(愛知県, 2)
(千葉県, 2)
(高知県, 1)
(大阪府, 1)
Spark実例
(PMI計算)
57
テキストを読んで頻度カウント 58
val src = sc.textFile("tuples.tsv")
val tuples = src.
map(_.split("t")).
filter(_.size > 1)
val aFreq = tuples.
map( t => (t(0), 1L) ).reduceByKey(_+_)
val bFreq = tuples.
map( t => (t(1), 1L) ).reduceByKey(_+_)
val instancesFreq = tuples.
map( t => ((t(0), t(1)), 1L) ).reduceByKey(_+_)
ここからは Scala です
combinationtoffers
alabamathome
weddingtgreek
eviltdead
:
何をしているか 59
combination offers
alabama home
wedding greek
evil dead
String
[combination, offers]
[alabama, home]
[wedding, greek]
[evil, dead]
(offers, 81)
(home, 36)
(greek, 24)
(dead, 20)
(String, Int)
map(_.split("t"))
filter(_.size>1)
Array[String]
(combination, 20)
(alabama, 40)
(wedding, 40)
(evil, 16)
(String, Int)
((combination, offers), 1)
((alabama, home), 5)
((wedding, greek), 5)
((evil, dead), 3)
((String, String), Int)
map
reduceByKey
map
reduceByKey
map
reduceByKey
tuples
aFreq
bFreq
instanceFreq
頻度をつなぎあわせていく 60
val pmiSrc = instancesFreq.
map{ case ((a, b), t_f)
=> (a, (b, t_f)) }.
join(aFreq).
map{ case (a, ((b, t_f), a_f))
=> (b, (a, t_f, a_f)) }.
join(bFreq).
map{ case (b, ((a, t_f, a_f), b_f))
=> (a, b, t_f, a_f, b_f) }
Scalaだとパターンマッチで書けるけどPythonだと
map(lambda x: (x[1][0][0], x[0], x[1][0][1], x[1][0][2], x[1][1]))
pmi(a, b) = log
P(a, b)
P(a) P(b)
(aの文字列, bの文字列, [a, b]の頻度, aの頻度, bの頻度)
という組み合わせ(タプル)が欲しい
何をしているか 61
map
((combination, offers), 1)
((alabama, home), 5)
((wedding, greek), 5)
((evil, dead), 3)
(combination, (offers, 1))
(alabama, (home, 5))
(wedding, (greek, 5))
(evil, (dead, 3))
(combination, 20)
(alabama, 40)
(wedding, 40)
(evil, 16)
(String, Int)
((String, String), Int)
(combination, ((offers, 1), 20))
(alabama, ((home, 5), 40))
(wedding, ((greek, 5), 40))
(evil, ((dead, 3), 16))
(String, ((String, Int), Int))
join
(String, (String, Int))
("a", 1)
("a", 2)
("b", 3)
("c", 4)
("a", "あ")
("a", "い")
("b", "か")
("d", "た")
から
※joinはinner joinするメソッド
("a", (1, "あ"))
("a", (1, "い"))
("a", (2, "あ"))
("a", (2, "い"))
("b", (3, "か")) を作る
(続く)
instanceFreq
aFreq
何をしているか 62
map
(combination, ((offers, 1), 20))
(alabama, ((home, 5), 40))
(wedding, ((greek, 5), 40))
(evil, ((dead, 3), 16))
(offers, (combination, 1, 20))
(home, (alabama, 5, 40))
(greek, (wedding, 5, 40))
(dead, (evil, 3, 16))
(offers, 81)
(home, 36)
(greek, 24)
(dead, 20)
(String, Int)
(String, ((String, Int), Int)) (String, (String, Int, Int))
(offers, ((combination, 1, 20), 81))
(home, ((alabama, 5, 40), 36))
(greek, ((wedding, 5, 40), 24))
(dead, ((evil, 3, 16), 20))
(String,((String, Int, Int), Int))
join
(combination, offers, 1, 20, 81)
(alabama, home, 5, 40, 36)
(wedding, greek, 5, 40, 24)
(evil, dead, 3, 16, 20)
(String, String, Int, Int, Int)
map
=(a, b, [a, b]の頻度, aの頻度, bの頻度)
前ページ
最後
pmiSrc
bFreq
計算する 63
val instancesAll = tuples.count
def calcDicountPmi(instance:Long, a:Long, b:Long) = {
def smooth (x:Long, y:Double) = {
x / (x + y) }
def discount(iTmp:Long, aTmp:Long, bTmp:Long) = {
smooth(iTmp, 1.0) * smooth(math.min(aTmp, bTmp), 1.0) }
def calcPmi(iTmp:Long, aTmp:Long, bTmp:Long) = {
import math.log
log(iTmp) - log(aTmp) - log(bTmp) + log(instancesAll) }
calcPmi(instance, a, b) * discount(instance, a, b)
}
val pmi = pmiSrc.map{
case (a, b, t_f, a_f, b_f)
=> (calcDicountPmi(t_f, a_f, b_f), a, b, t_f, a_f, b_f)
}
pmi.top(5).foreach(println)
(5.771154762538349,fat,greek,8,36,24)
(5.724583909571343,hong,kong,6,28,17)
(5.660412678732772,freaks,legged,4,16,9)
(5.632288650398451,greek,fat,5,20,19)
(5.590241876891969,scams,scams,3,8,7)
普通の定数
普通の関数
(クロージャ)
RDD変換
無駄な処理をしているのでは?
 その通り。aの頻度とbの頻度が
メモリにのりきるなら
Map(=辞書)として具体化した方が速い
 ただしこれはスケールアウトしない
64
val aFreqMap = aFreq.collectAsMap
val bFreqMap = bFreq.collectAsMap
val pmiSrc = instancesFreq.map{
case ((a, b), t_f) =>
(a, b, t_f, aFreqMap(a), bFreqMap(b))
}
まとめ
 Sparkでもちゃんとスケールアウトする
ように書くのはコツが要る
 それでも並列処理を書くコストは
ずっと小さくなっている
 Sparkに求める事を意識して書き分ける
 並列処理を簡単に書きたい のか
 大規模データでもスケールアウトさせたい のか
65
Apache Spark チュートリアル
補遺
67
val s:String="hello"
s: String = hello
値の束縛
val i=1
i: Int = 1
型推論
var j=1
j: Int = 1
変数への代入
i=i+1 //間違い(再代入不可)
error: reassignment to val
j=j+1
j: Int = 2
s.contains("el")
res: Boolean = true
メソッド呼び出し
s contains "em"
res: Boolean = false
演算子スタイル
1+2 は 1.+(2) のこと
val t1=("a",3)
t1: (String, Int) = (a,3)
タプル
val t2="b"->4
t2: (String, Int) = (b,4)
2値タプルのシンタックスシュガー
t1._1
res: String = a
t1._2
res: Int = 3
タプルの要素
val nums = Seq(1,2,3)
nums: Seq[Int] = List(1, 2, 3)
シーケンス(Seqはファクトリでもある)
nums.map((x:Int)=>x*2)
res: Seq[Int] = List(2, 4, 6)
無名関数,マップ
nums.map(x=>x*2)
同上(型推論)
nums.map(_*2)
同上(プレースホルダー)
nums.reduce((x,y)=>x+y)
res: Int = 6
畳み込み
nums.reduce(_+_)
同上(プレースホルダー)
def even(x:Int):Boolean={
x%2==0
}
even: (x: Int)Boolean
関数(最後に評価した値が返り値)
nums.filter(even)
res: Seq[Int] = List(2)
フィルタリング
for (i<-nums) {
println(i)
}
1
2
3
繰り返し,標準出力
nums.foreach(println)
同上
val tuples=Seq(t1, t2)
tuples: Seq[(String, Int)] =
List((a,3), (b,4))
tuples.map{t=>
val i=t._2
t._1+i.toString
}
res: Seq[String] = List(a3, b4)
{} は複数行の無名関数を作る
tuples.map{t=>
t match {
case (s,i)=>s+i.toString
}
}
同上(パターンマッチング)
tuples.map{case (s,i)=>s+i.toString}
同上(パターンマッチング)
import scala.math
math.max(1,2)
res: Int = 2
パッケージのインポート
import scala.math._
max(1,2)
パッケージから全てインポート
s.split("l")
res: Array[String] = Array(he, "", o)
s(0)
res: String = he
配列のインデックスアクセス
nums.mkString(",")
res: String = 1,2,3
t1.mkString(",") //間違い
error: value mkString is not a member
of (String, Int)
s"${t1._1},${t1._2}"
res: String = a,1
文字列への変数の埋め込み
Scala Cheat Sheet
statement
result in the REPL
補足
Apache Spark チュートリアル
HDFSのはなし
70
HDFSとは?
 Hadoop Distributed File System
 分散仮想ファイルシステム
 普通のファイルシステムとして
マウントできない(実用レベルでは)
71
HDFSクラスタ
node7
HDFS
72
node1 node2 node3 node4
node5 node6 node8
300MB
の
ファイル
登録
HDFSクラスタ
node7
HDFS
73
node1 node2 node3 node4
node5 node6 node8
block3
block1
block2
登録
128MBごとの
固まりに
分ける
HDFSクラスタ
node7
HDFS
74
node1 node2 node3 node4
node5 node6 node8
block3
block1
block2
登録
block1
block1
block1block2
block2 block2
block3
block3
block3
3重に複製されてクラスタに保管される
HDFS
 なぜ128MBごとに分割するか?
 MapReduceではデータが分散されている必要が
ある
 MapReduceでは各ワーカーの処理がメモリーに
乗りきる必要がある
 なぜ複製を作るのか?
 障害耐性が高くなる
 分散処理の効率がよくなる
(データの移動が少なくなる)
75
Sparkでも同じ!
Hadoop-HDFSで
使うコマンド
76
よくつかうコマンド
 最近流行りの
コマンド サブコマンド オプション
の形をしている。
 hdfs コマンド
 ファイルシステムに何かする
77
よくつかうコマンド
 hdfs dfs 〜
 hdfsの操作
 hdfs dfs –ls 〜
 hdfs dfs –rm 〜
 hdfs dfs –rm –r 〜
 hdfs dfs –du –s –h 〜
 hdfs dfs –mkdir 〜
 hdfs dfs –cp 〜 〜
 hdfs dfs –mv 〜 〜
78
よくつかうコマンド
 hdfs dfs –put ローカルエントリ hdfsエントリ
 HDFSにファイルを送る
 hdfs dfs –get hdfsエントリ ローカルエントリ
 hdfsからファイルを持ってくる
79
Apache Spark チュートリアル
MapReduceの様子
81
MapReduce
82
あらかじめ
データは分散されて
置かれている
がノード
データ
MapReduce : Map & Partition
83
分割する
(ハッシュの剰余
などを使う)
MapReduce : Shuffle & Sort
84
集める
MapReduce : Reduce
85
ノードことに
処理する
MapReduceの様子
もう少しうまくやる
86
MapReduce
87
MapReduce : Combine
88
処理と分割
(ハッシュの剰余
などを使う)
MapReduce : Shuffle & Sort
89
剰余が同じデータを
同じノードに集める
MapReduce : Reduce
90
処理する
Apache Spark チュートリアル
並行処理について
92
並行処理について 93
(Python)
a = sc.parallelize(xrange(6), 2)
b = sc.parallelize(xrange(6), 1)
from operator import sub
a.reduce(sub)
3
b.reduce(sub)
-15
b
partiion 0
a
partiion 1
partiion 0
RDD
94
0 1 2 3 4 5
0 1 2
3 4 5
a
partition 1
partition 0
a.reduce(sub)
95
0 1 2
3 4 5
((0 - 1) - 2) =reduce
((3 - 4) - 5) =reduce
-3
-6
reduce
3
b
partition 0
b.reduce(sub)
 順番で結果が変わるようなreduceを
並行・並列で実行してはいけない
96
0 1 2 3 4 5
(((((0 - 1) - 2) - 3) - 4) - 5) =
reduce
-15

Mais conteúdo relacionado

Mais procurados

え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Cloudera Japan
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話Kentaro Yoshida
 
AWS初心者向けWebinar AWSでのNoSQLの活用
AWS初心者向けWebinar AWSでのNoSQLの活用AWS初心者向けWebinar AWSでのNoSQLの活用
AWS初心者向けWebinar AWSでのNoSQLの活用Amazon Web Services Japan
 
Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Ken SASAKI
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Yuki Morishita
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)NTT DATA Technology & Innovation
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
Hadoop -ResourceManager HAの仕組み-
Hadoop -ResourceManager HAの仕組み-Hadoop -ResourceManager HAの仕組み-
Hadoop -ResourceManager HAの仕組み-Yuki Gonda
 
20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術Preferred Networks
 
Presto on YARNの導入・運用
Presto on YARNの導入・運用Presto on YARNの導入・運用
Presto on YARNの導入・運用cyberagent
 
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)NTT DATA Technology & Innovation
 
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法Tetsutaro Watanabe
 
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話Yahoo!デベロッパーネットワーク
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較Yoshiyasu SAEKI
 
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajpストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajpYahoo!デベロッパーネットワーク
 

Mais procurados (20)

Spark SQL - The internal -
Spark SQL - The internal -Spark SQL - The internal -
Spark SQL - The internal -
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
AWS初心者向けWebinar AWSでのNoSQLの活用
AWS初心者向けWebinar AWSでのNoSQLの活用AWS初心者向けWebinar AWSでのNoSQLの活用
AWS初心者向けWebinar AWSでのNoSQLの活用
 
Hadoopの概念と基本的知識
Hadoopの概念と基本的知識Hadoopの概念と基本的知識
Hadoopの概念と基本的知識
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
Hadoop -ResourceManager HAの仕組み-
Hadoop -ResourceManager HAの仕組み-Hadoop -ResourceManager HAの仕組み-
Hadoop -ResourceManager HAの仕組み-
 
20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術20180729 Preferred Networksの機械学習クラスタを支える技術
20180729 Preferred Networksの機械学習クラスタを支える技術
 
Presto on YARNの導入・運用
Presto on YARNの導入・運用Presto on YARNの導入・運用
Presto on YARNの導入・運用
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
 
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
リクルートテクノロジーズ における EMR の活用とコスト圧縮方法
 
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話
1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
 
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajpストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
ストリーム処理プラットフォームにおけるKafka導入事例 #kafkajp
 

Semelhante a Apache Spark チュートリアル

2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料Recruit Technologies
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEtsuji Nakai
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門Shintaro Fukushima
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類Tetsuya Hasegawa
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Shintaro Fukushima
 
今さら聞けないHadoop セントラルソフト株式会社(20120119)
今さら聞けないHadoop セントラルソフト株式会社(20120119)今さら聞けないHadoop セントラルソフト株式会社(20120119)
今さら聞けないHadoop セントラルソフト株式会社(20120119)Toru Takizawa
 
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみたGMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみたTetsuo Yamabe
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作るgoccy
 
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)YoheiOkuyama
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門Daiyu Hatakeyama
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 

Semelhante a Apache Spark チュートリアル (20)

2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料2014 11-20 Machine Learning with Apache Spark 勉強会資料
2014 11-20 Machine Learning with Apache Spark 勉強会資料
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
今さら聞けないHadoop セントラルソフト株式会社(20120119)
今さら聞けないHadoop セントラルソフト株式会社(20120119)今さら聞けないHadoop セントラルソフト株式会社(20120119)
今さら聞けないHadoop セントラルソフト株式会社(20120119)
 
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみたGMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
GMO プライベート DMP で ビッグデータ解析をするために アプリクラウドで Apache Spark の検証をしてみた
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作る
 
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
Survey of Apache Spark
Survey of Apache SparkSurvey of Apache Spark
Survey of Apache Spark
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 

Mais de K Yamaguchi

浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし 浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし K Yamaguchi
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし 裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし K Yamaguchi
 
20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 springK Yamaguchi
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなしK Yamaguchi
 
Python と型アノテーション
Python と型アノテーションPython と型アノテーション
Python と型アノテーションK Yamaguchi
 
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LTK Yamaguchi
 

Mais de K Yamaguchi (7)

浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし 浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし 裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし
 
20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring
 
20081101 1000sp
20081101 1000sp20081101 1000sp
20081101 1000sp
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし
 
Python と型アノテーション
Python と型アノテーションPython と型アノテーション
Python と型アノテーション
 
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
 

Apache Spark チュートリアル

Notas do Editor

  1. ちょっとどこかを変えたらどこかが変わる、みたいな習熟が難しい
  2. 3億7千万行 pmi計算 30分 24並列 12分 77並列
  3. 昔はhadoopコマンドで全部できた。今は分離している。
  4. hadoop fs が deprecated にされた?