Hive 在Datalab中查询配置单元表时出现问题

Hive 在Datalab中查询配置单元表时出现问题,hive,google-cloud-dataproc,google-cloud-datalab,Hive,Google Cloud Dataproc,Google Cloud Datalab,我已经创建了一个dataproc集群,并使用更新的init操作来安装datalab 除了从Datalab笔记本查询配置单元表时遇到 hc.sql(“””select * from invoices limit 10”””) "java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found" exception 创建集群 datalab-updated

我已经创建了一个dataproc集群,并使用更新的init操作来安装datalab

除了从Datalab笔记本查询配置单元表时遇到

hc.sql(“””select * from invoices limit 10”””)

"java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found" exception
创建集群 datalab-updated.sh 在datalab笔记本中 更新

spark._jsc.hadoopConfiguration().set('fs.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem')
spark._jsc.hadoopConfiguration().set('fs.gs.auth.service.account.enable', 'true')
spark._jsc.hadoopConfiguration().set('google.cloud.auth.service.account.json.keyfile', "~/Downloads/my-exercise-project-f47054fc6fd8.json")
更新2(datalab-updated.sh)
如果要在datalab中使用配置单元,必须启用配置单元元存储

--properties hive:hive.metastore.warehouse.dir=gs://$PROJECT-warehouse/datasets \
--metadata "hive-metastore-instance=$PROJECT:$REGION:hive-metastore"
在你的情况下


--properties hive:hive.metastore.warehouse.dir=gs://$PROJECT-warehouse/datasets \
--metadata "hive-metastore-instance=$PROJECT:$REGION:hive-metastore"

hc.sql(“””CREATE EXTERNAL TABLE IF NOT EXISTS INVOICES
      (SubmissionDate DATE, TransactionAmount DOUBLE, TransactionType STRING)
      STORED AS PARQUET
      LOCATION 'gs://$PROJECT-warehouse/datasets/invoices’”””)
并确保添加以下设置以启用GCS

sc._jsc.hadoopConfiguration().set('fs.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem')

# This is required if you are using service account and set true, 
sc._jsc.hadoopConfiguration().set('fs.gs.auth.service.account.enable', 'false')
sc._jsc.hadoopConfiguration().set('google.cloud.auth.service.account.json.keyfile', "/path/to/keyfile")

# Following are required if you are using oAuth
sc._jsc.hadoopConfiguration().set('fs.gs.auth.client.id', 'YOUR_OAUTH_CLIENT_ID')
sc._jsc.hadoopConfiguration().set('fs.gs.auth.client.secret', 'OAUTH_SECRET')
应使用在Dataproc群集上安装Datalab:

gcloud dataproc集群创建${CLUSTER}\
--图像版本=1.3\
--scopes云平台\
--初始化操作=gs://dataproc初始化操作/datalab/datalab.sh
此配置单元与数据实验室中的地面军事系统开箱即用后:

从pyspark.sql导入HiveContext
hc=HiveContext(sc)
sql(““在默认情况下显示表”).SHOW()
输出:

+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
+--------+---------+-----------+
DataFrame[]
DataFrame[SubmissionDate: date, TransactionAmount: double, TransactionType: string]
使用Datalab中的配置单元在GCS上创建外部表:

hc.sql(““”如果不存在,则创建外部表
(SubmissionDate日期,TransactionMount双精度,TransactionType字符串)
作为拼花地板储存
位置“gs:///数据集/发票”“)
输出:

+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
+--------+---------+-----------+
DataFrame[]
DataFrame[SubmissionDate: date, TransactionAmount: double, TransactionType: string]
在Datalab中使用配置单元查询GCS表:

hc.sql(“'SELECT*FROM invoices LIMIT 10”“”)
输出:

+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
+--------+---------+-----------+
DataFrame[]
DataFrame[SubmissionDate: date, TransactionAmount: double, TransactionType: string]

豪伊,谢谢你的回复。但是,即使在设置了上述GCS设置以及您的其他元数据/属性之后,它也不适用于我。我下载了json服务帐户文件。这个JSON密钥文件需要放在哪里?我在我的本地机器上假设..正确吗?还是相同的异常吗?Igor..谢谢您的回复。正如我所说,创建外部表不是问题,查询表是问题。下面的方法不起作用。hc.sql(““select*from invoices limit 10”“”).show()“java.lang.ClassNotFoundException:Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found”Exception添加查询执行结果-如果使用Datalab init操作,它仍然可以立即运行。谢谢Igor。我看到您正在使用1.3版。您能检查一下它是否适用于“1.4-debian9”版本吗?刚刚检查过,它也适用于Dataproc 1.4。在您的情况下,您可能需要在
datalab updated.sh
之前指定
connectors.sh
init action,因为connectors init action将更改connectors jar名称。感谢您的帮助。我不得不说你的命令奏效了。我对我的datalab脚本的自定义设置有问题。你能发布datalab-updated.sh的全部内容吗?您是在安装conda还是pip?仅供参考,在dataproc上运行时,您不需要运行
spark.\u jsc.hadoopConfiguration()
命令,事实上它们可能只会导致问题谢谢Dennis。我刚刚用datalab.sh上的更改更新了(更新2)我的原始帖子。我不会通过conda或pip安装任何新软件包。