Apache spark 将主数据文件加载到spark生态系统

Apache spark 将主数据文件加载到spark生态系统,apache-spark,pyspark,Apache Spark,Pyspark,在构建日志处理系统时,我遇到了一个场景,在这个场景中,我需要从树文件(如DB)中查找每个日志行对应值的数据。将非常大的外部文件加载到spark生态系统中的最佳方法是什么?树文件的大小为2GB 这是我的设想 我有一个文件包含大量的日志行 每个日志行需要用分隔符拆分为70个字段 需要从树文件中查找日志行70个字段之一的数据 我使用的是ApacheSparkPythonAPI,运行在一个3节点集群上 下面是我写的代码。但是它真的很慢 def process_logline(line, tree):

在构建日志处理系统时,我遇到了一个场景,在这个场景中,我需要从树文件(如DB)中查找每个日志行对应值的数据。将非常大的外部文件加载到spark生态系统中的最佳方法是什么?树文件的大小为2GB

这是我的设想

  • 我有一个文件包含大量的日志行
  • 每个日志行需要用分隔符拆分为70个字段
  • 需要从树文件中查找日志行70个字段之一的数据
  • 我使用的是ApacheSparkPythonAPI,运行在一个3节点集群上

    下面是我写的代码。但是它真的很慢

    def process_logline(line, tree):
        row_dict = {}
        line_list = line.split(" ")
        row_dict["host"] = tree_lookup_value(tree, line_list[0])
        new_row = Row(**row_dict)
        return new_row
    
    def run_job(vals):
        spark.sparkContext.addFile('somefile')
        tree_val = open(SparkFiles.get('somefile'))
        lines = spark.sparkContext.textFile("log_file")
        converted_lines_rdd = lines.map(lambda l: process_logline(l, tree_val))
        log_line_rdd = spark.createDataFrame(converted_lines_rdd)
        log_line_rdd.show()
    

    我认为可以使用spark dataframes并将这两个文件作为dataframes加载,然后进行连接。这将比使用spark rdd api更快。由于数据不是纯文本文件,因此我们无法在此执行联接,我们需要使用此树查找值方法从树文件中获取数据。在这种情况下,您可以编写spark UDF(可能是矢量化的)并在UDF中使用树查找值。其他文本文件可以读取为df,您可以应用此udf,我认为您可以使用spark dataframes并将这两个文件作为dataframes加载,然后进行连接。这将比使用spark rdd api更快。由于数据不是纯文本文件,因此我们无法在此执行联接,我们需要使用此树查找值方法从树文件中获取数据。在这种情况下,您可以编写spark UDF(可能是矢量化的)并在UDF中使用树查找值。其他文本文件可以读取为df,您可以在该文件上应用此udf