3

Hadoop ストリーミングをサポートする Go プログラミング言語の有名なクライアントはありますか? 私は周りを検索しましたが、価値のあるものを見つけることができませんでした.

4

1 に答える 1

3

Hadoop ストリーミング ジョブを Go で直接実行することもできます。それを実行している人がいると聞いたことがあります。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と呼ばれる別のライブラリを見ましたが、あまりよく維持されておらず、非常にアルファ版に見えませんが、冒険好きなら試してみてください :)

于 2013-05-22T18:24:41.123 に答える