spark的thriftservr的高可用

triftserver是基于jdbc的一个spark的服务,可以做web查询,多客户端访问,但是thriftserver没有高可用,服务挂掉后就无法在访问,所有使用注册到zk的方式来实现高可用

一.版本

scala:2.11

spark:2.2.1

spark的源码地址:https://archive.apache.org/dist/spark/

参考:http://liguo86.com/2017/09/25/spark-thriftserver-ha%E6%94%AF%E6%8C%81/

二.源码添加zk注册

1.下载spark对应的源码版本,找到sql文件下的spar-hive-thriftserver模块,添加到maven中

2.服务启动Hive,ThriftServer2是个伴身类,hivethriftserver的实现,init与start方法

3.在start方法内进行zk的注册

开启hiveserver2的注册服务

4.在父类Hiveserver2中添加需要上述反射执行的方法addServerInstanceToZooKeeper,

三、源码编译

注意事项:spark2.2.1的hive-thriftserver的缺少依赖,导致里面的好包报红,需要添加一下依赖

<dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-http</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-continuation</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlet</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-servlets</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-proxy</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-client</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-util</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-security</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-plus</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.eclipse.jetty</groupId>
      <artifactId>jetty-server</artifactId>
      <version>${jetty.version}</version>
      <scope>provided</scope>
    </dependency>

<dependency>
  <groupId>org.spark-project.hive</groupId>
  <artifactId>hive-service</artifactId>
  <version>1.2.1.spark2</version>
</dependency>
四、上传jar到spark的jar目录,zk注册测试
1.在spark的conf目录hive-site.xml添加配置

//添加的代码中,start方法的是否开启动态服务注册
<property>
 <name>hive.server2.support.dynamic.service.discovery</name>
 <value>true</value>
</property>
//需要注册的zk命名空间
<property>
 <name>hive.server2.zookeeper.namespace</name>
 <value>hiveserver2_zk</value>
</property>

//zk地址

<property
 <name>hive.zookeeper.quorum</name>
 <value>cdh1:2181,cdh2:2181,cdh3:2181</value>
</property>

<property>
 <name>hive.zookeeper.client.port</name>
 <value>2181</value>
</property>

<property>
 <name>hive.server2.thrift.bind.host</name>
 <value>cdh1</value>
</property>
设置maven的编译内存
export MAVEN_OPTS="-Xmx4g -XX:ReservedCodeCacheSize=1024m -XX:MaxPermSize=256m" 

mvn编译命令 可以依赖的handoop版本2.6.
mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0  -Phive -Phive-thriftserver -Dscala-2.11 -DskipTests clean package 
为了快一点我只单独编译的hive-thriftserver模块,是成功的,在target下找到11

2.上传jar到jar目录

3.启动测试

先启动一个端口为10002

sbin/start-thriftserver.sh \
--master yarn \
--conf spark.driver.memory=1G \
--executor-memory 1G \
--num-executors 1 \
--hiveconf hive.server2.thrift.port=10002

在启动一个端口为10003,看到地址信息已经注册到zk了,yarn也有两个服务

 五、连接测试

JDBC连接

JDBC连接的URL格式为:

jdbc:hive2://<zookeeper quorum>/<dbName>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2

其中:

<zookeeper quorum> 为Zookeeper的集群链接串,如zkNode1:2181,zkNode2:2181,zkNode3:2181

<dbName> 为Hive数据库,默认为default

serviceDiscoveryMode=zooKeeper 指定模式为zooKeeper

zooKeeperNamespace=hiveserver2 指定ZK中的nameSpace,即参数hive.server2.zookeeper.namespace所定义,我定义为hiveserver2_zk

报错:

我使用:beeline -u "jdbc:hive2://192.168.121.12:2181/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk;transportMode=http;httpPath=cliservice"

与beeline 的 !connect jdbc:hive2://192.168.121.12:2181/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk;transportMode=http;httpPath=cliservice

两种方式都不行,可能是hive版本的原因

报错误:Error: Could not open client transport for any of the Server URI's in ZooKeeper: Unable to read HiveServer2 configs from ZooKeeper (state=08S01,code=0)
Beeline version 1.1.0-cdh5.14.2 by Apache Hive

解决方案:

1.我忘记了使用的是hive的beeline,应该使用spark的beeline

2.使用beeline -u "jdbc:hive2://192.168.121.12:2181/default;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk;transportMode=jdbc;httpPath=cliservice"

3.看到去连接的是10002这个端口

在开启一个beeline窗口则连接的是10003这个端口,负载均衡的

3.杀掉一个端口10002,10003可以访问

 在beeline客户端下需要重新输入命令,在做web查询时需要让其先访问zk中的地址,在拿到可以用的hiveserver2的地址,在去访问
posted @ 2020-02-14 15:05  夜半钟声到客船  阅读(1525)  评论(0编辑  收藏  举报