2017-06-20 128 views
0

我正嘗試使用Python jaydebeapi連接到Impala數據庫。我在兩次調用連接類時遇到了JVM問題。請在我的連接類和Sql_Query課下面找到。Python JDBC連接拋出JVM問題

Connection_Class:

import jaydebeapi 
import jpype 
import datetime 
import ConfigParser 
from fileinput import close 

config = ConfigParser.RawConfigParser () 
config.read ('ConfigFile.properties') 


def Impala_Connection(sql_query): 
    conn_impala = None 


    try: 
     jars_location = config.get ('Jars_info' , 'Jars_Location') 
     args = "-Djava.class.path=%s" % jars_location 
     jvm_path = jpype.getDefaultJVMPath () 
     jpype.startJVM (jvm_path , args) 

    except IOError as err: 

     print('An error occurred trying to read the file:{}".format(e)') 
     sql_query.close () 
    else: 

     try: 

      print "Start executing: " + sql_query + " at " + str (
      datetime.datetime.now ().strftime ("%Y-%m-%d %H:%M")) + "\n" 
      url = config.get ('Jars_info' , 'Jdbc_Url') 
      Jdbc_Driver_Class = config.get ('Jars_info' , 'Jdbc_Driver_Class') 
      username = config.get ('Jars_info' , 'username') 
      password = config.get ('Jars_info' , 'password') 
      jdbc_jar_location = config.get ('Jars_info' , 'Jdbc_Jar_Location') 
      conn_impala = jaydebeapi.connect (Jdbc_Driver_Class , url , {username , password} , jdbc_jar_location) 
      curs = conn_impala.cursor () 
      sql_execution = curs.execute (sql_query) 
      data = curs.fetchall (sql_execution) 
      curs.close() 
      return (data) 

     except Exception, err: 
      print("Something went wrong with Impala Connection: {}".format(err)) 
     finally: 
      close(conn_impala) 
      jpype.shutdownJVM() 

Sql_Query_Class:

from pyspark import SparkConf, SparkContext 
from com.my.common_funcitons.Impala_Query_Executor import Impala_Connection 
import sys 

conf = SparkConf().setAppName("pyspark") 
sc = SparkContext(conf=conf) 


tbl_name = sys.argv[1] 
refid = sys.argv[2] 
metadata_Query="SELECT * from Metadata_Table TABLE_NAME='%s' and TEMP.unique_id=%s" %(tbl_name,refid) 
metadata_info=Impala_Connection(metadata_Query) 

if len(metadata_info) == 0: 
    new_tbl_name = tbl_name+"_%" 
    metadata_Query="SELECT * from Metadata_Table TABLE_NAME='%s' and TEMP.unique_id=%s"" (new_tbl_name,refid) 
    metadata_info=Impala_Connection(metadata_Query) 
    for row in metadata_info: 
     metadata_no_of_columns=row[0] 
     metadata_table_id=row[1] 

    else: 

    for row in metadata_info: 
     metadata_no_of_columns=row[0] 
     metadata_table_id=row[1] 

我有一個表,table_000兩點式表名的,所以如果我得到空數據我需要添加table_%,並要求相同。當我打電話來自同一班的Impala連接時,我得到JVM問題,請找到下面的錯誤堆棧:

File "/usr/lib64/python2.7/site-packages/jpype/_core.py", line 50, in startJVM 
    _jpype.startup(jvm, tuple(args), True) 
RuntimeError: Unable to start JVM at native/common/jp_env.cpp:78 

我嘗試在final類中添加JVMshutdown,但仍然面臨問題。請向我推薦一個解決方案。

+0

你*有*安裝了兼容的JVM,對吧? –

+0

嗨戈爾湯普森雅JVM安裝其工作正常,如果我只打一次函數,如果我再次調用它從相同的功能,我面臨的問題 – Rahul

回答

0

使用jpype.isJVMStarted()函數,我可以檢查jvm是否已啓動或沒有解決我的問題。