Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark SQL+流媒体问题_Apache Spark_Spark Streaming_Apache Spark Sql_Apache Spark 1.4 - Fatal编程技术网

Apache spark Spark SQL+流媒体问题

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

我们正在尝试使用Spark Streaming和Spark SQL实现一个用例,该用例允许我们对一些数据运行用户定义的规则。有关如何捕获和使用数据,请参见下文。其思想是使用SQL指定规则,并将结果作为警报返回给用户。基于每个传入事件批处理执行查询似乎非常慢。如果有人能提出更好的方法来实现这个用例,我们将不胜感激。另外,想知道Spark是否正在驱动程序或工作程序上执行sql?提前谢谢。以下是我们为实现这一目标而采取的步骤-

1将初始数据集作为JDBCRDD从外部数据库加载

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可能会执行一些操作,这些操作在工作节点上执行


为了更好地解释输出操作,您可能需要阅读本文-

我也面临同样的问题,您是否有同样的解决方案?尽管我在下面的帖子中提到了详细的用例


我也面临同样的问题,你能告诉我你是否有同样的解决方案吗?尽管我在下面的帖子中提到了详细的用例