Last active
June 3, 2022 17:20
-
-
Save nice-journey/40148566b92e894a16cb28aa682a2740 to your computer and use it in GitHub Desktop.
hiveserver2 example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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