2016-03-07 134 views
3

我正在Python中編寫一些ETL流程,對於部分流程使用Hive。根據documentation,Cloudera的impyla客戶端與Impala和Hive都兼容。impyla在連接到HiveServer2時掛起

以我的經驗,客戶一起爲黑斑羚,但掛在我試圖連接到蜂巢:

from impala.dbapi import connect 

conn = connect(host='host_running_hs2_service', port=10000, user='awoolford', password='Bzzzzz') 
cursor = conn.cursor()   <- hangs here 
cursor.execute('show tables') 
results = cursor.fetchall() 
print results 

如果我一步到代碼,當它試圖打開一個會話它掛起(line #873 of hiveserver2.py )。

起初,我懷疑防火牆端口可能會阻塞連接,所以我嘗試使用Java進行連接。令我驚訝的是,這工作:

public class Main { 
    private static String driverName = "org.apache.hive.jdbc.HiveDriver"; 
    public static void main(String[] args) throws SQLException { 
     try { 
      Class.forName(driverName); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
     Connection connection = DriverManager.getConnection("jdbc:hive2://host_running_hs2_service:10000/default", "awoolford", "Bzzzzz"); 
     Statement statement = connection.createStatement(); 
     ResultSet resultSet = statement.executeQuery("SHOW TABLES"); 

     while (resultSet.next()) { 
      System.out.println(resultSet.getString(1)); 
     } 
    } 
} 

由於蜂巢和Python這樣的常用技術,我很好奇,想知道是否有人遇到過這個問題,如果是這樣,你做了什麼來解決這個問題?

版本:

  • 蜂巢1.1.0-cdh5.5.1
  • 的Python 2.7.11 |蟒蛇2.3.0
  • 紅帽6.7
+0

我看到這個「永久掛起」的事情發生在非安全客戶端嘗試連接到安全服務器時。在這種情況下,服務器端處理程序線程在處理來自客戶端的消息時可能會崩潰,然後它可以發回任何內容。客戶將因此無限期地等待。 – ozw1z5rd

回答

0

我試過的Dropbox的PyHive包它完美地工作:

from pyhive import hive 
conn = hive.Connection(host="host_running_hs2_service", port=10000, username="awoolford") 

cursor = conn.cursor() 
cursor.execute("SHOW TABLES") 
for table in cursor.fetchall(): 
    print table 

我不知道爲什麼Impyla客戶端沒有工作,但至少我們可以前進。

+0

但我輸入「from pyhive import hive」時出現錯誤。錯誤是「ImportError:No module named builtins」。可能python在Pyhive包中找不到hive.py。我該怎麼辦? – Amir

+0

我已經解決了這個導入問題。對於那些面對它: http://stackoverflow.com/questions/39291533/why-importerror-no-module-named-builtins-appears-after-importing-hive-from-py – Amir

1
/path/to/bin/hive --service hiveserver2 --hiveconf hive.server2.authentication=NOSASL 

from impala.dbapi import connect 

conn = connect(host='host_running_hs2_service', port=10000, user='awoolford', password='Bzzzzz', auth_mechanism='NOSASL') 
cursor = conn.cursor() 
cursor.execute('show tables') 
results = cursor.fetchall() 
print results 
+0

是的,這對我工作: --hiveconf hive.server2.authentication = NOSASL。在我的配置中,身份驗證設置爲NONE。 – ozw1z5rd