Apache spark Spark on Google Cloud Dataproc作业在最后阶段失败
我在Dataproc上使用Spark cluster,但我的作业在处理结束时失败 我的数据源是谷歌云存储上csv格式的文本日志文件(总容量为3.5TB,5000个文件) 处理逻辑如下: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
- 将文件读取到数据帧(模式[“时间戳”,“消息])李>
- 将所有消息分组到1秒的窗口中李>
- 将管道[Tokenizer->HashingTF]应用于每个分组消息,提取单词及其频率,以构建特征向量李>
- 在地面军事系统上保存带有时间线的要素向量
导入日志
导入字符串
从日期时间导入日期时间
进口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.timestampspark.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
有帮助。