6

我有一个通过 google dataproc 创建的 spark 集群。我希望能够使用databricks中的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 种不同的方式来给出它,但我没有成功。

我的问题是:

  1. 是我输入后安装的databricks csv库pyspark --packages com.databricks:spark-csv_2.11:1.2.0
  2. 我可以写一行job.py来导入它吗?
  3. 或者我应该为我的 gcloud 命令提供哪些参数来导入或安装它?
4

2 回答 2

13

简答

如果它出现在论点之后,--packages则不接受的论点排序存在怪癖。要解决此问题,您可以在从 Dataproc 的 CLI 提交时执行以下操作:spark-submitmy_job.py

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 spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0之前添加。.py

长答案

因此,这实际上是与已知缺乏对--jarsin的支持不同的问题gcloud beta dataproc jobs submit pyspark;似乎在 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.

于 2015-10-29T00:49:32.183 回答
5

除了@Dennis。

请注意,如果您需要加载多个外部包,则需要指定自定义转义字符,如下所示:

--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.data‌​bricks:spark-avro_2.10:2.0.1

请注意软件包列表之前的 ^#^。有关gcloud topic escaping更多详细信息,请参阅。

于 2016-07-27T13:44:22.087 回答