IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive的hiveserver2和beeline的使用以及spark thritfserver的启动 -> 正文阅读

[大数据]Hive的hiveserver2和beeline的使用以及spark thritfserver的启动

Hive 的hiveserver2介绍

HiveServer2 (HS2) 是一项使客户端能够针对 Hive 执行查询的服务。 HiveServer2 是已弃用的 HiveServer1 的继任者。 HS2 支持多客户端并发和认证。它旨在为开放 API 客户端(如 JDBC 和 ODBC)提供更好的支持。 HS2 是作为复合服务运行的单个进程,其中包括基于 Thrift 的 Hive 服务(TCP 或 HTTP)和用于 Web UI 的 Jetty Web 服务器。

hiveserver2 的配置

需要在/hive/conf/hive-site.xml中配置

hive.server2.thrift.min.worker.threads – 最小工作线程,默认 5.
hive.server2.thrift.max.worker.threads – 最大工作线程,默认 500.
hive.server2.thrift.port – 监听端口, 默认 10000.
hive.server2.thrift.bind.host – 绑定的地址.

比如

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <!-- hive 的元数据存储路径,使用mysql存储 -->
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
  </property>
  <!-- 数据库驱动 -->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <!-- 数据库用户名 -->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <!-- 数据库密码 -->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
  </property>
  <!-- 是否进行版本校验 -->
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <!-- 权限处理 -->
  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>
  <!-- 最小工作线程,默认5 -->
  <property>
    <name>hive.server2.thrift.min.worker.threads</name>
    <value>2</value>
  </property>
  <!-- 最大工作线程,默认500 -->
  <property>
    <name>hive.server2.thrift.max.worker.threads</name>
    <value>5</value>
  </property>
  <!-- 绑定端口,默认10000 -->
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
  </property>
  <!-- 绑定地址,默认0.0.0.0 -->
  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>0.0.0.0</value>
  </property>
</configuration>

因为使用了mysql数据库存储hive的元数据,所以需要从网上下载mysql的驱动包

Maven Repository: mysql ? mysql-connector-java (mvnrepository.com)下载就行

8.0.23版本

下载地址https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar

下载后拷贝到/hive/lib目录下

image-20220224213358642

接着启动mysql

image-20220224213509561

接着启动hdfs

image-20220224213531387

启动spark集群

image-20220224213554183

启动spark-history

image-20220224213611856

启动hiveserver2

image-20220224213909185

也可以使用nohup ./hiveserver2 & 在后台启动hiveserver2,将输出写入nohup文件

image-20220224214015547

可以使用jps -m查看运行的hiveserver2进程

image-20220224214114606

beeline连接hiveserver2

当启动hiveserver2之后,就可以使用beeline进行连接了。

hiveserver2是服务端,而beeline是hive自带的一个客户端,除了使用beeline,还可以使用代码连接hiveserver2服务端。

使用beeline连接需要指定连接urljdbc:hive2://hadoop01:10000

比如使用如下命令连接beeline -u jdbc:hive2://hadoop01:10000 -n hadoop01

其中-u指定连接url,-n指定客户端的用户名

image-20220224214423733

查询

image-20220224214528376

和使用mysql非常类似

输入help查看帮助

image-20220224214617929

可以看到beeline的命令都是以!开头的。

配置hiveserver2的界面

可以在/hive/conf/hive-site.xml中配置和webUI相关的配置

  <!-- hive 界面绑定地址 -->
  <property>
    <name>hive.server2.webui.host</name>
    <value>0.0.0.0</value>
  </property>
  <!-- hive 界面端口 -->
  <property>
    <name>hive.server2.webui.port</name>
    <value>8085</value>
  </property>
  <!-- hive 界面最大线程 -->
  <property>
    <name>hive.server2.webui.max.threads</name>
    <value>5</value>
  </property>

然后重新启动hiveserver2

需要先杀掉原来启动的hiveserver2,然后重新启动

image-20220224215359703

接着就能访问hive的界面了

image-20220224215424883

启动一个beeline连接,使用用户名hadoop01

在启动beeline连接hiveserver2的时候,可以像jdbc的连接url一样,指定database

比如beeline -u jdbc:hive2://hadoop01:10000/test_column -n hadoop01

image-20220224215622079

而且在连接url中指定database后,连接了就会自动切换到指定的database上的。

查看界面

image-20220224215637171

还可以启动更多的beeline,在同一个机器上也可以的

image-20220224215748225

在同一个机器上启动两个beeline,使用-n参数区分

每个beeline上查询,然后查看界面

image-20220224215932565

spark thriftserver的配置

使用spark-submit和spark-sql,每次执行一个sql,实际上都会产生一个spark application用于执行spark任务,如果执行的比较多的sql,就会频繁的创建spark application,这样就会在一定程度上耗费资源。为了实现spark application的复用,spark基本上把hive的hiveserver2照搬了过来,产生了 spark thriftserver,在使用thriftserver的时候,就能够复用spark application。

不过生产环境中每个查询因为数据量巨大,而且基本处于独立的查询操作,所以是不会使用thriftserver和hiveserver2的,这在开发中可能用的比较多。

简单点说,spark thriftserver和hiveserver2是一样的。

只需要把/hive/conf/hive-site.xml拷贝到/spark/conf目录下即可

image-20220224220239234

然后启动spark thriftserver即可

在spark的官网文档中(spark-sql模块下)说明spark-thriftserver的脚本start-thriftserver.sh接受和spark-submit一样的参数

通过上面这句话,就基本上可以猜测出来启动thriftserver需要哪些参数了,当然也可以通过help查看

image-20220224220633650

所以可以使用如下命令启动thriftserver

./start-thriftserver.sh --master spark://hadoop01:4040 --jars /hive/lib/mysql-connector-java-8.0.27.jar --driver-class-path /hive/lib/mysql-connector-java-8.0.27.jar

image-20220224220912726

启动后需要手动查看日志

启动出现了异常,提示地址已经被使用了,说白了就是端口冲突,因为hiveserver2还是启动,hiveserver2绑定了10000端口,而spark thriftserver启动也需要绑定10000端口,就冲突了。

所以修改spark thriftserver的端口为10001

image-20220224221136872

当然thriftserver的界面集成到了spark的界面中了,这里的8084应该是无效的

重新启动

image-20220224221528565

启动日志无报错后刷新spark集群的界面

image-20220224221558613

进入application的界面后会多出来两个tab

image-20220224221634321

访问8084界面无响应,说明在/spark/conf/hive-site.xml中配置的界面端口无效

image-20220224221731518

beeline 连接spark thriftserver

使用beeline连接spark thriftserver和使用beeline连接hiveserver2完全相同

使用beeline -u jdbc:hive2://hadoop01:10001/test_column -n sparkbeeline连接

image-20220224222904282

thriftserver和spark-sql对比

thriftserver和spark-sql都能直接执行sql语句,区别在于多个beeline连接同一个thriftserver,共用一个application,而启动多个spark-sql就会启动多个application

比如首先在beeline连接的thriftserver中执行两次sql

image-20220224223122221

刷新spark界面,并没有增加完成的application

image-20220224223213175

停止thriftserver,因为thriftserver占用了全部集群中的两个核心(实际是我分配的核心太少了),thriftserver会自动占用每个driver的一个核心,我配置每个worker只启动一个driver,每个driver只有一个核心,所以thriftserver就占用了全部的核心。

image-20220224223445720

接着启动spar-sql,占用一个核心

使用spark-sql --num-executors 1 --master spark://hadoop01:4040 --jars /hive/lib/mysql-connector-java-8.0.27.jar --driver-class-path /hive/lib/mysql-connector-java-8.0.27.jar启动spark-sql,要求只占用一个executor

image-20220224224017305

可惜的是,即使指定了--num-executors也没有生效,spark-sql又占用了全部核心

image-20220224224134775

接着执行一个sql

执行发现,好像和预期的不一样,也是所有的sql使用同一个application

image-20220224225442338

image-20220224225502995

在启动一个spark-sql

image-20220224225909286

此时查看spark界面,发现是两个application

image-20220224225935745

证明了每个spark-sql实例对应一个application(没有分配到资源请忽略)

接着启动thriftserver

image-20220224230237771

接着启动一个beeline

image-20220224231252714

启动了两个beeline,连接同一个thriftserver,但是却只有一个application

image-20220224231333300

这就是spark-sql与thriftserver最大的区别

spark sql 程序连接thriftserver

使用spark-submit和spark-sql,每次执行一个sql,实际上都会产生一个spark application用于执行spark任务,如果执行的比较多的sql,就会频繁的创建spark application,这样就会在一定程度上耗费资源。为了实现spark application的复用,spark基本上把hive的hiveserver2照搬了过来,产生了 spark thriftserver,在使用thriftserver的时候,就能够复用spark application。

不过生产环境中每个查询因为数据量巨大,而且基本处于独立的查询操作,所以是不会使用thriftserver和hiveserver2的,这在开发中可能用的比较多。

要使用thriftserver就需要在依赖中加入hive-jdbc的依赖(前面说了,spark的thriftserver就是照搬hiveserver2的)

Maven Repository: org.apache.hive ? hive-jdbc ? 3.1.2 (mvnrepository.com)

直接增加会因为无法下载jdk-tools:jdk-toos.jar:1.6报错,无法下载

在实际测试中,这个确实比较恶心,网上有一种解决方案是自己下载依赖,然后使用maven本地安装,然后在加载依赖,经过测试,没用。

我自己的解决方案是不管他,报红就使用排除

        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>${hive.jdbc.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>jdk.tools</groupId>
                    <artifactId>jdk.tools</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

然后在根目录下使用maven命令下载依赖mvn dependency:sources下载源码和依赖,然后重新加载maven项目,此时会把除了jdk.tools之外的依赖加入到项目中

image-20220224013344093

接着就可以开始编码了

import java.sql.DriverManager

object SparkThriftServerApp {

  def main(args: Array[String]): Unit = {
    // 1. 加载驱动
    Class.forName("org.apache.hive.jdbc.HiveDriver")
    // 2. 获取连接,用户名密码如果没有随便写,这里和beeline连接thriftserver是一样的
    val coon = DriverManager getConnection("jdbc:hive2://hadoop01:10000/test_column", "root", "")
    // 3. 编写查询sql
    val pstmt = coon prepareStatement "select * from columns limit 10"
    // 4. 查询
    val rs = pstmt executeQuery()
    // 5. 获取返回结果的元数据信息 --- 表头
    val metaData = rs getMetaData()
    // 6. 使用可变列表存储表头
    var columsArray = List[String]()
    // 7. 循环打印表头,切记从 1 开始,不是从 0 开始
    for(i <- Range(1, metaData getColumnCount) inclusive) {
      columsArray = columsArray :+ (metaData getColumnName i)
      print(s"${metaData getColumnName i}\t")
    }
    println
    // 8. 循环读取数据,也是从 1 开始,不是从 0 开始
    while (rs next()) {
      for (i <- Range(1, columsArray length) inclusive) {
        print(s"${rs getString(i)}\t")
      }
      println
    }
    // 9. 关闭连接
    rs close()
    pstmt close()
    coon close()
  }

}

执行结果如下

image-20220224013717788

也可以在thriftserver的监控界面查看执行的sql

image-20220224013749506

image-20220224013812656

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:39:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:56:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码