在来自 google-dataproc 的 Spark 集群中的 pyspark 作业中使用外部库
use an external library in pyspark job in a Spark cluster from google-dataproc
我有一个通过 google dataproc 创建的 spark 集群。我希望能够使用数据块中的 csv 库(参见 https://github.com/databricks/spark-csv)。所以我先是这样测试的:
我与集群的主节点启动了一个 ssh 会话,然后我输入:
pyspark --packages com.databricks:spark-csv_2.11:1.2.0
然后它启动了一个 pyspark shell,我在其中输入:
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('gs:/xxxx/foo.csv')
df.show()
它奏效了。
我的下一步是使用以下命令从我的主机启动此作业:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> my_job.py
但是这里它不起作用,我得到一个错误。我想是因为我没有给出 --packages com.databricks:spark-csv_2.11:1.2.0
作为参数,但我尝试了 10 种不同的方式来给出它,但我没有成功。
我的问题是:
- 我输入
pyspark --packages com.databricks:spark-csv_2.11:1.2.0
后是否安装了 databricks csv 库
- 我可以在
job.py
中写一行以便导入吗?
- 或者我应该为我的 gcloud 命令提供什么参数来导入或安装它?
简答
如果 --packages
位于 my_job.py
参数之后,则 spark-submit
不接受参数的排序。要解决此问题,您可以在从 Dataproc 的 CLI 提交时执行以下操作:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \
--properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py
基本上,只需在命令中的 .py
文件之前添加 --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0
。
长答案
因此,这实际上是一个不同于 gcloud beta dataproc jobs submit pyspark
中已知的 --jars
不支持的问题;似乎没有 Dataproc 明确地将 --packages
识别为特殊的 spark-submit
级标志,它会尝试将其传递给 在 应用程序参数之后,以便 spark-submit 允许--packages
作为应用程序参数失败,而不是将其作为提交级别选项正确解析。实际上,在 SSH 会话中,以下 不 工作:
# Doesn't work if job.py depends on that package.
spark-submit job.py --packages com.databricks:spark-csv_2.11:1.2.0
但是切换参数的顺序确实再次起作用,即使在 pyspark
的情况下,两种顺序都起作用:
# Works with dependencies on that package.
spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py
pyspark job.py --packages com.databricks:spark-csv_2.11:1.2.0
pyspark --packages com.databricks:spark-csv_2.11:1.2.0 job.py
因此,尽管 spark-submit job.py
应该是之前调用 pyspark job.py
的所有内容的直接替代品,但像 --packages
这样的东西在解析顺序上的差异意味着它实际上并不是100% 兼容迁移。这可能是 Spark 方面需要跟进的事情。
无论如何,幸运的是有一个解决方法,因为 --packages
只是 Spark 属性 spark.jars.packages
的另一个别名,而且 Dataproc 的 CLI 支持属性很好。因此,您只需执行以下操作:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \
--properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py
请注意 --properties
必须位于 之前 my_job.py
,否则它将作为应用程序参数而不是作为配置标志发送。希望对你有用!请注意,SSH 会话中的等效项是 spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py
.
除了@Dennis。
注意,如果你需要加载多个外部包,你需要像这样指定一个自定义转义字符:
--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.databricks:spark-avro_2.10:2.0.1
注意包列表前的^#^。
有关详细信息,请参阅 gcloud topic escaping
。
我有一个通过 google dataproc 创建的 spark 集群。我希望能够使用数据块中的 csv 库(参见 https://github.com/databricks/spark-csv)。所以我先是这样测试的:
我与集群的主节点启动了一个 ssh 会话,然后我输入:
pyspark --packages com.databricks:spark-csv_2.11:1.2.0
然后它启动了一个 pyspark shell,我在其中输入:
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('gs:/xxxx/foo.csv')
df.show()
它奏效了。
我的下一步是使用以下命令从我的主机启动此作业:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> my_job.py
但是这里它不起作用,我得到一个错误。我想是因为我没有给出 --packages com.databricks:spark-csv_2.11:1.2.0
作为参数,但我尝试了 10 种不同的方式来给出它,但我没有成功。
我的问题是:
- 我输入
pyspark --packages com.databricks:spark-csv_2.11:1.2.0
后是否安装了 databricks csv 库
- 我可以在
job.py
中写一行以便导入吗? - 或者我应该为我的 gcloud 命令提供什么参数来导入或安装它?
简答
如果 --packages
位于 my_job.py
参数之后,则 spark-submit
不接受参数的排序。要解决此问题,您可以在从 Dataproc 的 CLI 提交时执行以下操作:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \
--properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py
基本上,只需在命令中的 .py
文件之前添加 --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0
。
长答案
因此,这实际上是一个不同于 gcloud beta dataproc jobs submit pyspark
中已知的 --jars
不支持的问题;似乎没有 Dataproc 明确地将 --packages
识别为特殊的 spark-submit
级标志,它会尝试将其传递给 在 应用程序参数之后,以便 spark-submit 允许--packages
作为应用程序参数失败,而不是将其作为提交级别选项正确解析。实际上,在 SSH 会话中,以下 不 工作:
# Doesn't work if job.py depends on that package.
spark-submit job.py --packages com.databricks:spark-csv_2.11:1.2.0
但是切换参数的顺序确实再次起作用,即使在 pyspark
的情况下,两种顺序都起作用:
# Works with dependencies on that package.
spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py
pyspark job.py --packages com.databricks:spark-csv_2.11:1.2.0
pyspark --packages com.databricks:spark-csv_2.11:1.2.0 job.py
因此,尽管 spark-submit job.py
应该是之前调用 pyspark job.py
的所有内容的直接替代品,但像 --packages
这样的东西在解析顺序上的差异意味着它实际上并不是100% 兼容迁移。这可能是 Spark 方面需要跟进的事情。
无论如何,幸运的是有一个解决方法,因为 --packages
只是 Spark 属性 spark.jars.packages
的另一个别名,而且 Dataproc 的 CLI 支持属性很好。因此,您只需执行以下操作:
gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \
--properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py
请注意 --properties
必须位于 之前 my_job.py
,否则它将作为应用程序参数而不是作为配置标志发送。希望对你有用!请注意,SSH 会话中的等效项是 spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py
.
除了@Dennis。
注意,如果你需要加载多个外部包,你需要像这样指定一个自定义转义字符:
--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.databricks:spark-avro_2.10:2.0.1
注意包列表前的^#^。
有关详细信息,请参阅 gcloud topic escaping
。