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的地址,在去訪問