本地IDEA、spark程序远程读取hive数据

描述问题

数据在linux系统服务器上,在自己windows上用IDEA编写spark程序,需要远程访问hive数据。
先说成功步骤,再说配置过程出现的的问题和解决办法

步骤

确保hive --service metastore 服务在Linux服务器已开启,在hive-cli可以正常读取数据。

1 下载winutils

github-winutils各个版本集合
下载里面和自己服务器版本对应的,
在这里插入图片描述

配置HADOOP_HOME

将下载的文件添加到系统环境变量,配置完最好重启系统。
在这里插入图片描述

2 添加hive-site.xml文件

下载服务器端的hive-site.xml文件配置
添加到src/main/resources目录下
在这里插入图片描述

hive-site.xml

此处好几个注意点
hive.metastore.uris
hive.metastore.warehouse.dir
hive.exec.scratchdir

这几个参数一定注意配置好,后面好几个问题都跟这里有关

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- jdbc连接的URL 01-->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;allowPublicKeyRetrieval=true&amp;serverTimezone=GMT%2B8</value>
    </property>
    <!-- jdbc连接的Driver 02-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    <!-- jdbc连接的username 03-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <!-- jdbc连接的password 04-->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>password</value>
    </property>

    <!--元数据访问地址-->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hbase:9083</value>
    </property>
        <!-- Hive默认在HDFS的工作目录 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
    <property>
        <name>hive.exec.scratchdir</name>
        <value>/tmp</value>
    </property>
    <!--配置远程访问hive-->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hbase</value>
    </property>
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>
    <!--配置远程访问hive的用户密码-->
    <!--
    <property>
        <name>hive.server2.thrift.client.user</name>
        <value>hive</value>
        <description>Username to use against thrift client</description>
    </property>
    <property>
        <name>hive.server2.thrift.client.password</name>
        <value>password</value>
        <description>Password to use against thrift client</description>
    </property>
    -->
    <!-- yarn作业获取到的hiveserver2用户都为hive用户。设置成true则为实际的用户名 -->
    <property>
        <name>hive.server2.enable.doAs</name>
        <value>false</value>
    </property>

    <!-- 校验在metastore中存储的信息的版本和hive的jar包中的版本一致性-->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>

    <!--元数据存储授权-->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <property>
        <name>mapreduce.jobtracker.address</name>
        <value>ignorethis</value>
    </property>
    <property>
        <name>hive.exec.show.job.failure.debug.info</name>
        <value>false</value>
    </property>
</configuration>

3 spark程序config

    def readHive(args:Array[String]*): Unit ={
      System.setProperty("HADOOP_USER_NAME","root")
      val spark2: SparkSession = new SparkSession.Builder()
        .master("local[*]")
        .appName("sparkReadHive")
        //支持读Hive数据
        .enableHiveSupport()
        .getOrCreate()
      spark2.sql("show databases")
      spark2.sql("use weblog")
      //spark2.sql("show tables").show()
      val frame = spark2.sql("select * from mlog limit 100")
      frame.show()
    }

读取结果在这里插入图片描述

解决过程出现的问题

现存问题

一个WARN

经以上操作程序可读取到hive数据,但会报如下warning,windows无法
在这里插入图片描述
具体请看

临时目录tmp有关问题

在hive-site.xml中设置一下,默认使用hdfs上的临时目录

    <property>
        <name>hive.exec.scratchdir</name>
        <value>/tmp</value>
    </property>

权限
用有写权限的用户去操作:在spark程序代码中添加:System.setProperty(“HADOOP_USER_NAME”,“root”)

spark.sql.warehouse.dir

INFO SharedState: spark.sql.warehouse.dir is not set, but hive.metastore.warehouse.dir is set. Setting spark.sql.warehouse.dir to the value of hive.metastore.warehouse.dir ('/user/hive/warehouse').
21/11/21 11:28:04 INFO SharedState: Warehouse path is '/user/hive/warehouse'.

只要在hive-site.xml设置了hive.metastore.warehouse.dir,就可以替代,也可在代码添加spark.sql.warehouse.dir使用本地warehouse

JDBC方式

还有一种方式是通过jdbc方式访问hiveserver2,这样查询操作都是在服务端,只能获取查询结果;

参考文章

使用idea, sparksql读取hive中的数据
Hive的metastore和hiveserver2服务
Spark远程连接Hive数据源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一加六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值