Goのwebhdfsクライアントを修正してみた

HadoopへファイルをGo言語でインポートしたくて、webhdfs経由で入れようとしていました。
そこでGoのクライアントライブラリーを使ってやってみたんだけど、少し苦労したって話です。

Go言語のwebhdfsクライアントってあんまりない。

Go言語でアプリを作ってて、webhdfsのクライアントになんかいいのないかなーと探してたら下記を見つけたのでこれでやってみることにした。
github.com
なんかアフリカ系のすごい笑顔がでてきたな。。。

これを探すまでにちょっと驚いたんだけどGo言語でHadoopのクライアントライブラリーってほとんど無いみたいね。
ここで探してもたった2つしかない。。。
webhdfs - Go libraries and applications
f:id:suganoo:20181227095445p:plain

まあそうだろうね、webhdfsのREST apiがあるから別に誰かのクライアント使わなくても自分でURLとかちゃんと書いてnet/http使えばなんとかなりそうだからな。
でも面倒なことしたくなかったのでクライアント使うことにしました。

エラーがでる。。。

READMEをもとにして書いてやってみたんですが、なんかエラーがでる。

import os
import github.com/vladimirvivien/gowfs
fs, err := gowfs.NewFileSystem(gowfs.Configuration{Addr: "hoge.com:14000", User: "hdfs"})
if err != nil{
	log.Fatal(err)
}
fp, _ := os.Open("hoge.txt.gz")
ok, err := fs.Create(
	fp,
	gowfs.Path{Name:"/hoge/hoge.txt.gz"},
	false,
	0,
	0,
	0700,
	0,
)
invalid character '<' looking for beginning of value

ソースのエラーのところをfmt.Printlnでいろいろと表示させて調べたところ、content-typeが適切に入ってないことがわかってきた。

Content-Type:[text/html;charset=utf-8]
 <u>Data upload requests must have content-type set to 'application/octet-stream'</u><

修正

なので仕方がないので、forkして修正してPRしてみた。
github.com

fs.Create()の末尾にcontent-type 入れたらそれを設定できるというもの。

ok, err := fs.Create(
	fp,
	gowfs.Path{Name:"/hoge/hoge.txt.gz"},
	false,
	0,
	0,
	0700,
	0,
	"application/octet-stream"   // <--- これな!
)

本家のコミットを見てみると、3,4年更新されてないからPRも取り込まれることもないでしょう。
なので動作確認はしたけどテストコードは試してない。。。
テストコード書いた方がいいんだけどなあ....
f:id:suganoo:20181227095617g:plain
お疲れ様でした。