是否有支持 Hadoop Streaming 的 Go 编程语言的知名客户端?我四处寻找,找不到任何有价值的东西。
问问题
2537 次
1 回答
3
您可以直接在 Go 上运行 Hadoop 流式作业,我听说有人这样做,这里有一个示例取自一个在 Go 中进行 Wordcount 的博客。这是映射器:
package main
import (
"bufio"
"fmt"
"os"
"regexp"
)
func main() {
/* Word regular experssion. */
re, _ := regexp.Compile("[a-zA-Z0-9]+")
reader := bufio.NewReader(os.Stdin)
for {
line, _, err := reader.ReadLine()
if err != nil {
if err != os.EOF {
fmt.Fprintf(os.Stderr, "error: can't read - %s\n", err.String())
}
break
}
matches := re.FindAll(line, -1)
for _, word := range(matches) {
fmt.Printf("%s\t1\n", word)
}
}
}
这是减速器:
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"strconv"
)
func main() {
counts := make(map[string]uint)
reader := bufio.NewReader(os.Stdin)
for {
line, _, err := reader.ReadLine()
if err != nil {
if err != os.EOF {
fmt.Fprintf(os.Stderr, "error: can't read - %s\n", err)
}
break
}
i := bytes.IndexByte(line, '\t')
if i == -1 {
fmt.Fprintln(os.Stderr, "error: can't find tab")
continue
}
word := string(line[0:i])
count, err := strconv.Atoui(string(line[i+1:]))
if err != nil {
fmt.Fprintln(os.Stderr, "error: bad number - %s\n", err)
continue
}
counts[word] = counts[word] + count
}
/* Output aggregated counts. */
for word, count := range(counts) {
fmt.Printf("%s\t%d\n", word, count)
}
}
或者,您也可以使用dmrgo来更轻松地编写流式作业。他们在这里有一个字数统计示例。
我看到了另一个名为gomrjob 的库,但它看起来维护得不是很好而且很 alpha,但是如果你喜欢冒险的话,你可以尝试一下 :)
于 2013-05-22T18:24:41.123 回答