Skip to content

Instantly share code, notes, and snippets.

@nice-journey
Last active June 3, 2022 17:20
Show Gist options
  • Save nice-journey/40148566b92e894a16cb28aa682a2740 to your computer and use it in GitHub Desktop.
Save nice-journey/40148566b92e894a16cb28aa682a2740 to your computer and use it in GitHub Desktop.
hiveserver2 example
package main
import (
"log"
"os"
"github.com/apache/thrift/lib/go/thrift"
"github.com/jcmturner/gokrb5/v8/client"
"github.com/jcmturner/gokrb5/v8/config"
"github.com/jcmturner/gokrb5/v8/gssapi"
"github.com/jcmturner/gokrb5/v8/keytab"
"github.com/jcmturner/gokrb5/v8/spnego"
)
const (
kRB5CONF = `
`
)
func main() {
l := log.New(os.Stderr, "GOKRB5 Client: ", log.LstdFlags)
kt, err := keytab.Load("./hdfs.keytab")
if err != nil {
l.Fatalf("could not load client keytab: %v", err)
}
conf, err := config.NewFromString(kRB5CONF)
if err != nil {
l.Fatalf("could not load krb5.conf: %v", err)
}
cl := client.NewWithKeytab("hdfs/hadoop2", "TEST.COM", kt, conf, client.Logger(l),
client.DisablePAFXFAST(true))
err = cl.Login()
if err != nil {
l.Fatalf("could not login client: %v", err)
}
// get ticket to access hiveserver2
svcTicket, encKey, err := cl.GetServiceTicket("hive/hadoop2")
if err != nil {
l.Fatalf("failed to get serivce ticket")
}
krb5Token, err := spnego.NewKRB5TokenAPREQ(cl, svcTicket, encKey,
[]int{gssapi.ContextFlagInteg, gssapi.ContextFlagConf}, []int{})
if err != nil {
l.Fatalf("failed to get krb token")
}
apReq, err := krb5Token.Marshal()
if err != nil {
l.Fatalf("failed to marshal ap req: %+v\n", err)
}
socket := thrift.NewTSocketConf("hadoop2:10000", nil)
if socket == nil {
l.Fatalf("failed to new hive connection socket\n")
return
}
if err := socket.Open(); err != nil {
l.Fatalf("failed to open connection: %+v\n", err)
return
}
// send AP_REQ to hiveserver2
if _, err := socket.Write(apReq); err != nil {
l.Fatalf("failed to write AP_REQ data: %+v\n", err)
return
}
sh := make([]byte, 24)
if _, err := socket.Read(sh); err != nil {
l.Fatalf("failed to read response for hive server: %+v\n", err)
return
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment