Spark:对多个文件运行多个查询,优化

时间:2015-10-15 06:11:34

标签: java apache-spark apache-spark-sql

我正在使用spark 1.5.0。

我在s3上有一组包含序列文件格式的json数据的文件,价值约为60GB。我必须对此数据集发出大约40个查询并将结果存储回s3。

  1. 所有查询都是具有相同字段条件的select语句。例如。 select a,b,c from t where event_type='alpha'select x,y,z from t where event_type='beta'等。
  2. 我正在使用具有2个核心节点和2个任务节点的AWS EMR 5节点群集。
  3. 输入中可能缺少某些字段。例如。 a可能会丢失。因此,选择a的第一个查询将失败。为了避免这种情况,我为每个event_type定义了模式。因此,对于event_type alpha,架构将类似于{"a": "", "b": "", c:"", event_type=""}
  4. 根据为每个事件定义的模式,我将使用相应的模式为每个事件从输入RDD创建一个数据框。
  5. 我正在使用以下代码:

    JavaPairRDD<LongWritable,BytesWritable> inputRDD = jsc.sequenceFile(bucket, LongWritable.class, BytesWritable.class);
    JavaRDD<String> events = inputRDD.map(
        new Function<Tuple2<LongWritable,BytesWritable>, String>() {
            public String call(Tuple2<LongWritable,BytesWritable> tuple) throws JSONException, UnsupportedEncodingException {
                String valueAsString = new String(tuple._2.getBytes(), "UTF-8");
                JSONObject data = new JSONObject(valueAsString);
                JSONObject payload = new JSONObject(data.getString("payload"));
                return payload.toString();
            }
        }
    );
    events.cache();
    
    for (String event_type: events_list) {
        String query = //read query from another s3 file event_type.query
    
        String jsonSchemaString = //read schema from another s3 file event_type.json
        List<String> jsonSchema = Arrays.asList(jsonSchemaString);
        JavaRDD<String> jsonSchemaRDD = jsc.parallelize(jsonSchema);
        DataFrame df_schema = sqlContext.read().option("header", "true").json(jsonSchemaRDD);
        StructType schema = df_schema.schema();
    
        DataFrame df_query = sqlContext.read().schema(schema).option("header", "true").json(events);
        df_query.registerTempTable(tableName);
        DataFrame df_results = sqlContext.sql(query);
    
        df_results.write().format("com.databricks.spark.csv").save("s3n://some_location);
    }
    

    此代码效率非常低,运行大约需要6-8小时。如何优化我的代码?

    • 我应该尝试使用HiveContext。

    • 我认为当前的代码正在对数据进行多次传递,但不确定,因为我已经缓存了RDD?如果是这样,我怎么能一次性完成呢。

0 个答案:

没有答案