Apache spark Spark on Google Cloud Dataproc作业在最后阶段失败

Apache spark Spark on Google Cloud Dataproc作业在最后阶段失败,apache-spark,pyspark,google-cloud-dataproc,Apache Spark,Pyspark,Google Cloud Dataproc,我在Dataproc上使用Spark cluster,但我的作业在处理结束时失败 我的数据源是谷歌云存储上csv格式的文本日志文件(总容量为3.5TB,5000个文件) 处理逻辑如下: 将文件读取到数据帧(模式[“时间戳”,“消息]) 将所有消息分组到1秒的窗口中 将管道[Tokenizer->HashingTF]应用于每个分组消息,提取单词及其频率,以构建特征向量 在地面军事系统上保存带有时间线的要素向量 app) s=re.sub('\[.\]','IDTAG',s) 如果s='': s

我在Dataproc上使用Spark cluster,但我的作业在处理结束时失败

我的数据源是谷歌云存储上csv格式的文本日志文件(总容量为3.5TB,5000个文件)

处理逻辑如下:

  • 将文件读取到数据帧(模式[“时间戳”,“消息])
  • 将所有消息分组到1秒的窗口中
  • 将管道[Tokenizer->HashingTF]应用于每个分组消息,提取单词及其频率,以构建特征向量
  • 在地面军事系统上保存带有时间线的要素向量
<我的问题是,在小的数据子集(比如10个文件)的处理上工作得很好,但是当我在所有文件上运行它时,它最后都会出错,比如“容器被超过了内存极限的纱线所杀死。25 GB的24 GB物理内存。考虑升压火花。执行器。内存开销。”

我的集群有25个工人,拥有n1-highmem-8台机器。所以我在谷歌上搜索这个错误,并将“spark.Thread.executor.memoryOverhead”参数增加到6500MB

现在我的spark作业仍然失败,但出现错误“由于阶段失败而中止作业:4293个任务的序列化结果的总大小(1920.0 MB)大于spark.driver.maxResultSize(1920.0 MB)”

我是spark的新手,我相信我在配置级别或代码中做了一些错误的事情。如果你能帮我把这些东西清理干净,那就太好了

以下是我的spark任务代码:

导入日志
导入字符串
从日期时间导入日期时间
进口Pypark
进口稀土
从pyspark.sql导入SparkSession
从pyspark.ml.feature导入哈希、IDF、标记器
从pyspark.ml导入管道
从pyspark.sql.types导入StructType,StructField
从pyspark.sql.types导入DoubleType、IntegerType、StringType、TimestampType、ArrayType
从pyspark.sql导入函数为F
logging.basicConfig(级别=logging.INFO)
logger=logging.getLogger(_名称__)
#常数
NOW=datetime.NOW().strftime(“%Y%m%d%H%m%S”)
开始日期='2016-01-01'
结束日期='2016-03-01'
sc=pyspark.SparkContext()
火花=火花会话\
建筑商先生\
.appName(“LogsVectorizer”)\
.getOrCreate()
spark.conf.set('spark.sql.shuffle.partitions',10000)
info(“在{}开始日志处理…”格式(现在))
#要读取/写入位置的文件名
logs_fn='gs://databucket/csv/*'
vectors_fn='gs://databucket/vectors_out{}'。格式(现在)
pipeline_fn='gs://databucket/pipeline_vectors\u out{}'。格式(现在)
model_fn='gs://databucket/model_vectors\u out{}'。格式(现在)
#用于构建数据框架的CSV数据架构
schema=StructType([
StructField(“时间戳”,StringType()),
StructField(“消息”,StringType())])
#清除日志字段中字符串的帮助程序
def清洁_字符串:
尝试:
#删除ID(如:app[2352]->app)
s=re.sub('\[.\]','IDTAG',s)
如果s='':
s=‘空’
例外情况除外,如e:
打印(“跳过字符串,异常为{}”。格式(e))
返回s
def规格化_字符串:
尝试:
#删除标点符号
s=re.sub('[{}]'.format(re.escape(string.标点)),'',s)
#删除数字
s=re.sub('\d*','',s)
#删除多余的空格
s=''.join(s.split())
例外情况除外,如e:
打印(“跳过字符串,异常为{}”。格式(e))
返回s
def管路分离器(管路):
line=line.split(',')
时间戳=行[0]
完整消息=''.join(第[1:]行)
完整消息=规范化字符串(清理字符串(完整消息))
返回[时间戳,完整消息]
#从csv中读取行,拆分为最新消息
#将CSV读取到DataFrame并清除其字段
logger.info(“将CSV读取到DF…”)
logs\u csv=sc.textFile(logs\u fn)
logs_csv=logs_csv.map(lambda行:行拆分器(行)).toDF(模式)
#只为我们的约会间隔保留行
logger.info(“按日期筛选…”)

logs\u csv=logs\u csv.filter((logs\u csv.timestamp>START\u DATE)和(logs\u csv.timestamp
spark.driver.maxResultSize
是驱动程序大小的问题,在Dataproc中,驱动程序在主节点上运行

默认情况下,主机内存的1/4分配给驱动程序,1/2分配给
spark.Driver.maxResultSize
(最大的RDD spark将允许您
.collect()


我猜
Tokenizer
HashingTF
正在移动“元数据”通过与键空间大小相同的驱动程序。要增加允许的大小,您可以增加
spark.driver.maxResultSize
,但也可以增加
spark.driver.memory
和/或使用更大的主控程序。有更多信息。

非常感谢!将
spark.driver.maxResultSize
设置为
10g
主机类型为n1-highmem-4
有帮助。