Pyspark 将BigQuery表读入GCPDataproc上的Spark RDD中,为什么newAPIHadoopRDD中缺少该类

Pyspark 将BigQuery表读入GCPDataproc上的Spark RDD中,为什么newAPIHadoopRDD中缺少该类,pyspark,google-bigquery,google-cloud-dataproc,Pyspark,Google Bigquery,Google Cloud Dataproc,大约一个多星期前,我能够将BigQuery表读入RDD,以便在Dataproc集群上运行Spark作业,使用指南at作为模板。从那时起,我现在遇到了缺少类的问题,尽管没有对指南进行任何更改 我曾试图找到丢失的类com/google/cloud/hadoop/repacked/bigquery/com/google/common/collect/ImmutableList,尽管我找不到任何关于该类是否已从gs://hadoop lib/bigquery/bigquery-connector-had

大约一个多星期前,我能够将BigQuery表读入RDD,以便在Dataproc集群上运行Spark作业,使用指南at作为模板。从那时起,我现在遇到了缺少类的问题,尽管没有对指南进行任何更改

我曾试图找到丢失的类com/google/cloud/hadoop/repacked/bigquery/com/google/common/collect/ImmutableList,尽管我找不到任何关于该类是否已从gs://hadoop lib/bigquery/bigquery-connector-hadoop2-latest.jar中排除的信息

作业提交请求如下所示:

gcloud dataproc jobs submit pyspark \
--cluster $CLUSTER_NAME \
--jars gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar \
--bucket gs://$BUCKET_NAME \
--region europe-west2 \
--py-files $PYSPARK_PATH/main.py
conf = {
    'mapred.bq.project.id': project_id,
    'mapred.bq.gcs.bucket': gcs_staging_bucket,
    'mapred.bq.temp.gcs.path': input_staging_path,
    'mapred.bq.input.project.id': bq_input_project_id,
    'mapred.bq.input.dataset.id': bq_input_dataset_id,
    'mapred.bq.input.table.id': bq_input_table_id,
}
PySpark代码在以下点中断:

bq_table_rdd = spark_context.newAPIHadoopRDD(
'com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat',
'org.apache.hadoop.io.LongWritable',
'com.google.gson.JsonObject',
conf=conf)
其中conf是一个Python dict,其结构如下:

gcloud dataproc jobs submit pyspark \
--cluster $CLUSTER_NAME \
--jars gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar \
--bucket gs://$BUCKET_NAME \
--region europe-west2 \
--py-files $PYSPARK_PATH/main.py
conf = {
    'mapred.bq.project.id': project_id,
    'mapred.bq.gcs.bucket': gcs_staging_bucket,
    'mapred.bq.temp.gcs.path': input_staging_path,
    'mapred.bq.input.project.id': bq_input_project_id,
    'mapred.bq.input.dataset.id': bq_input_dataset_id,
    'mapred.bq.input.table.id': bq_input_table_id,
}
当我的输出表明代码已达到上述spark_context.newAPIHadoopRDD函数时,以下内容将打印到stdout:

class com.google.cloud.hadoop.repackaged.bigquery.com.google.common.flogger.backend.system.DefaultPlatform: cannot cast result of calling 'com.google.cloud.hadoop.repackaged.gcs.com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance' to 'com.google.cloud.hadoop.repackaged.bigquery.com.google.common.flogger.backend.system.BackendFactory': java.lang.ClassCastException: Cannot cast com.google.cloud.hadoop.repackaged.gcs.com.google.common.flogger.backend.log4j.Log4jBackendFactory to com.google.cloud.hadoop.repackaged.bigquery.com.google.common.flogger.backend.system.BackendFactory

Traceback (most recent call last):
  File "/tmp/0af805a2dd104e46b087037f0790691f/main.py", line 31, in <module>
    sc)
  File "/tmp/0af805a2dd104e46b087037f0790691f/extract.py", line 65, in bq_table_to_rdd
    conf=conf)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/context.py", line 749, in newAPIHadoopRDD
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 63, in deco
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: java.lang.NoClassDefFoundError: com/google/cloud/hadoop/repackaged/bigquery/com/google/common/collect/ImmutableList
class com.google.cloud.hadoop.repackaged.bigquery.com.google.common.flogger.backend.system.DefaultPlatform:无法将调用'com.google.cloud.hadoop.repackaged.gcs.com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance'的结果强制转换为'com.google.cloud.hadoop.repacked.bigquery.com.google.common.flogger.backend.system.BackendFactory':java.lang.ClassCastException:无法将com.google.cloud.hadoop.repacked.gcs.com.google.common.flogger.backend.log4j.Log4jBackendFactory转换为com.google.cloud.hadoop.repacked.bigquery.com.common.flogger.backend.system.BackendFactory
回溯(最近一次呼叫最后一次):
文件“/tmp/0af805a2dd104e46b087037f0790691f/main.py”,第31行,在
sc)
文件“/tmp/0af805a2dd104e46b087037f0790691f/extract.py”,第65行,在bq_表_至_rdd中
conf=conf)
文件“/usr/lib/spark/python/lib/pyspark.zip/pyspark/context.py”,第749行,在newAPIHadoopRDD中
文件“/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,第1257行,在__
文件“/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第63行,deco格式
文件“/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py”,第328行,在get_return_值中
py4j.protocol.Py4JJavaError:调用z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD时出错。
:java.lang.NoClassDefFoundError:com/google/cloud/hadoop/repacked/bigquery/com/google/common/collect/ImmutableList

直到上周,这还不是一个问题。我担心即使是GCP网站上的hello world示例在短期内也不稳定。如果有人能对这个问题有所了解,我们将不胜感激。谢谢。

我重现了这个问题

$gcloud dataproc clusters创建测试集群--映像版本=1.4
$gcloud dataproc作业提交PypSpark字数\u bq.py\
--群集测试群集\
--jars=gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-latest.jar
然后发生了完全相同的错误:

py4j.protocol.Py4JJavaError:调用z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD时出错。
:java.lang.NoClassDefFoundError:com/google/cloud/hadoop/repacked/bigquery/com/google/common/collect/ImmutableList
我注意到8月23日发布了一个新版本1.0.0:

$gsutil ls-l gs://hadoop lib/bigquery/bigquery-connector-hadoop2-**
...
4038762 2018-10-03T20:59:35Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-0.13.8.jar
4040566 2018-10-19T23:32:19Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-0.13.9.jar
14104522 2019-06-28221:08:57Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-1.0.0-RC1.jar
14104520 2019-07-01T20:38:18Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-1.0.0-RC2.jar
141492152019-08-23T21:08:03Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-1.0.0.jar
141492152019-08-24T00:27:49Z gs://hadoop lib/bigquery/bigquery-connector-hadoop2-latest.jar
然后我尝试了0.13.9版,它成功了:

$gcloud dataproc作业提交pyspark字数\u bq.py\
--群集测试群集\
--jars=gs://hadoop-lib/bigquery/bigquery-connector-hadoop2-0.13.9.jar

这是1.0.0的一个问题,GitHub上已经有一个文件。我们将修复它并改进测试。

您使用哪个Dataproc版本?可以添加用于创建群集的命令吗?默认情况下,Dataproc版本是最新的:gcloud Dataproc clusters create$cluster\u NAME \--region$LOCATION--bucket$bucket\u NAME \--主引导磁盘大小15GB \--主引导磁盘类型pd standard \--工作引导磁盘大小10GB \--工作引导磁盘类型pd standard \--num master local ssd 1 \--num worker local ssd 1 \--单节点\--master machine type n1-standard-2 \--worker machine type n1-standard-2\谢谢。问题解决了。我试图检查这个云存储目录,因为我怀疑有更新,尽管公共用户没有对hadoop lib bucket的读取权限,所以我无法确定将这个jar修复到哪个版本。是否有方法将jar文件添加到可以从Jupyter notebook运行的作业提交函数中。我知道你可以通过初始化.sh文件。我确实找到了一些关于
jar\u文件\u uris:[]
的文档,但我真的不明白需要在哪里添加参数。