1. 程式人生 > >使用Spark/Java讀取已開啟Kerberos認證的HBase

使用Spark/Java讀取已開啟Kerberos認證的HBase

1.賦予drguo使用者相應的許可權

2.KDC中建立drguo使用者並匯出相應的keytab檔案

[root@bigdata28 ~]# kadmin.local 
Authenticating as principal drguo/admin@AISINO.COM with password.
kadmin.local:  addprinc drguo/bigdata28
WARNING: no policy specified for drguo/bigdata28@AISINO.COM; defaulting to no policy
Enter password for principal "drguo/
[email protected]
"
: Re-enter password for principal "drguo/[email protected]": Principal "drguo/[email protected]" created. kadmin.local: xst -norandkey -k /home/drguo/drguo_bigdata28.keytab drguo/bigdata28@AISINO.COM Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type aes256-cts-hmac-sha1-96
added to keytab WRFILE:/home/drguo/drguo_bigdata28.keytab. Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/home/drguo/drguo_bigdata28.keytab. Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type des3-cbc-sha1 added to keytab WRFILE
:/home/drguo/drguo_bigdata28.keytab. Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type arcfour-hmac added to keytab WRFILE:/home/drguo/drguo_bigdata28.keytab. Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type des-hmac-sha1 added to keytab WRFILE:/home/drguo/drguo_bigdata28.keytab. Entry for principal drguo/bigdata28@AISINO.COM with kvno 1, encryption type des-cbc-md5 added to keytab WRFILE:/home/drguo/drguo_bigdata28.keytab. kadmin.local: q

3.將krb5.conf與keytab檔案拷到本地,方便測試

4.使用Spark讀取HBase

package drguo.test

import java.io.IOException

import com.google.protobuf.ServiceException
import dguo.test.HBaseKerb
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.{HBaseAdmin, HTable}
import org.apache.hadoop.hbase.mapreduce.{TableInputFormat}
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.security.UserGroupInformation
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by drguo on 2018/7/18.
  */
object SparkExecHBase {


  def main(args: Array[String]): Unit = {
//    HBaseKerb.getAllRows("XMJZ")
    System.setProperty("java.security.krb5.conf", "d:/krb5.conf")
    val sparkConf = new SparkConf().setAppName("SparkExecHBase").setMaster("local")
    val sc = new SparkContext(sparkConf)

    val conf = HBaseConfiguration.create()
    conf.set(TableInputFormat.INPUT_TABLE, "XMJZ")
    conf.set("hbase.zookeeper.quorum","172.19.6.28,172.19.6.29,172.19.6.30")
    conf.set("hbase.zookeeper.property.clientPort", "2181")
    conf.set("hadoop.security.authentication", "Kerberos")

    UserGroupInformation.setConfiguration(conf)
    try {
      UserGroupInformation.loginUserFromKeytab("drguo/[email protected]", "d:/drguo_bigdata28.keytab")
      HBaseAdmin.checkHBaseAvailable(conf)
    } catch {
      case e: IOException =>
        e.printStackTrace()
      case e: ServiceException =>
        e.printStackTrace()
    }

    val hbaseRdd = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], classOf[org.apache.hadoop.hbase.client.Result])
//    println(hbaseRdd.toString())
    hbaseRdd.map( x=>x._2).map{result => (result.getRow,result.getValue(Bytes.toBytes("Info"),Bytes.toBytes("ADDTIME")))}.map(row => (new String(row._1),new String(row._2))).collect.foreach(r => (println(r._1+":"+r._2)))

  }

}

5.使用Java讀取(網上也有不少例子,但大部分都有一些重複、多餘的程式碼)

package dguo.test;

import com.google.protobuf.ServiceException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.security.UserGroupInformation;

import java.io.IOException;

/**
 * Created by drguo on 2018/7/18.
 */
public class HBaseKerb {

    private static Configuration conf = null;
    static {
        System.setProperty("java.security.krb5.conf", "d:/krb5.conf" );
        //使用HBaseConfiguration的單例方法例項化
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "172.19.6.28,172.19.6.29,172.19.6.30");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.set("hadoop.security.authentication" , "Kerberos" );

        UserGroupInformation.setConfiguration(conf);

        try {
            UserGroupInformation.loginUserFromKeytab("drguo/[email protected]", "d:/drguo_bigdata28.keytab");
            HBaseAdmin.checkHBaseAvailable(conf);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        }

    }

    public static void getAllRows(String tableName) throws IOException{
        HTable hTable = new HTable(conf, tableName);
        //得到用於掃描region的物件
        Scan scan = new Scan();
        //使用HTable得到resultcanner實現類的物件
        ResultScanner resultScanner = hTable.getScanner(scan);
        for(Result result : resultScanner){
            Cell[] cells = result.rawCells();
            for(Cell cell : cells){
                //得到rowkey
                System.out.println("行鍵:" + Bytes.toString(CellUtil.cloneRow(cell)));
                //得到列族
                System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
    }

    public static void main(String[] args) throws IOException{
        getAllRows("XMJZ");
    }
}

PS:

出現下述錯誤往往是因為System.setProperty(“java.security.krb5.conf”, “d:/krb5.conf”)中的krb5.conf檔案沒有找到(比如路徑錯誤)或是裡面配置的kdc、admin_server地址錯誤。

Exception in thread “main” java.lang.IllegalArgumentException: Can’t get Kerberos realm
at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:65)
at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:319)
at org.apache.hadoop.security.UserGroupInformation.setConfiguration(UserGroupInformation.java:374)
at drguo.test.SparkExecHBase$.main(SparkExecHBase.scala:32)
at drguo.test.SparkExecHBase.main(SparkExecHBase.scala)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.security.authentication.util.KerberosUtil.getDefaultRealm(KerberosUtil.java:84)
at org.apache.hadoop.security.HadoopKerberosName.setConfiguration(HadoopKerberosName.java:63)
… 4 more
Caused by: KrbException: Cannot locate default realm
at sun.security.krb5.Config.getDefaultRealm(Config.java:1029)
… 10 more

相關推薦

使用Spark/Java讀取開啟Kerberos認證HBase

1.賦予drguo使用者相應的許可權 2.KDC中建立drguo使用者並匯出相應的keytab檔案 [root@bigdata28 ~]# kadmin.local Authenticating as principal drguo/admin

kerberos認證hbasespark環境下的使用

hadoop中計算框架MapReduce中儲存到有kerberos的hdfs,由於其內部yarn進行了認證故不需要進行相關的操作,可直接進行讀寫操作。spark使用有kerberos認證的hbase是一個既麻煩又簡單的問題,麻煩的方面是:中文的網站相關的文章很少並且分佈只是分

cdh5.12.2 開啟kerberos認證

大數據 cdh kerberos hadoop 一:kdc 服務的安裝與配置 二:集群所有節點安裝Kerberos客戶端(包括CM) 三:CDH集群啟用Kerberos 一: kdc 服務的安裝與配置 1.1 安裝kdc服務 # yum install krb5-server krb

Spark連線需Kerberos認證HBase

Prerequisite krb5.conf 或 krb5.ini xx.keytab core-site.xml hbase-core.xml Codes hBaseConfig.addResource("hbase-site.xml") h

java在線聊天項目0.6版 解決客戶端關閉後異常問題 dis.readUTF()循環讀取關閉的socket

異常 oid jpanel read pen false tput ets java.net 服務端對try catch finally重新進行了定義,當發生異常,主動提示,或關閉出現異常的socket 服務器端代碼修改如下: package com.swift; im

HBase實操 | 如何使用Java連線KerberosHBase

一.文件編寫目的 出於CDH叢集安全考慮,在CDH叢集中增加了Kerberos認證機制。因為HBase的儲存系統是基於Hadoop的儲存,所以通過HBase客戶端訪問HBase資料庫時需要進行身份認證。在Linux下使用HBase客戶端訪問HBase資料時需要先kinit初始化Kerberos賬

spark從mysql讀取資料(redis/mongdb/hbase等類似,換成各自RDD即可)

package com.ws.jdbc import java.sql.DriverManager import org.apache.spark.rdd.JdbcRDD import org.apache.spark.{SparkConf, SparkCont

大資料Spark優化讀取Hbase--region 提高並行數過程詳細解析

一. Hbase 的 region 我們先簡單介紹下 Hbase 的 架構和 region : 從物理叢集的角度看,Hbase 叢集中,由一個 Hmaster 管理多個 HRegionServer,其中每個 HRegionServer 都對應一臺物理機器,一臺 HRegionServer

VBA 從一個未開啟的Excel檔案中讀取資料到,開啟的檔案中.

Sub CommandButton2_Click()''根據專案名稱 獲取部門名'A8    顯示在B8中     c3--c40Dim xDis AsIntegerDim xNo AsIntegerDim strProject  '專案名稱Dim strDep '製造部門 Dim myPath$, myFi

StreamSets 從Mysql到Hbase(帶kerberos認證)的實時資料採集

引言 最近在研究StreamSets,就做了個簡單Demo熟悉它的使用,由於我們的hbase是cdh版的,且帶有kerberos認證,與streamsSet怎麼配帶kerberos認證的Hbase中文資料甚少,所以本人就去官網翻看了一下。 環境介紹 安裝streamSets這

spark on yarn模式下掃描帶有kerberoshbase

我上一篇寫了關於如何在spark中直接訪問有kerberos的hbase,現在我們需要對hbase進行全表的分散式掃描,在無kerberos的情況下通過sparkcontext的newApiHadoopRDD就可以達到目的,但有了kerberos的限制,這個方法就不行了,

java程式碼連線Hive(開啟Kerberos和sentry)

在開啟Kerberos認證之後,使用者需要進入登入Hive CLI或beeline需要用到keytab。為此,我們現在Kerberos資料庫中建立user1和user2兩個principal。 生成user1和user2的keytab kadmin.

spark1.4 讀取hbase 0.96 報錯 java.io.NotSerializableException: org.apache.hadoop.hbase.io.ImmutableBytes

spark接hbase讀取資料: val sc = new SparkContext(sparkConf) val conf = HBaseConfiguration.create()

Spark如何讀取Hbase特定查詢的資料

最近工作需要使用到Spark操作Hbase,上篇文章已經寫了如何使用Spark讀寫Hbase全量表的資料做處理,但這次有所不同,這次的需求是Scan特定的Hbase的資料然後轉換成RDD做後續處理,簡單的使用Google查詢了一下,發現實現方式還是比較簡單的,用的還是Hb

spark操作讀取hbase例項

博主專案實踐中,經常需要用spark從hbase中讀取資料。其中,spark的版本為1.6,hbase的版本為0.98。現在記錄一下如何在spark中操作讀取hbase中的資料。 對於這種操作型的需求,沒有什麼比直接上程式碼更簡單明瞭的了。so,show me

spark DataFrame 使用Java讀取mysql和寫入mysql的例子

例子 package com.hjh.demo.mysql; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.spark.SparkConf; impor

Java Api Consumer 連線啟用Kerberos認證的Kafka

java程式連線到一個需要Kerberos認證的kafka叢集上,消費生產者生產的資訊,kafka版本是2.10-0.10.0.1; Java程式以maven構建,(怎麼構建maven工程,可去問下度娘:“maven工程入門示例”) 先上pom.xml檔案 <pro

通過BulkLoad快速將海量數據導入到Hbase(TDH,kerberos認證

++ zookeeper wke zookeepe ner all throw 利用 tab 一、概念 使用BlukLoad方式利用Hbase的數據信息是 按照特點格式存儲在HDFS裏的特性,直接在HDFS中生成持久化的Hfile數據格式文件,然後完成巨量數

java讀取網頁圖片路徑並下載到本地

mage -h form read file cti 連接 公司 date() java讀取網頁圖片路徑並下載到本地 最近公司需要爬取一些網頁上的數據,自己就簡單的寫了一個demo,其中有一些數據是圖片,需要下載下來到本地並且 將圖片的路徑保存到數據庫,示例代碼如下: pa

Java讀取Properties配置文件

配置文件 java 字符串 接口 1.Properties類與Properties配置文件Properties類繼承自Hashtable類並且實現了Map接口,使用鍵值對的形式來保存屬性集。不過Properties的鍵和值都是字符串類型。2.Properties中的主要方法(1)load(In