Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Scala 通过apache spark提高警报_Scala_Apache Spark_Spark Streaming_Iot - Fatal编程技术网

Scala 通过apache spark提高警报

Scala 通过apache spark提高警报,scala,apache-spark,spark-streaming,iot,Scala,Apache Spark,Spark Streaming,Iot,我使用ApacheSpark从ApacheKafka获取实时数据,这些数据来自Json格式的任何传感器 数据格式示例: { "meterId" : "M1", "meterReading" : "100" } 我想应用规则实时发出警报。i、 e.如果我没有从过去2小时中获得“仪表M 1”的数据,或者仪表读数超过某些限制,则应创建警报 那么,我如何在Scala中实现这一点呢?我将在这里作为一个答案回答—太长了,无法发表评论 正如我在kafka中所说的json应该是:每行一条消息

我使用ApacheSpark从ApacheKafka获取实时数据,这些数据来自Json格式的任何传感器

数据格式示例:

{
    "meterId" : "M1",
    "meterReading" : "100"
 }
我想应用规则实时发出警报。i、 e.如果我没有从过去2小时中获得“仪表M 1”的数据,或者仪表读数超过某些限制,则应创建警报


那么,我如何在Scala中实现这一点呢?

我将在这里作为一个答案回答—太长了,无法发表评论

正如我在kafka中所说的json应该是:每行一条消息-改为发送->
{“meterId”:“M1”,“meterereading”:“100”}

如果您正在使用卡夫卡,则可以使用卡夫卡工具创建流:

JavaPairDStream input=KafkaUtils.createStream(jssc、zkQuorum、group、topics)

配对表示
。所以基本上,如果不需要使用kafkaTopicName,您可以只查看jsonmessage

对于
input
,您可以使用-eg中描述的许多方法。您可以使用map仅获取简单JavaDStream的消息

当然,您可以使用一些json解析器,比如
gson
jackson
org.json
,这取决于用例、不同情况下的性能等等

所以你需要这样做:

JavaDStream<String> messagesOnly = input.map(
   new Function<Tuple2<String, String>, String>() {
       public String call(Tuple2<String, String> message) {
           return message._2();
       }
   }
); 

第一件事-正如我所知,kafka中的json应该是:每行一条消息-发送此消息->
{“meterId”:“M1”,“meterereading”:“100”}
第二件事:创建SparkStreamingContext并配置为批量读取来自kafka的消息。第三:使用spark实现您的逻辑(“超过某个限制”,“一段时间内没有数据”…),并使用所有警报(如hdfs、kafka…)将输出写入某处。谢谢@VladoDemcak。这对我有很大帮助。但我想知道如何读取单个对象,如meterId M1,meterReading为100。我能解析卡夫卡的每一行吗?我在更多的文章中添加了答案和例子details@Nilesh在回答中,我添加了
scala
 JavaPairDStream<String, String> alerts = messagesOnly.filter(
    new Function<Tuple2<String, String>, Boolean>() {
        public Boolean call(Tuple2<String, String> message) {
            // here use gson parser e.g 
            // filter messages with meterReading that doesnt exceed limit
            // return true or false based on your logic
        }
    }
);
// batch every 2 seconds
val ssc = new StreamingContext(sparkConf, Seconds(2))
ssc.checkpoint("checkpoint")

val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap

def filterLogic(message: String): Boolean=
{
    // here your logic for filtering
}

// map _._2 takes your json messages
val messages = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2)

// filtered data after filter transformation
val filtered = messages.filter(m => filterLogic(m))