Spark訪問Hive表


知識點1:Spark訪問HIVE上面的數據

  配置注意點:.

    1.拷貝mysql-connector-java-5.1.38-bin.jar等相關的jar包到你${spark_home}/lib中(spark2.0之后是${spark_home}/jars下),不清楚就全部拷貝過去

    2.將Hive的配置文件hive-site.xml拷貝到${spark_home}/conf目錄下

    3.因為使用ThriftJDBC/ODBC Server訪問spark SQL,所以要修改hive-site.xml文件 

        <property>

          <name>hive.metastore.uris</name>

          <value>thrift://hadoop1:9083</value>

          <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>

        </property>

         4.啟動hivede metastroe后台進程。執行${hive_home}/bin/hive --service metastore啟動hive的service metastore后台進程。

     5.啟動spark-shell訪問hive上數據。在${spark_home}/bin下執行./spark-shell --master spark://master:7077 (可添加其他參數rg:--jars等參數)    

    

 

知識點2:Spark訪問與HBase關聯的Hive表

  創建關聯HBase的Hive外表:

DROP TABLE IF EXISTS table_name; CREATE EXTERNAL TABLE table_name (ROWKEY STRING,Name STRING,ADDRESS STRING ) ROW FORMAT DELIMITED COLLECTION ITEMS TERMINATED BY ',' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping"=":key,A:Name,A:ADDRESS") TBLPROPERTIES("hbase.table.name" = "table_name");

  如果創建的是內部表,刪除了hive表,hbase上對應的表也會被刪除,不建議使用這種方式。

  如果創建的是外部表,使用drop只是刪除了hive的元數據,hbase表不會受影響。

  擴展:使用drop刪除hive的外表后,如果重新創建該表並load數據到該表中,將會出現部分數據是上次插入的數據,導致總數據量大於第二次插入的數據量,出現這種情況的原因是因為drop刪除表,只是刪除了表的元數據,不會刪除表中的數據,表中的數據存儲在創建語句location指定的hdfs路徑下,只要刪除該文件即可。

  配置注意點:

    1.Hive的配置部署與知識點1一樣

    2.拷貝如下jar包到你${spark_home}/lib中(spark2.0之后是${spark_home}/jars下),缺少這些jarj將會報錯,本人是將hbase下所有jar都復制到了${spark_home}/lib中

      • hbase-protocol-1.1.2.jar
      • hbase-client-1.1.2.jar
      • hbase-common-1.1.2.jar
      • hbase-server-1.1.2.jar
      • hive-hbase-handler-1.2.1.jar
      • metrics-core-2.2.0.jar

    3.將HBase的配置文件hbase-site.xml拷貝到${spark_home}/conf目錄下

    4.啟動spark-shell訪問與hbase關聯的hive上數據。在${spark_home}/bin下執行./spark-shell --master spark://master:7077 (可添加其他參數rg:--jars等參數,eg:

./bin/spark-shell --master spark://Master36:7077 --jars /usr/local/spark/lib/hive-hbase-handler-1.2.1.jar,/usr/local/spark/lib/hbase-common-1.1.2.jar,/usr/local/spark/lib/hbase-client-1.1.2.jar,/usr/local/spark/lib/hbase-protocol-1.1.2.jar,/usr/local/spark/lib/hbase-server-1.1.2.jar,/usr/local/spark/lib/metrics-core-2.2.0.jar,/usr/local/spark/lib/guava-12.0.1.jar,/usr/local/spark/lib/htrace-core-3.1.0-incubating.jar

代碼:

 /**
      *下面是spark1.6.2讀取hive的簡單代碼
      */
    val sqlContext=new org.apache.spark.sql.hive.HiveContext(sc)

    import sqlContext.implicites._

    val df=sqlContext.sql("select xxx from table_name").collect().foreach(println)


    /**
      *下面是spark2.11讀取hive的簡單代碼
       *spark2.0版本訪問hive配置部分將會簡單一點
      */
    import org.apache.spark.sql.SparkSession
    val warehouseLocation="hdfs://master:9000/user/hive/warehouse"

    val spark =SparkSession.builder().appName("spark-hive").config("spark.sql.warehouse.dir",warehouseLocation).enableHiveSupport().getOrCreate()

    import spark.implicits._
    import spark.sql

    spark.sql("selectxxx from xx").show
    //將數據框保存到到指定路徑中,可通過format來指定要保存的文件格式,repartition(n)設置輸出文件的個數
   dataFrame.repartition(1).write.format("csv").save("hdfs://master:9000/xxx")

 

出現的錯誤總結(解決方法僅供參考):

 1.error: Error creating transactional connection factory

  解決方法:在hive和spark集群都能正常使用情況下,檢查一下hive的service metastore后台進程是否已經啟動了

 2.Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

  解決方法:有可能是hive連接數據庫部分出現了問題,在hive-site.xml文件中添加<property><name>hive.metastore.uris</name><value>thrift://hadoop1:9083</value></property>,如果配置后執行出現了新的錯誤:ERROR ObjectStore: Version information not found in metastore,這個新錯誤可能使用hive的jar包和存儲元數據信息版本不一致而拋出的異常,可以在hive-site.xml文件中添加參數跳過版本的問題,<name>hive.metastore.schema.verification</name><value>false</value>,重啟hive服務,如果還是繼續報ERROR ObjectStore: Version information not found in metastore這個錯誤,說明剛剛配置的參數沒有生效,接着要把hdfs-site.xml文件拷貝到${spark_home}/conf文件下,這可能是因為環境變量的問題引起的

 3.java.io.IOException: java.lang.reflect.InvocationTargetException

  解決方法:由於缺少htrace-core-3.1.0-incubating.jar包,引入該包即可。

 4.java.lang.ClassNotFoundException Class org.apache.hadoop.hive.hbase.HBaseSerDe not found

  解決方法:由於缺少相關的hbase的jar包(hbase-protocol-1.1.2.jar,hbase-client-1.1.2.jar,hbase-common-1.1.2.jar,hbase-server-1.1.2.jar等),可以在啟動spark-shell通過--jars來添加。

 5.java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/util/Bytes

  解決方法:由於缺少guava-12.0.1.jar包,引入該包即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM