Spark访问HIVE

Spark访问HIVE

知识点1:Spark访问HIVE上面的数据

配置注意点:.

1.拷贝mysql-connector-java-5.1.38-bin.jar等相关的jar包到你 s p a r k h o m e / l i b 中 ( s p a r k 2.0 之 后 是 {spark_home}/lib中(spark2.0之后是 sparkhome/libspark2.0{spark_home}/jars下),不清楚就全部拷贝过去

2.将Hive的配置文件hive-site.xml拷贝到${spark_home}/conf目录下

3.因为使用ThriftJDBC/ODBC Server访问spark SQL,所以要修改hive-site.xml文件

hive.metastore.uris

thrift://hadoop1:9083

Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.

     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包到你 s p a r k h o m e / l i b 中 ( s p a r k 2.0 之 后 是 {spark_home}/lib中(spark2.0之后是 sparkhome/libspark2.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文件中添加hive.metastore.uristhrift://hadoop1:9083,如果配置后执行出现了新的错误:ERROR ObjectStore: Version information not found in metastore,这个新错误可能使用hive的jar包和存储元数据信息版本不一致而抛出的异常,可以在hive-site.xml文件中添加参数跳过版本的问题,hive.metastore.schema.verificationfalse,重启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包,引入该包即可。

地址连接:https://www.cnblogs.com/hsy060314/p/8393262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark提供了与Hive集成的功能,可以在Spark中使用Hive的元数据、表和查询语言。要在Spark中使用Hive集成,您需要确保在Spark中启用Hive支持。 首先,您需要在启动Spark应用程序时配置Hive支持。您可以在SparkSession的配置中设置以下选项来启用Hive支持: ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Spark Hive Integration") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() ``` 在上述示例中,我们通过将`spark.sql.warehouse.dir`配置设置为Hive仓库目录来启用Hive支持。 一旦启用了Hive支持,您可以使用SparkSession的`sql`方法执行Hive查询。例如,您可以执行以下操作来读取Hive表的数据: ```python df = spark.sql("SELECT * FROM database.table") ``` 在这里,`database.table`是您要查询的Hive表的名称。 需要注意的是,Spark会自动将Hive表中的数据加载为DataFrame,这样您就可以使用Spark的API进行数据处理和分析。 除了执行Hive查询,您还可以使用Spark的DataFrame API来创建、操作和管理Hive表。您可以使用`spark.catalog`来访问Hive的元数据信息,并使用DataFrame API来创建新表、插入数据等操作。 这就是SparkHive集成的基本概述。通过使用SparkHive的组合,您可以在Spark中利用Hive的元数据和查询能力,以及Spark强大的数据处理和分析功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值