fairy 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. data/LICENSE +674 -0
  2. data/Makefile +116 -0
  3. data/README +15 -0
  4. data/bin/fairy +582 -0
  5. data/bin/fairy-cat +74 -0
  6. data/bin/fairy-cp +128 -0
  7. data/bin/fairy-rm +122 -0
  8. data/bin/subcmd/controller +41 -0
  9. data/bin/subcmd/inspector +81 -0
  10. data/bin/subcmd/master +43 -0
  11. data/bin/subcmd/node +47 -0
  12. data/bin/subcmd/processor +54 -0
  13. data/doc/programming-interface.html +240 -0
  14. data/doc/programming-interface.rd +300 -0
  15. data/etc/fairy.conf.tmpl +118 -0
  16. data/ext/simple_hash/extconf.rb +4 -0
  17. data/ext/simple_hash/simple_hash.c +42 -0
  18. data/fairy.gemspec +60 -0
  19. data/lib/fairy/client/addins.rb +20 -0
  20. data/lib/fairy/client/barrier.rb +29 -0
  21. data/lib/fairy/client/basic-group-by.rb +52 -0
  22. data/lib/fairy/client/cat.rb +41 -0
  23. data/lib/fairy/client/direct-product.rb +51 -0
  24. data/lib/fairy/client/equijoin.rb +79 -0
  25. data/lib/fairy/client/exec.rb +54 -0
  26. data/lib/fairy/client/filter.rb +62 -0
  27. data/lib/fairy/client/find.rb +35 -0
  28. data/lib/fairy/client/group-by.rb +194 -0
  29. data/lib/fairy/client/here.rb +84 -0
  30. data/lib/fairy/client/inject.rb +70 -0
  31. data/lib/fairy/client/input-file.rb +53 -0
  32. data/lib/fairy/client/input-iota.rb +49 -0
  33. data/lib/fairy/client/input-local-file.rb +188 -0
  34. data/lib/fairy/client/input-varray.rb +30 -0
  35. data/lib/fairy/client/input.rb +42 -0
  36. data/lib/fairy/client/io-filter.rb +26 -0
  37. data/lib/fairy/client/junction.rb +31 -0
  38. data/lib/fairy/client/map.rb +34 -0
  39. data/lib/fairy/client/merge-group-by.rb +71 -0
  40. data/lib/fairy/client/output-file.rb +64 -0
  41. data/lib/fairy/client/output-local-file.rb +60 -0
  42. data/lib/fairy/client/output-null.rb +47 -0
  43. data/lib/fairy/client/output-varray.rb +50 -0
  44. data/lib/fairy/client/output.rb +29 -0
  45. data/lib/fairy/client/roma-put.rb +62 -0
  46. data/lib/fairy/client/roma.rb +156 -0
  47. data/lib/fairy/client/seg-join.rb +61 -0
  48. data/lib/fairy/client/seg-map.rb +78 -0
  49. data/lib/fairy/client/seg-shuffle.rb +35 -0
  50. data/lib/fairy/client/seg-split.rb +27 -0
  51. data/lib/fairy/client/seg-zip.rb +60 -0
  52. data/lib/fairy/client/select.rb +38 -0
  53. data/lib/fairy/client/sort.rb +48 -0
  54. data/lib/fairy/client/sort18.rb +56 -0
  55. data/lib/fairy/client/sort19.rb +61 -0
  56. data/lib/fairy/client/there.rb +47 -0
  57. data/lib/fairy/client/top_n_into_roma.rb +34 -0
  58. data/lib/fairy/client/wc.rb +92 -0
  59. data/lib/fairy/controller.rb +1103 -0
  60. data/lib/fairy/logger.rb +107 -0
  61. data/lib/fairy/master/addins.rb +20 -0
  62. data/lib/fairy/master/atom.rb +17 -0
  63. data/lib/fairy/master/c-barrier.rb +283 -0
  64. data/lib/fairy/master/c-basic-group-by.rb +250 -0
  65. data/lib/fairy/master/c-cat.rb +159 -0
  66. data/lib/fairy/master/c-direct-product.rb +203 -0
  67. data/lib/fairy/master/c-exec.rb +68 -0
  68. data/lib/fairy/master/c-filter.rb +422 -0
  69. data/lib/fairy/master/c-find.rb +138 -0
  70. data/lib/fairy/master/c-group-by.rb +64 -0
  71. data/lib/fairy/master/c-here.rb +80 -0
  72. data/lib/fairy/master/c-inject.rb +119 -0
  73. data/lib/fairy/master/c-input-file.rb +46 -0
  74. data/lib/fairy/master/c-input-iota.rb +66 -0
  75. data/lib/fairy/master/c-input-local-file.rb +117 -0
  76. data/lib/fairy/master/c-input-varray.rb +53 -0
  77. data/lib/fairy/master/c-input.rb +24 -0
  78. data/lib/fairy/master/c-inputtable.rb +31 -0
  79. data/lib/fairy/master/c-inputtable18.rb +36 -0
  80. data/lib/fairy/master/c-inputtable19.rb +35 -0
  81. data/lib/fairy/master/c-io-filter.rb +28 -0
  82. data/lib/fairy/master/c-junction.rb +54 -0
  83. data/lib/fairy/master/c-map.rb +27 -0
  84. data/lib/fairy/master/c-merge-group-by.rb +241 -0
  85. data/lib/fairy/master/c-output-file.rb +84 -0
  86. data/lib/fairy/master/c-output-local-file.rb +19 -0
  87. data/lib/fairy/master/c-output-null.rb +45 -0
  88. data/lib/fairy/master/c-output-varray.rb +57 -0
  89. data/lib/fairy/master/c-output.rb +20 -0
  90. data/lib/fairy/master/c-seg-join.rb +141 -0
  91. data/lib/fairy/master/c-seg-map.rb +26 -0
  92. data/lib/fairy/master/c-seg-shuffle.rb +87 -0
  93. data/lib/fairy/master/c-seg-split.rb +110 -0
  94. data/lib/fairy/master/c-seg-zip.rb +132 -0
  95. data/lib/fairy/master/c-select.rb +27 -0
  96. data/lib/fairy/master/c-sort.rb +108 -0
  97. data/lib/fairy/master/c-there.rb +57 -0
  98. data/lib/fairy/master/c-wc.rb +232 -0
  99. data/lib/fairy/master/job-interpriter.rb +19 -0
  100. data/lib/fairy/master/scheduler.rb +24 -0
  101. data/lib/fairy/master.rb +329 -0
  102. data/lib/fairy/node/addins.rb +19 -0
  103. data/lib/fairy/node/p-barrier.rb +95 -0
  104. data/lib/fairy/node/p-basic-group-by.rb +252 -0
  105. data/lib/fairy/node/p-direct-product.rb +153 -0
  106. data/lib/fairy/node/p-exec.rb +30 -0
  107. data/lib/fairy/node/p-filter.rb +363 -0
  108. data/lib/fairy/node/p-find.rb +111 -0
  109. data/lib/fairy/node/p-group-by.rb +1534 -0
  110. data/lib/fairy/node/p-here.rb +21 -0
  111. data/lib/fairy/node/p-identity.rb +24 -0
  112. data/lib/fairy/node/p-inject.rb +127 -0
  113. data/lib/fairy/node/p-input-file.rb +108 -0
  114. data/lib/fairy/node/p-input-iota.rb +39 -0
  115. data/lib/fairy/node/p-input-local-file.rb +61 -0
  116. data/lib/fairy/node/p-input-varray.rb +26 -0
  117. data/lib/fairy/node/p-io-filter.rb +28 -0
  118. data/lib/fairy/node/p-map.rb +40 -0
  119. data/lib/fairy/node/p-merger-group-by.rb +48 -0
  120. data/lib/fairy/node/p-output-file.rb +104 -0
  121. data/lib/fairy/node/p-output-local-file.rb +14 -0
  122. data/lib/fairy/node/p-output-null.rb +32 -0
  123. data/lib/fairy/node/p-output-varray.rb +41 -0
  124. data/lib/fairy/node/p-seg-join.rb +82 -0
  125. data/lib/fairy/node/p-seg-map.rb +34 -0
  126. data/lib/fairy/node/p-seg-split.rb +61 -0
  127. data/lib/fairy/node/p-seg-zip.rb +79 -0
  128. data/lib/fairy/node/p-select.rb +40 -0
  129. data/lib/fairy/node/p-single-exportable.rb +90 -0
  130. data/lib/fairy/node/p-sort.rb +195 -0
  131. data/lib/fairy/node/p-task.rb +113 -0
  132. data/lib/fairy/node/p-there.rb +44 -0
  133. data/lib/fairy/node/p-wc.rb +266 -0
  134. data/lib/fairy/node.rb +187 -0
  135. data/lib/fairy/processor.rb +510 -0
  136. data/lib/fairy/share/base-app.rb +114 -0
  137. data/lib/fairy/share/block-source.rb +234 -0
  138. data/lib/fairy/share/conf.rb +396 -0
  139. data/lib/fairy/share/debug.rb +21 -0
  140. data/lib/fairy/share/encoding.rb +17 -0
  141. data/lib/fairy/share/fast-tempfile.rb +93 -0
  142. data/lib/fairy/share/file-place.rb +176 -0
  143. data/lib/fairy/share/hash-1.rb +20 -0
  144. data/lib/fairy/share/hash-md5.rb +28 -0
  145. data/lib/fairy/share/hash-murmur.rb +69 -0
  146. data/lib/fairy/share/hash-rb18.rb +20 -0
  147. data/lib/fairy/share/hash-simple-hash.rb +28 -0
  148. data/lib/fairy/share/inspector.rb +16 -0
  149. data/lib/fairy/share/lc/exceptions.rb +82 -0
  150. data/lib/fairy/share/lc/ja/exceptions.rb +81 -0
  151. data/lib/fairy/share/locale.rb +17 -0
  152. data/lib/fairy/share/log.rb +215 -0
  153. data/lib/fairy/share/pool-dictionary.rb +53 -0
  154. data/lib/fairy/share/port-marshaled-queue.rb +347 -0
  155. data/lib/fairy/share/port.rb +1697 -0
  156. data/lib/fairy/share/reference.rb +45 -0
  157. data/lib/fairy/share/stdout.rb +56 -0
  158. data/lib/fairy/share/tr.rb +16 -0
  159. data/lib/fairy/share/varray.rb +147 -0
  160. data/lib/fairy/share/vfile.rb +183 -0
  161. data/lib/fairy/version.rb +8 -0
  162. data/lib/fairy.rb +206 -0
  163. data/sample/grep.rb +46 -0
  164. data/sample/ping.rb +19 -0
  165. data/sample/sort.rb +102 -0
  166. data/sample/wordcount.rb +61 -0
  167. data/spec/README +12 -0
  168. data/spec/fairy1_spec.rb +31 -0
  169. data/spec/fairy2_spec.rb +42 -0
  170. data/spec/fairy3_spec.rb +126 -0
  171. data/spec/fairy4_spec.rb +63 -0
  172. data/spec/fairy5_spec.rb +45 -0
  173. data/spec/fairy6_spec.rb +52 -0
  174. data/spec/fairy7_spec.rb +58 -0
  175. data/spec/fairy8_spec.rb +48 -0
  176. data/spec/mkdat.rb +148 -0
  177. data/spec/run_all.sh +65 -0
  178. data/test/testc.rb +7111 -0
  179. data/tools/cap_recipe/Capfile +144 -0
  180. data/tools/cap_recipe/cluster.yml.sample +14 -0
  181. data/tools/fairy_perf_graph.rb +444 -0
  182. data/tools/git-tag +44 -0
  183. data/tools/log-analysis.rb +62 -0
  184. data/tools/svn-ls-diff +38 -0
  185. data/tools/svn-tags +37 -0
  186. metadata +298 -0
data/bin/subcmd/master ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ #
4
+ # Copyright (C) 2007-2010 Rakuten, Inc.
5
+ #
6
+
7
+ require "optparse"
8
+
9
+ require "deep-connect"
10
+
11
+ require "fairy/share/base-app"
12
+ require "fairy/share/conf"
13
+ require "fairy/share/locale"
14
+ require "fairy/share/encoding"
15
+ require "fairy/master"
16
+
17
+ $0 = "fairy master #{ARGV.join(' ')}"
18
+
19
+ module Fairy
20
+ class MasterAPP<BaseAPP
21
+ def initialize
22
+ super
23
+ @master_port = Fairy::CONF.MASTER_PORT
24
+ end
25
+
26
+ # def parse_arg
27
+ # super
28
+ # end
29
+
30
+ def option_parser
31
+ super do |opt|
32
+ opt.on("-p", "--master_port=VAL"){|val| @master_port = val}
33
+ end
34
+ end
35
+
36
+ def start
37
+ Fairy::Master.start(@master_port)
38
+ end
39
+ end
40
+ end
41
+
42
+ Fairy::MasterAPP.start
43
+ sleep
data/bin/subcmd/node ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ #
4
+ # Copyright (C) 2007-2010 Rakuten, Inc.
5
+ #
6
+
7
+ require "optparse"
8
+
9
+ require "deep-connect"
10
+
11
+ require "fairy/share/base-app"
12
+ require "fairy/share/conf"
13
+ require "fairy/share/locale"
14
+ require "fairy/share/encoding"
15
+ require "fairy/node"
16
+
17
+ $0 = "fairy node #{ARGV.join(' ')}"
18
+
19
+ module Fairy
20
+ class NodeAPP<BaseAPP
21
+ def initialize
22
+ super
23
+ @master_host = Fairy::CONF.MASTER_HOST
24
+ @master_port = Fairy::CONF.MASTER_PORT
25
+ end
26
+
27
+ # def parse_arg
28
+ # super
29
+ # end
30
+
31
+
32
+ def option_parser
33
+ super do |opt|
34
+ opt.on("-m VAL"){|val| @master_host = val}
35
+ opt.on("-h", "--master_host=VAL"){|val| @master_host = val}
36
+ opt.on("-p", "--master_port=VAL"){|val| @master_port = val}
37
+ end
38
+ end
39
+
40
+ def start
41
+ Fairy::Node.start(@master_host, @master_port)
42
+ end
43
+ end
44
+ end
45
+
46
+ Fairy::NodeAPP.start
47
+ sleep
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require "optparse"
5
+
6
+ require "deep-connect"
7
+
8
+ require "fairy/share/base-app"
9
+ require "fairy/share/conf"
10
+ require "fairy/share/locale"
11
+ require "fairy/share/encoding"
12
+ require "fairy/processor"
13
+
14
+ $0 = "fairy processor #{ARGV.join(' ')}"
15
+
16
+ module Fairy
17
+ class ProcessorAPP<BaseAPP
18
+ def initialize
19
+ super
20
+ @node_port = nil
21
+ @id = nil
22
+ @debug_trace = Fairy::CONF.DEBUG_PROCESSOR_TRACE_ON
23
+ end
24
+
25
+ def option_parser
26
+ super do |opt|
27
+ opt.on("--node=VAL"){|val| @node_port = val}
28
+ opt.on("--id=VAL"){|val| @id = val.to_i}
29
+ opt.on("--debug_trace[=VAL]") do |val|
30
+ val = true unless val
31
+ if ["FALSE", "OFF"].include?(val.upcase)
32
+ val = false
33
+ else
34
+ val = true
35
+ end
36
+ @debug_trace = val
37
+ end
38
+ end
39
+ end
40
+
41
+ def start
42
+ Fairy::Processor.start(@id, @node_port)
43
+ if @debug_trace
44
+ Log::info(self, "DEBUG TRACE ON")
45
+ require "share/tr"
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ Fairy::ProcessorAPP.start
52
+
53
+ sleep
54
+
@@ -0,0 +1,240 @@
1
+ <?xml version="1.0" ?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml">
6
+ <head>
7
+ <title>fairy programing interface</title>
8
+ </head>
9
+ <body>
10
+ <p>fairy programming interface</p>
11
+ <p>楽天株式会社 楽天技術研究所 </p>
12
+ <h2><a name="label-0" id="label-0">["プログラミングインターフェース"]</a></h2><!-- RDLabel: "プログラミングインターフェース" -->
13
+ <h3><a name="label-1" id="label-1">["フィルタ系メソッド"]</a></h3><!-- RDLabel: "フィルタ系メソッド" -->
14
+ <dl>
15
+ <dt><a name="label-2" id="label-2"><code>Filter#map(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#map" -->
16
+ <dd>
17
+ <p><var>block_source</var>: ブロックソースコード.</p>
18
+ <p>Rubyの Enumerable#map, Enumerable#collect 相当.
19
+ ブロックに対し、要素を入力とし、評価した結果を返す</p></dd>
20
+ <dt><a name="label-3" id="label-3"><code>Filter#collect</code></a></dt><!-- RDLabel: "Filter#collect" -->
21
+ <dd>
22
+ Filter#map の alias.</dd>
23
+ <dt><a name="label-4" id="label-4"><code>Filter#select(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#select" -->
24
+ <dd>
25
+ <p><var>block_source</var>ブロックソースコード. </p>
26
+ <p>Rubyの Enumerable#select 相当.
27
+ ブロックに対し、要素を入力とし、評価した結果が真の時、その要素を返す</p></dd>
28
+ <dt><a name="label-5" id="label-5"><code>Filter#grep(<var>regexp</var>)</code></a></dt><!-- RDLabel: "Filter#grep" -->
29
+ <dd>
30
+ <p><var>regexp</var> 正規表現.</p>
31
+ <p>Rubyの Enumerable#grep 相当.
32
+ 入力要素が<var>regexp</var>でマッチしたら、その要素を返す.</p></dd>
33
+ <dt><a name="label-6" id="label-6"><code>Filter#map_flatten(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#map_flatten" -->
34
+ <dd>
35
+ <p><var>block_source</var>ブロックソースコード</p>
36
+ <p>Rubyの Enumerable#map_flatten 相当.</p>
37
+ <p>mapの結果をflattenして返す.</p></dd>
38
+ <dt><a name="label-7" id="label-7"><code>Filter#mapf</code></a></dt><!-- RDLabel: "Filter#mapf" -->
39
+ <dd>
40
+ <p>Filter#map_flattenのalias</p>
41
+ <p>例:</p>
42
+ <p>filter.mapf(%{|line| line.split(/\s+/)}...</p></dd>
43
+ <dt><a name="label-8" id="label-8"><code>Filter#inject(<var>block_source</var>, :<var>init_value</var>=&gt;...)</code></a></dt><!-- RDLabel: "Filter#inject" -->
44
+ <dd>
45
+ 結合法則の保証はユーザにまかされる.
46
+ init_value は 各inject で適用される(単位元になっている必要がある).</dd>
47
+ <dt><a name="label-9" id="label-9"><code>InjectFilter#value</code></a></dt><!-- RDLabel: "InjectFilter#value" -->
48
+ <dd>
49
+ 値の取り出し.</dd>
50
+ <dt><a name="label-10" id="label-10"><code>Filter#cat(<var>filter_1</var>, <var>filter_2</var>,…)</code></a></dt><!-- RDLabel: "Filter#cat" -->
51
+ <dd>
52
+ 複数のストリームの結合したストリームを返す.</dd>
53
+ <dt><a name="label-11" id="label-11"><code>Filter#equijoin(<var>other_filter</var>, <var>main_column_no</var>, [<var>other_column_no</var>])</code></a></dt><!-- RDLabel: "Filter#equijoin" -->
54
+ <dd>
55
+ <p>関係演算のjoin.</p>
56
+ <p><var>filter</var>の<var>main_column_no</var>番目のカラムと、<var>other_filter
57
+ のother_column_no</var>番目の等結合を返す.</p></dd>
58
+ <dt><a name="label-12" id="label-12"><code>Filter#direct_product(<var>filter_1</var>, <var>filter_2</var>,…, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#direct_product" -->
59
+ <dd>
60
+ <p><var>block_source</var>ブロックソースコード. ブロックソースへのブロック
61
+ 引数は<code>|e0, e1, …|</code>.</p>
62
+ <p>Rubyの Array#product 相当. </p></dd>
63
+ <dt><a name="label-13" id="label-13"><code>Filter#barrier(:<var>mode</var> =&gt; <var>mode</var>, :<var>cond</var> =&gt; <var>condition_block</var>, :<var>buffer</var> =&gt; <var>opt</var>)</code></a></dt><!-- RDLabel: "Filter#barrier" -->
64
+ <dd>
65
+ <p>ストリームを同期させるフィルタ. </p>
66
+ <p><var>mode</var></p>
67
+ <p><var>BARRIER_NODE_CREATION</var>条件が成立するまでノード作成させない.</p>
68
+ <p><var>BARRIER_STREAM</var>データを流さない.</p>
69
+ <p><var>cond</var></p>
70
+ <p>ブロックソース. ブロックを評価し, その条件が成立するまでブロック</p>
71
+ <p><var>NODE_CREATION</var> 前段のノードがすべてそろうまでブロック</p>
72
+ <p><var>DATA_ARRIVED</var> 全サブストリームからデータが来はじめるまでブロック</p>
73
+ <p><var>ALL_DATA</var> 全データが出力されるまでブロック</p>
74
+ <p><var>buffer</var></p>
75
+ <p><var>MEMORY</var>メモリにためる</p>
76
+ <p><var>FILE</var> 一時ファイルにためる</p></dd>
77
+ <dt><a name="label-14" id="label-14"><code>Filter#product</code></a></dt><!-- RDLabel: "Filter#product" -->
78
+ <dd>
79
+ direct_productのalias</dd>
80
+ <dt><a name="label-15" id="label-15"><code>Filter#*(<var>other_filter</var>)</code></a></dt><!-- RDLabel: "Filter#*" -->
81
+ <dd>
82
+ Filter#direct_product(other_filer)と同じ</dd>
83
+ <dt><a name="label-16" id="label-16"><code>Filter.group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter.group_by" -->
84
+ <dd>
85
+ <p>入力された要素を<var>block_source</var>で評価し、それによりグルーピングし、後
86
+ 段へは、グループされた要素のストリームを渡す。
87
+ Rubyのgroup_byと似ている.</p>
88
+ <p>例: ワードカウント</p>
89
+ <pre>finput = fairy.input(input.vf)
90
+ fmap = finput.mapf(%{|l| l.chomp.split})
91
+ fshuffle = fmap.group_by(%{|w| w})
92
+ freduce = fshuffle.map(%q{|values| "#{values.key}\t#{values.size}"})
93
+ for w in freduce.here
94
+ puts w
95
+ end</pre></dd>
96
+ <dt><a name="label-17" id="label-17"><code>Filter#basic_group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#basic_group_by" -->
97
+ <dd>
98
+ group_by一族で, 一番基本的なもの.
99
+ グループがそのままセグメントになる.</dd>
100
+ <dt><a name="label-18" id="label-18"><code>Filter.basic_mgroup_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter.basic_mgroup_by" -->
101
+ <dd>
102
+ <var>basic_group_by</var>の複数キー版
103
+ 複数のキー毎にグルーピングされる.
104
+ グループがそのままセグメント単位になる.</dd>
105
+ <dt><a name="label-19" id="label-19"><code>Filter#merge_group_by(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#merge_group_by" -->
106
+ <dd>
107
+ <var>basic_group_by</var>とは違い、後段には、上流のセグメント単位にグルー
108
+ ピングしたストリームを要素として渡す.</dd>
109
+ <dt><a name="label-20" id="label-20"><code>Filter#seg_zip(filter_1, ..., <var>filter_n</var>, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_zip(filter_1, ..., filter_n, block_source)" -->
110
+ <dd>
111
+ 複数のストリームのセグメント毎に要素を順番に付き合わせる.</dd>
112
+ <dt><a name="label-21" id="label-21"><code>Filter#seg_join(<var>filter_1</var>,…, <var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_join" -->
113
+ <dd>
114
+ <p><var>block_source</var>ブロックソースコード.</p>
115
+ <p><var>block_source</var>へのブロック引数は |in0, in1, … in_n, out|
116
+ セグメント単位にjoin処理を行う.</p>
117
+ <p>オプション引数 :by -&gt; :key を指定すると
118
+ keyごとの突合せになる.</p></dd>
119
+ <dt><a name="label-22" id="label-22"><code>Filter#seg_shuffle(<var>block_source</var>)</code></a></dt><!-- RDLabel: "Filter#seg_shuffle" -->
120
+ <dd>
121
+ <p><var>block_source</var> ブロックソース. ブロックソースへのブロック引数
122
+ は、入力セグメント列、出力セグメント列 <code>|in_segment_stream、
123
+ out_segment_stream|</code>
124
+ セグメント列をblock_source順に並べ替える</p>
125
+ <p><var>cond</var></p>
126
+ <pre>+ ブロックソース. ブロックを評価し, その条件が成立するまでブロック
127
+ ((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
128
+ ((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
129
+ ((|ALL_DATA|)) 全データが出力されるまでブロック</pre>
130
+ <p><var>buffer</var></p>
131
+ <pre>((|MEMORY|))メモリにためる
132
+ ((|FILE|)) 一時ファイルにためる</pre></dd>
133
+ </dl>
134
+ <h3><a name="label-23" id="label-23">["入力系メソッド"]</a></h3><!-- RDLabel: "入力系メソッド" -->
135
+ <dl>
136
+ <dt><a name="label-24" id="label-24"><code>Fairy#input(<var>desc</var>)</code></a></dt><!-- RDLabel: "Fairy#input" -->
137
+ <dd>
138
+ <var>desc</var> ローカルファイルや仮想ファイルの入力を指定する.</dd>
139
+ </dl>
140
+ <h3><a name="label-25" id="label-25">["定義系メソッド"]</a></h3><!-- RDLabel: "定義系メソッド" -->
141
+ <dl>
142
+ <dt><a name="label-26" id="label-26"><code>Fairy::def_filter(<var>name</var>, [:<var>sub</var>=&gt;<var>true</var>]){|<var>input</var>, <var>optionparam</var>…| …}</code></a></dt><!-- RDLabel: "Fairy::def_filter" -->
143
+ <dd>
144
+ ユーザレベルでフィルタを定義する
145
+ <var>sub</var>が真だとサブルーチン化する</dd>
146
+ </dl>
147
+ <h3><a name="label-27" id="label-27">["フィルタ制御"]</a></h3><!-- RDLabel: "フィルタ制御" -->
148
+ <dl>
149
+ <dt><a name="label-28" id="label-28"><code>Filter#sub(%{|<var>input</var>, <var>subfairy</var>| <var>input</var>.<var>filer</var>...})</code></a></dt><!-- RDLabel: "Filter#sub" -->
150
+ <dd>
151
+ ある程度まとまった処理があったとして、その処理が終わったら後片付け
152
+ したいとき用いる.
153
+ 新しい、fairyとcontrollerを立て、親とは別に処理を行う.</dd>
154
+ <dt><a name="label-29" id="label-29"><code>BEGIN/END</code></a></dt><!-- RDLabel: "BEGIN/END" -->
155
+ <dd>
156
+ <p>filter.filter(..., :BEGIN=&gt;begin_block_source, :END=&gt;end_block_source)</p>
157
+ <p><var>begin_block_source</var>各フィルターで最初に実行</p>
158
+ <p><var>end_block_source</var> 最後に実行</p></dd>
159
+ <dt><a name="label-30" id="label-30"><code>break</code></a></dt><!-- RDLabel: "break" -->
160
+ <dd>
161
+ フィルタリング処理をbreakする</dd>
162
+ <dt><a name="label-31" id="label-31"><code>fairy#def_pool_variable(<var>var</var>, <var>value</var>)</code></a></dt><!-- RDLabel: "fairy#def_pool_variable" -->
163
+ <dd>
164
+ <p>fairy#def_pool_variable(var, :block =&gt; %{...})</p>
165
+ <p><var>var</var>プール変数名.</p>
166
+ <p>各フィルタで共有できるプール変数を定義する.
167
+ ブロックソースが渡された場合は, コントローラ側でブロックを評価し,
168
+ その値を代入する.
169
+ <var>value</var>はディープコピーされる.</p></dd>
170
+ <dt><a name="label-32" id="label-32"><code>fairy#pool_variable[:var] = <var>value</var></code></a></dt><!-- RDLabel: "fairy#pool_variable[:var] = value" -->
171
+ <dd>
172
+ <p>プール変数に代入する.</p>
173
+ <p>ブロックソース内からアクセスする方法:</p>
174
+ <pre>...map(#{|e| @Pool.var = ...})</pre></dd>
175
+ <dt><a name="label-33" id="label-33"><code>job インスタンス変数</code></a></dt><!-- RDLabel: "job インスタンス変数" -->
176
+ <dd>
177
+ <p>...map(#{|e| @var ...})</p>
178
+ <p>複数イテレーションで共有できる変数. ただし, 各セグメント内ローカルになる.</p></dd>
179
+ <dt><a name="label-34" id="label-34"><code>VArray</code></a></dt><!-- RDLabel: "VArray" -->
180
+ <dd>
181
+ <p>仮想配列.</p>
182
+ <p>各ストリームの計算結果を仮想的な配列に保存する.
183
+ イテレーションするときに再利用できる.
184
+ 複数の下位ストリームにデータを流すことが可能.</p>
185
+ <p>利用はinput/outoutで指定する. </p>
186
+ <p>配列としてのアクセスも用意されているが、 fairy的な動きはしない.</p>
187
+ <p>Fairy.input(varray)</p>
188
+ <pre>varrayを入力として指定する.</pre>
189
+ <p>filter.output(VArray)</p>
190
+ <pre>VArray に 出力する.</pre>
191
+ <p>job.to_va</p>
192
+ <pre>VArrayに出力し、それを返す.</pre>
193
+ <p>例:</p>
194
+ <pre>va = fairy.input(Fairy::Iota, 1000).to_va
195
+ 10.times do {|i| va = fairy.input(va).map(%{|i| i*2}).to_va} </pre></dd>
196
+ </dl>
197
+ <h3><a name="label-35" id="label-35">["例外"]</a></h3><!-- RDLabel: "例外" -->
198
+ <pre>ブロック実行中に発生した例外を通知する</pre>
199
+ <h3><a name="label-36" id="label-36">["STDOUT"]</a></h3><!-- RDLabel: "STDOUT" -->
200
+ <pre>ブロック内で puts 等を実行すると、クライアント側に出力される。
201
+
202
+ putsは$stdoutを参照し、かつ、グローバル変数なので、スレッドセーフ
203
+ にするために、ちょっといやらしいことをした。</pre>
204
+ <h3><a name="label-37" id="label-37">["ログAPI"]</a></h3><!-- RDLabel: "ログAPI" -->
205
+ <dl>
206
+ <dt><a name="label-38" id="label-38"><code>Fairy::log(<var>sender</var>, <var>printf</var>メッセージ, <var>param</var>...)</code></a></dt><!-- RDLabel: "Fairy::log" -->
207
+ <dd>
208
+ Fairy::log(printfメッセージ, param...)
209
+ Fairy::log(sender) {|sio| ...}</dd>
210
+ <dt><a name="label-39" id="label-39"><code>Fairy::fatal, <var>error</var>, <var>nortify</var>, <var>info</var>, <var>debug</var>(.<var>log</var>と同じパラメータ)</code></a></dt><!-- RDLabel: "Fairy::fatal, error, nortify, info, debug" -->
211
+ <dd>
212
+ 普段はこちらを使う。出力レベルに応じて出力する</dd>
213
+ <dt><a name="label-40" id="label-40"><code>Fairy::log_exception(<var>sender</var>, <var>exp</var>), <var>Fairy</var>::<var>log_exception</var>(<var>exp</var>)</code></a></dt><!-- RDLabel: "Fairy::log_exception" -->
214
+ <dd>
215
+ <p>例外のバックトレースをログに書き出す</p>
216
+ <p>例:</p>
217
+ <p>Log::warn(self) do |sio|</p>
218
+ <pre>sio.puts "Warn: Exception raised:"
219
+ sio.puts $!
220
+ for l in $@
221
+ sio.puts "\t#{l}"
222
+ end</pre>
223
+ <p>end</p></dd>
224
+ <dt><a name="label-41" id="label-41"><code>fairy.conf</code></a></dt><!-- RDLabel: "fairy.conf" -->
225
+ <dd>
226
+ <p>fairyの環境設定を行うファイル.</p>
227
+ <p>検索パス(存在したら上書き).</p>
228
+ <p>/etc/fairy.conf , $FAIRY_CONF, $HOME/.fiaryrc, ./etc/fairy.conf</p>
229
+ <p>グローバルな設定</p>
230
+ <pre>CONF.MASTER_HOST
231
+ CONF.MASTER_PORT
232
+ CONF.HOME
233
+ CONF.VF_ROOT</pre>
234
+ <p>ホスト固有の設定</p>
235
+ <pre>CONF[“hostname”].MASTER_HOST
236
+ VArray に 出力する</pre></dd>
237
+ </dl>
238
+
239
+ </body>
240
+ </html>
@@ -0,0 +1,300 @@
1
+ fairy programming interface
2
+
3
+ 楽天株式会社 楽天技術研究所
4
+
5
+ == プログラミングインターフェース
6
+ === フィルタ系メソッド
7
+
8
+ --- Filter#map(block_source)
9
+ ((|block_source|)): ブロックソースコード.
10
+
11
+ Rubyの Enumerable#map, Enumerable#collect 相当.
12
+ ブロックに対し、要素を入力とし、評価した結果を返す
13
+
14
+ --- Filter#collect
15
+
16
+ Filter#map の alias.
17
+
18
+ --- Filter#select(block_source)
19
+ ((|block_source|))ブロックソースコード.
20
+
21
+ Rubyの Enumerable#select 相当.
22
+ ブロックに対し、要素を入力とし、評価した結果が真の時、その要素を返す
23
+
24
+ --- Filter#grep(regexp)
25
+ ((|regexp|)) 正規表現.
26
+
27
+ Rubyの Enumerable#grep 相当.
28
+ 入力要素が((|regexp|))でマッチしたら、その要素を返す.
29
+
30
+ --- Filter#map_flatten(block_source)
31
+ ((|block_source|))ブロックソースコード
32
+
33
+ Rubyの Enumerable#map_flatten 相当.
34
+
35
+ mapの結果をflattenして返す.
36
+
37
+ --- Filter#mapf
38
+ Filter#map_flattenのalias
39
+
40
+ 例:
41
+
42
+ filter.mapf(%{|line| line.split(/\s+/)}...
43
+
44
+ --- Filter#inject(block_source, :init_value=>...)
45
+
46
+ 結合法則の保証はユーザにまかされる.
47
+ init_value は 各inject で適用される(単位元になっている必要がある).
48
+
49
+ --- InjectFilter#value
50
+
51
+ 値の取り出し.
52
+
53
+ --- Filter#cat(filter_1, filter_2,…)
54
+
55
+ 複数のストリームの結合したストリームを返す.
56
+
57
+
58
+ --- Filter#equijoin(other_filter, main_column_no, [other_column_no])
59
+ 関係演算のjoin.
60
+
61
+ ((|filter|))の((|main_column_no|))番目のカラムと、((|other_filter
62
+ のother_column_no|))番目の等結合を返す.
63
+
64
+ --- Filter#direct_product(filter_1, filter_2,…, block_source)
65
+
66
+ ((|block_source|))ブロックソースコード. ブロックソースへのブロック
67
+ 引数は(({|e0, e1, …|})).
68
+
69
+ Rubyの Array#product 相当.
70
+
71
+ --- Filter#barrier(:mode => mode, :cond => condition_block, :buffer => opt)
72
+
73
+ ストリームを同期させるフィルタ.
74
+
75
+ ((|mode|))
76
+
77
+ ((|BARRIER_NODE_CREATION|))条件が成立するまでノード作成させない.
78
+
79
+ ((|BARRIER_STREAM|))データを流さない.
80
+
81
+ ((|cond|))
82
+
83
+ ブロックソース. ブロックを評価し, その条件が成立するまでブロック
84
+
85
+ ((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
86
+
87
+ ((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
88
+
89
+ ((|ALL_DATA|)) 全データが出力されるまでブロック
90
+
91
+ ((|buffer|))
92
+
93
+ ((|MEMORY|))メモリにためる
94
+
95
+ ((|FILE|)) 一時ファイルにためる
96
+
97
+ --- Filter#product
98
+
99
+ direct_productのalias
100
+
101
+ --- Filter#*(other_filter)
102
+
103
+ Filter#direct_product(other_filer)と同じ
104
+
105
+ --- Filter.group_by(block_source)
106
+
107
+ 入力された要素を((|block_source|))で評価し、それによりグルーピングし、後
108
+ 段へは、グループされた要素のストリームを渡す。
109
+ Rubyのgroup_byと似ている.
110
+
111
+ 例: ワードカウント
112
+
113
+ finput = fairy.input(input.vf)
114
+ fmap = finput.mapf(%{|l| l.chomp.split})
115
+ fshuffle = fmap.group_by(%{|w| w})
116
+ freduce = fshuffle.map(%q{|values| "#{values.key}\t#{values.size}"})
117
+ for w in freduce.here
118
+ puts w
119
+ end
120
+
121
+ --- Filter#basic_group_by(block_source)
122
+
123
+ group_by一族で, 一番基本的なもの.
124
+ グループがそのままセグメントになる.
125
+
126
+ --- Filter.basic_mgroup_by(block_source)
127
+
128
+ ((|basic_group_by|))の複数キー版
129
+ 複数のキー毎にグルーピングされる.
130
+ グループがそのままセグメント単位になる.
131
+
132
+ --- Filter#merge_group_by(block_source)
133
+
134
+ ((|basic_group_by|))とは違い、後段には、上流のセグメント単位にグルー
135
+ ピングしたストリームを要素として渡す.
136
+
137
+ --- Filter#seg_zip(filter_1, ..., filter_n, block_source)
138
+
139
+ 複数のストリームのセグメント毎に要素を順番に付き合わせる.
140
+
141
+ --- Filter#seg_join(filter_1,…, block_source)
142
+ ((|block_source|))ブロックソースコード.
143
+
144
+ ((|block_source|))へのブロック引数は |in0, in1, … in_n, out|
145
+ セグメント単位にjoin処理を行う.
146
+
147
+ オプション引数 :by -> :key を指定すると
148
+ keyごとの突合せになる.
149
+
150
+ --- Filter#seg_shuffle(block_source)
151
+
152
+ ((|block_source|)) ブロックソース. ブロックソースへのブロック引数
153
+ は、入力セグメント列、出力セグメント列 (({|in_segment_stream、
154
+ out_segment_stream|}))
155
+ セグメント列をblock_source順に並べ替える
156
+
157
+ ((|cond|))
158
+ + ブロックソース. ブロックを評価し, その条件が成立するまでブロック
159
+ ((|NODE_CREATION|)) 前段のノードがすべてそろうまでブロック
160
+ ((|DATA_ARRIVED|)) 全サブストリームからデータが来はじめるまでブロック
161
+ ((|ALL_DATA|)) 全データが出力されるまでブロック
162
+ ((|buffer|))
163
+ ((|MEMORY|))メモリにためる
164
+ ((|FILE|)) 一時ファイルにためる
165
+
166
+
167
+ === 入力系メソッド
168
+
169
+ --- Fairy#input(desc)
170
+
171
+ ((|desc|)) ローカルファイルや仮想ファイルの入力を指定する.
172
+
173
+ === 定義系メソッド
174
+
175
+ --- Fairy::def_filter(name, [:sub=>true]){|input, optionparam…| …}
176
+
177
+ ユーザレベルでフィルタを定義する
178
+ ((|sub|))が真だとサブルーチン化する
179
+
180
+ === フィルタ制御
181
+ --- Filter#sub(%{|input, subfairy| input.filer...})
182
+
183
+ ある程度まとまった処理があったとして、その処理が終わったら後片付け
184
+ したいとき用いる.
185
+ 新しい、fairyとcontrollerを立て、親とは別に処理を行う.
186
+
187
+ --- BEGIN/END
188
+
189
+ filter.filter(..., :BEGIN=>begin_block_source, :END=>end_block_source)
190
+
191
+ ((|begin_block_source|))各フィルターで最初に実行
192
+
193
+ ((|end_block_source|)) 最後に実行
194
+
195
+ --- break
196
+ フィルタリング処理をbreakする
197
+
198
+ --- fairy#def_pool_variable(var, value)
199
+ fairy#def_pool_variable(var, :block => %{...})
200
+
201
+ ((|var|))プール変数名.
202
+
203
+ 各フィルタで共有できるプール変数を定義する.
204
+ ブロックソースが渡された場合は, コントローラ側でブロックを評価し,
205
+ その値を代入する.
206
+ ((|value|))はディープコピーされる.
207
+
208
+ --- fairy#pool_variable[:var] = value
209
+
210
+ プール変数に代入する.
211
+
212
+ ブロックソース内からアクセスする方法:
213
+
214
+ ...map(#{|e| @Pool.var = ...})
215
+
216
+ --- job インスタンス変数
217
+
218
+ ...map(#{|e| @var ...})
219
+
220
+ 複数イテレーションで共有できる変数. ただし, 各セグメント内ローカルになる.
221
+
222
+
223
+ --- VArray
224
+ 仮想配列.
225
+
226
+ 各ストリームの計算結果を仮想的な配列に保存する.
227
+ イテレーションするときに再利用できる.
228
+ 複数の下位ストリームにデータを流すことが可能.
229
+
230
+ 利用はinput/outoutで指定する.
231
+
232
+ 配列としてのアクセスも用意されているが、 fairy的な動きはしない.
233
+
234
+ Fairy.input(varray)
235
+ varrayを入力として指定する.
236
+ filter.output(VArray)
237
+ VArray に 出力する.
238
+ job.to_va
239
+ VArrayに出力し、それを返す.
240
+
241
+ 例:
242
+ va = fairy.input(Fairy::Iota, 1000).to_va
243
+ 10.times do {|i| va = fairy.input(va).map(%{|i| i*2}).to_va}
244
+
245
+
246
+
247
+ === 例外
248
+
249
+ ブロック実行中に発生した例外を通知する
250
+
251
+ === STDOUT
252
+
253
+ ブロック内で puts 等を実行すると、クライアント側に出力される。
254
+
255
+ putsは$stdoutを参照し、かつ、グローバル変数なので、スレッドセーフ
256
+ にするために、ちょっといやらしいことをした。
257
+
258
+
259
+ === ログAPI
260
+
261
+ --- Fairy::log(sender, printfメッセージ, param...)
262
+ Fairy::log(printfメッセージ, param...)
263
+ Fairy::log(sender) {|sio| ...}
264
+
265
+ --- Fairy::fatal, error, nortify, info, debug(.logと同じパラメータ)
266
+
267
+ 普段はこちらを使う。出力レベルに応じて出力する
268
+
269
+ --- Fairy::log_exception(sender, exp), Fairy::log_exception(exp)
270
+ 例外のバックトレースをログに書き出す
271
+
272
+ 例:
273
+
274
+ Log::warn(self) do |sio|
275
+ sio.puts "Warn: Exception raised:"
276
+ sio.puts $!
277
+ for l in $@
278
+ sio.puts "\t#{l}"
279
+ end
280
+ end
281
+
282
+ --- fairy.conf
283
+
284
+ fairyの環境設定を行うファイル.
285
+
286
+ 検索パス(存在したら上書き).
287
+
288
+ /etc/fairy.conf , $FAIRY_CONF, $HOME/.fiaryrc, ./etc/fairy.conf
289
+
290
+ グローバルな設定
291
+ CONF.MASTER_HOST
292
+ CONF.MASTER_PORT
293
+ CONF.HOME
294
+ CONF.VF_ROOT
295
+
296
+ ホスト固有の設定
297
+ CONF[“hostname”].MASTER_HOST
298
+ VArray に 出力する
299
+
300
+