【发布时间】:2021-04-08 21:50:22
【问题描述】:
我正在尝试在 Python for 循环中执行写入 BigTable 的 Pyspark 语句,这会导致以下错误(使用 Dataproc 提交的作业)。任何未正确关闭的客户端(如建议的here),如果是,有什么方法可以在 Pyspark 中这样做?
请注意,每次使用新的 Dataproc 作业手动重新执行脚本都可以正常工作,因此作业本身是正确的。
感谢您的支持!
Pyspark 脚本
from pyspark import SparkContext
from pyspark.sql import SQLContext
import json
sc = SparkContext()
sqlc = SQLContext(sc)
def create_df(n_start,n_stop):
# Data
row_1 = ['a']+['{}'.format(i) for i in range(n_start,n_stop)]
row_2 = ['b']+['{}'.format(i) for i in range(n_start,n_stop)]
# Spark schema
ls = [row_1,row_2]
schema = ['col0'] + ['col{}'.format(i) for i in range(n_start,n_stop)]
# Catalog
first_col = {"col0":{"cf":"rowkey", "col":"key", "type":"string"}}
other_cols = {"col{}".format(i):{"cf":"cf", "col":"col{}".format(i), "type":"string"} for i in range(n_start,n_stop)}
first_col.update(other_cols)
columns = first_col
d_catalogue = {}
d_catalogue["table"] = {"namespace":"default", "name":"testtable"}
d_catalogue["rowkey"] = "key"
d_catalogue["columns"] = columns
catalog = json.dumps(d_catalogue)
# Dataframe
df = sc.parallelize(ls, numSlices=1000).toDF(schema=schema)
return df,catalog
for i in range(0,2):
N_step = 100
N_start = 1
N_stop = N_start+N_step
data_source_format = "org.apache.spark.sql.execution.datasources.hbase"
df,catalog = create_df(N_start,N_stop)
df.write\
.options(catalog=catalog,newTable= "5")\
.format(data_source_format)\
.save()
N_start += N_step
N_stop += N_step
Dataproc 作业
gcloud dataproc jobs submit pyspark <my_script>.py \
--cluster $SPARK_CLUSTER \
--jars <path_to_jar>/bigtable-dataproc-spark-shc-assembly-0.1.jar \
--region=us-east1
错误
...
ERROR com.google.bigtable.repackaged.io.grpc.internal.ManagedChannelOrphanWrapper: *~*~*~ Channel ManagedChannelImpl{logId=41, target=bigtable.googleapis.com:443} was not shutdown properly!!! ~*~*~*
Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.
...
【问题讨论】:
-
你尝试过其他语言吗?喜欢这里的示例github.com/GoogleCloudPlatform/cloud-bigtable-examples/blob/…
-
您能提供完整的 PySpark 代码吗?我可以帮助繁殖。
-
@大港。感谢您提出帮助。是的,我已经在 Scala 中运行了整个教程,但没有测试循环:stackoverflow.com/questions/65483442/…
-
@Dagang:我添加了完整的 Pyspark 代码。谢谢!
-
您使用的是最新版本的 gcloud 吗?如果没有,请尝试更新到最新版本。它看起来类似于最近修复的这个问题。 github.com/googleapis/java-bigtable-hbase/issues/2504cloud.google.com/sdk/gcloud/reference/components/update
标签: google-cloud-platform hbase google-cloud-dataproc google-cloud-bigtable