fairy 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,53 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/filter"
7
+ require "fairy/share/vfile"
8
+
9
+ module Fairy
10
+ class InputFile<Filter
11
+
12
+ def InputFile.open(fairy, opts, ffile_descripter)
13
+ ffile = new(fairy, opts)
14
+ ffile.open(ffile_descripter)
15
+ ffile
16
+ end
17
+
18
+ def InputFile.input(fairy, opts, ffile_descripter)
19
+ InputFile.open(fairy, opts, ffile_descripter)
20
+ end
21
+
22
+ def initialize(fairy, opts=nil)
23
+ super
24
+ end
25
+
26
+ def backend_class_name
27
+ "CInputFile"
28
+ end
29
+
30
+ def open(ffile_descripter)
31
+ @descripter = ffile_descripter
32
+ case ffile_descripter
33
+ when Array
34
+ vf = VFile.real_files(ffile_descripter)
35
+ when VFile
36
+ vf = ffile_descripter
37
+ when String
38
+ if VFile.vfile?(ffile_descripter)
39
+ vf = VFile.vfile(ffile_descripter)
40
+ else
41
+ vf = VFile.real_files([ffile_descripter])
42
+ end
43
+ else
44
+ ERR::Raise ERR::IllegalVFile
45
+ end
46
+ backend.open(vf)
47
+ self
48
+ end
49
+
50
+ end
51
+
52
+ # class BFile;end
53
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/filter"
7
+
8
+ module Fairy
9
+
10
+ SPLIT_NO = CONF.IOTA_SPLIT_NO
11
+
12
+ class InputIota < Filter
13
+ module Interface
14
+
15
+ # Usage:
16
+ # fairy.iota(no)....
17
+ #
18
+ def iota(times, opts={})
19
+ InputIota.input(self, opts, times)
20
+ end
21
+ alias times iota
22
+
23
+ end
24
+ Fairy::def_fairy_interface Interface
25
+
26
+ def self.input(fairy, opts, n)
27
+ unless opts[:SPLIT_NO]
28
+ opts[:SPLIT_NO] = SPLIT_NO
29
+ end
30
+ iota = new(fairy, opts, n)
31
+ iota.start
32
+ iota
33
+ end
34
+
35
+
36
+ def backend_class_name
37
+ "CInputIota"
38
+ end
39
+
40
+ def start
41
+ backend.start
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+
48
+
49
+
@@ -0,0 +1,188 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/filter"
7
+ require "fairy/share/vfile"
8
+
9
+ module Fairy
10
+ class InputLocalFile < Filter
11
+
12
+ def self.input(fairy, opts, filename)
13
+ self.start(fairy, opts, filename)
14
+ end
15
+
16
+ def self.start(fairy, opts, filename)
17
+ lfile = new(fairy, opts)
18
+ lfile.start(filename)
19
+ lfile
20
+ end
21
+
22
+ def initialize(fairy, opts=nil)
23
+ super
24
+ @io = nil
25
+ end
26
+
27
+ attr_reader :io
28
+
29
+ def backend_class_name
30
+ "CInputLocalFile"
31
+ end
32
+
33
+ def start(filename)
34
+ @filename = filename
35
+ backend.start(self)
36
+ end
37
+
38
+ def each_assigned_filter(&block)
39
+ if @opts[:split_no]
40
+ each_assigned_filter_split_no(&block)
41
+ elsif !@opts[:split_size]
42
+ each_assigned_filter1(&block)
43
+ else
44
+ each_assigned_filter_split(&block)
45
+ end
46
+ end
47
+
48
+ def each_assigned_filter1(&block)
49
+ io = File.open(@filename)
50
+ yield io
51
+ end
52
+
53
+ def each_assigned_filter_split(&block)
54
+ split_size = @opts[:split_size]
55
+ begin
56
+ seek = 0
57
+ size = File.stat(@filename).size
58
+ while seek < size
59
+ io = SplittedFile.open(@filename, seek, seek + split_size - 1)
60
+ seek = io.seek_end + 1
61
+ yield io
62
+ end
63
+ rescue
64
+ Log::warn_exception(self)
65
+ raise
66
+ end
67
+ nil
68
+ end
69
+
70
+ def each_assigned_filter_split_no(&block)
71
+ split_no = @opts[:split_no]
72
+ size = File.stat(@filename).size
73
+ split_size = Rational(size, split_no)
74
+ begin
75
+ rest_split_no = split_no
76
+ seek = 0
77
+ while seek < size
78
+ io = SplittedFile.open(@filename, seek, seek + (size - seek + 1)/rest_split_no - 1)
79
+ seek = io.seek_end + 1
80
+ rest_split_no -= 1
81
+ yield io
82
+ end
83
+ if rest_split_no > 0
84
+ Log::warn(self, "Split #{split_no - rest_split_no} files. Can't split specified split_no: #{split_no}")
85
+ end
86
+ rescue
87
+ Log::warn_exception(self)
88
+ raise
89
+ end
90
+ nil
91
+ end
92
+
93
+ # def open
94
+ # if block_given?
95
+ # io = File.open(@filename)
96
+ # begin
97
+ # yield io
98
+ # ensure
99
+ # io.close
100
+ # end
101
+ # else
102
+ # File.open(@filename)
103
+ # end
104
+ # end
105
+
106
+ # def split_opens(split_size, &block)
107
+ # begin
108
+ # seek = 0
109
+ # size = File.stat(@filename).size
110
+ # while seek < size
111
+ # io = SplittedFile.open(@filename, seek, seek + split_size)
112
+ # seek = io.seek_end + 1
113
+ # yield io
114
+ # end
115
+ # rescue
116
+ # Log::warn_exception(self)
117
+ # raise
118
+ # end
119
+ # end
120
+
121
+ class SplittedFile
122
+ include Enumerable
123
+
124
+ def self.open(fd, seek_start, seek_end, &block)
125
+ sf = new(fd, seek_start, seek_end)
126
+ if block_given?
127
+ begin
128
+ yield sf
129
+ ensure
130
+ sf.close
131
+ end
132
+ else
133
+ sf
134
+ end
135
+ end
136
+
137
+ def initialize(fd, seek_start, seek_end)
138
+ @io = File.open(fd)
139
+ @seek_start = seek_start
140
+
141
+ @io.seek(seek_end)
142
+ c = @io.read(1)
143
+ case c
144
+ when nil, "\n"
145
+ @seek_end = seek_end
146
+ else
147
+ @io.gets
148
+ @seek_end = @io.pos - 1
149
+ end
150
+ @io.seek(seek_start)
151
+ end
152
+
153
+ attr_reader :seek_start
154
+ attr_reader :seek_end
155
+
156
+ def external_encoding
157
+ @io.external_encoding
158
+ end
159
+
160
+ def close
161
+ @io.close
162
+ @io = nil
163
+ end
164
+
165
+ def each(&block)
166
+ begin
167
+ while @io.pos < @seek_end && l = @io.gets
168
+ yield l
169
+ end
170
+ rescue
171
+ Log::warn_exception(self)
172
+ raise
173
+ end
174
+ end
175
+
176
+ def read(length)
177
+ if @seek_end - @io.pos + 1 < length
178
+ length = @seek_end - @io.pos + 1
179
+ end
180
+ if length == 0
181
+ nil
182
+ else
183
+ @io.read(length)
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+ require "fairy/client/filter"
6
+
7
+ module Fairy
8
+
9
+ class InputVArray < Filter
10
+
11
+ def self.input(fairy, opts, varray)
12
+ input_va = new(fairy, opts, varray)
13
+ input_va.start
14
+ input_va
15
+ end
16
+
17
+ def backend_class_name
18
+ "CInputVArray"
19
+ end
20
+
21
+ def start
22
+ backend.start
23
+ end
24
+ end
25
+ end
26
+
27
+
28
+
29
+
30
+
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/share/varray"
7
+
8
+ module Fairy
9
+ module InputInterface
10
+ def input(desc, *opts)
11
+ if opts.last.kind_of?(Hash)
12
+ opts_h = opts.pop
13
+ else
14
+ opts_h = {}
15
+ end
16
+
17
+ case desc
18
+ # when Enumerable
19
+ # There.input(self, opts_h, desc, *opts)
20
+ when VArray
21
+ InputVArray.input(self, opts_h, desc)
22
+ when DeepConnect::Reference
23
+ if desc.peer_class.name == "Fairy::VArray"
24
+ InputVArray.input(self, opts_h, desc)
25
+ else
26
+ ERR::Raise ERR::NoImpliment "#{desc}, #{desc.peer_class}"
27
+ end
28
+ when Class
29
+ desc.input(self, opts_h, *opts)
30
+ else
31
+ if !desc.kind_of?(String) || VFile.vfile?(desc)
32
+ InputFile.input(self, opts_h, desc)
33
+ else
34
+ InputLocalFile.input(self, opts_h, desc)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ def_fairy_interface InputInterface
40
+ end
41
+
42
+
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/filter"
7
+
8
+ module Fairy
9
+ class IOFilter < Filter
10
+
11
+ def initialize(fairy, *rests)
12
+ super
13
+ end
14
+
15
+ def backend_class_name
16
+ ERR::Raise ERR::INTERNAL::UndefinedBackendClass
17
+ end
18
+
19
+ def input=(job)
20
+ @input=job
21
+ # atom = Atom.new(backend, :input=, job.backend)
22
+ # @fairy.send_atom(atom)
23
+ backend.input=job.backend
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/io-filter"
7
+
8
+ module Fairy
9
+
10
+ class Junction<IOFilter
11
+ module Interface
12
+ def junction(opts = nil, &block)
13
+ subfairy = Fairy.create_subfairy(@fairy)
14
+ junction_ps = Junction.new(subfairy, opts)
15
+ junction_ps.input = self
16
+
17
+ last_filter = yield subfairy, junction_ps
18
+
19
+ junction_sp = Junction.new(@fairy, opts)
20
+ junction_sp.input = last_filter
21
+ junction_sp
22
+ end
23
+ alias sub junction
24
+ end
25
+ Fairy::def_filter_interface Interface
26
+
27
+ def backend_class_name
28
+ "CJunction"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (C) 2007-2010 Rakuten, Inc.
4
+ #
5
+
6
+ require "fairy/client/io-filter"
7
+ require "fairy/share/block-source"
8
+
9
+ module Fairy
10
+
11
+ class Map<IOFilter
12
+ module Interface
13
+ def map(block_source, opts = nil)
14
+ ERR::Raise ERR::CantAcceptBlock if block_given?
15
+ block_source = BlockSource.new(block_source)
16
+ mapper = Map.new(@fairy, opts, block_source)
17
+ mapper.input = self
18
+ mapper
19
+ end
20
+ alias collect map
21
+
22
+ end
23
+ Fairy::def_filter_interface Interface
24
+
25
+ def initialize(fairy, opts, block_source)
26
+ super
27
+ @block_source = block_source
28
+ end
29
+
30
+ def backend_class_name
31
+ "CMap"
32
+ end
33
+ end
34
+ end