我正在运行EMR Spark集群(使用YARN),我正在直接从EMR主机运行Luigi任务。我有一系列依赖于S3中的数据的作业,之后一些SparkSubmitTasks最终会在Redshift中结束。
import luigi
import luigi.format
from luigi.contrib.spark import SparkSubmitTask
from luigi.contrib.redshift import RedshiftTarget
class SomeSparkTask(SparkSubmitTask):
# Stored in /etc/luigi/client.cfg
host = luigi.Parameter(default='host')
database = luigi.Parameter(default='database')
user = luigi.Parameter(default='user')
password = luigi.Parameter(default='password')
table = luigi.Parameter(default='table')
<add-more-params-here>
app = '<app-jar>.jar'
entry_class = '<path-to-class>'
def app_options(self):
return <list-of-options>
def output(self):
return RedshiftTarget(host=self.host, database=self.database, user=self.user, password=self.password,
table=self.table, update_id=<some-unique-identifier>)
def requires(self):
return AnotherSparkSubmitTask(<params>)
我遇到两个主要问题:
1)有时luigi无法确定何时完成SparkSubmitTask - 例如,我会看到luigi提交作业,然后检查YARN,它会说应用程序正在运行,但一旦完成, luigi只是挂起而无法确定作业已完成。
2)如果由于某种原因SparkSubmitTasks能够运行并且上面放置的任务完成Spark作业,则输出任务永远不会运行,并且永远不会创建或填充marker-table。但是,实际的表是在运行的Spark Job中创建的。我是否误解了我应该如何调用RedshiftTarget?
与此同时,我正在尝试熟悉源代码。
谢谢!
答案 0 :(得分:1)
在我的Spark应用程序中放弃使用Luigi,因为我的所有数据现在都流式传输到S3,我只需要一个大的单片应用程序来运行我的所有Spark聚合,这样我就可以利用中间结果/缓存。