Apache spark Spark SQL+流媒体问题
我们正在尝试使用Spark Streaming和Spark SQL实现一个用例,该用例允许我们对一些数据运行用户定义的规则。有关如何捕获和使用数据,请参见下文。其思想是使用SQL指定规则,并将结果作为警报返回给用户。基于每个传入事件批处理执行查询似乎非常慢。如果有人能提出更好的方法来实现这个用例,我们将不胜感激。另外,想知道Spark是否正在驱动程序或工作程序上执行sql?提前谢谢。以下是我们为实现这一目标而采取的步骤- 1将初始数据集作为JDBCRDD从外部数据库加载Apache spark Spark SQL+流媒体问题,apache-spark,spark-streaming,apache-spark-sql,apache-spark-1.4,Apache Spark,Spark Streaming,Apache Spark Sql,Apache Spark 1.4,我们正在尝试使用Spark Streaming和Spark SQL实现一个用例,该用例允许我们对一些数据运行用户定义的规则。有关如何捕获和使用数据,请参见下文。其思想是使用SQL指定规则,并将结果作为警报返回给用户。基于每个传入事件批处理执行查询似乎非常慢。如果有人能提出更好的方法来实现这个用例,我们将不胜感激。另外,想知道Spark是否正在驱动程序或工作程序上执行sql?提前谢谢。以下是我们为实现这一目标而采取的步骤- 1将初始数据集作为JDBCRDD从外部数据库加载 JDBCRDD<S
JDBCRDD<SomeState> initialRDD = JDBCRDD.create(...);
2创建捕获初始化数据更新的传入数据流
JavaReceiverInputDStream<SparkFlumeEvent> flumeStream =
FlumeUtils.createStream(ssc, flumeAgentHost, flumeAgentPort);
JavaDStream<SomeState> incomingDStream = flumeStream.map(...);
3使用传入数据流创建一对数据流
JavaPairDStream<Object,SomeState> pairDStream =
incomingDStream.map(...);
4使用初始化的RDD作为基本状态,从对数据流创建有状态数据流
JavaPairDStream<Object,SomeState> statefulDStream = pairDStream.updateStateByKey(...);
JavaRDD<SomeState> updatedStateRDD = statefulDStream.map(...);
5根据传入流中的值,针对更新状态运行用户驱动的查询
incomingStream.foreachRDD(new Function<JavaRDD<SomeState>,Void>() {
@Override
public Void call(JavaRDD<SomeState> events) throws Exception {
updatedStateRDD.count();
SQLContext sqx = new SQLContext(events.context());
schemaDf = sqx.createDataFrame(updatedStateRDD, SomeState.class);
schemaDf.registerTempTable("TEMP_TABLE");
sqx.sql(SELECT col1 from TEMP_TABLE where <condition1> and <condition2> ...);
//collect the results and process and send alerts
...
}
);
第一步应该是确定哪一步占用了大部分时间。 请查看Spark Master UI,并确定哪一步/阶段占用了大部分时间 您可以考虑的最佳实践+我的观察很少:- 使用单例SQLContext-参见示例- updateStateByKey可能是一个内存密集型操作,用于处理大量密钥。您需要检查由处理的数据的大小 updateStateByKey函数,以及它是否适合给定的 记忆力 你的GC表现如何? 你真的在用initialRDD吗?如果没有,则不要加载它。如果是静态数据集,则缓存它。 还要检查SQL查询所用的时间。 这里还有几个问题/领域可以帮助您 数据流的存储级别是多少? 群集的大小和群集的配置 Spark的版本? 最后-ForEachRDD是一个输出操作,它在驱动程序上执行给定的函数,但RDD可能会执行一些操作,这些操作在工作节点上执行
为了更好地解释输出操作,您可能需要阅读本文-第一步应该是确定哪一步占用了大部分时间。 请查看Spark Master UI,并确定哪一步/阶段占用了大部分时间 您可以考虑的最佳实践+我的观察很少:- 使用单例SQLContext-参见示例- updateStateByKey可能是一个内存密集型操作,用于处理大量密钥。您需要检查由处理的数据的大小 updateStateByKey函数,以及它是否适合给定的 记忆力 你的GC表现如何? 你真的在用initialRDD吗?如果没有,则不要加载它。如果是静态数据集,则缓存它。 还要检查SQL查询所用的时间。 这里还有几个问题/领域可以帮助您 数据流的存储级别是多少? 群集的大小和群集的配置 Spark的版本? 最后-ForEachRDD是一个输出操作,它在驱动程序上执行给定的函数,但RDD可能会执行一些操作,这些操作在工作节点上执行
为了更好地解释输出操作,您可能需要阅读本文-我也面临同样的问题,您是否有同样的解决方案?尽管我在下面的帖子中提到了详细的用例
我也面临同样的问题,你能告诉我你是否有同样的解决方案吗?尽管我在下面的帖子中提到了详细的用例