From 993094b8236e470ca1f4f0c087a2ea2ae4495a67 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 17 Oct 2019 19:20:37 +0530 Subject: [PATCH 01/30] Removing memsql, cassandra, rabitmq modules. --- assembly/build.gradle | 3 - rabbitmq-snappy/build.gradle | 23 - .../rabbitmq/RabbitMQPublisher.java | 75 --- .../rabbitmq/RabbitMQAvroDecoder.scala | 14 - .../rabbitmq/RabbitMQSnappyApp.scala | 70 --- spark-cassandra/build.gradle | 37 -- .../benchmark/CassandraQueryPerf.scala | 50 -- .../benchmark/CassandraStreamIngestPerf.scala | 95 ---- .../chbench/BenchmarkingReceiver.scala | 68 --- .../benchmark/chbench/HQueries.scala | 486 ------------------ .../chbench/OLAPStreamingBench.scala | 185 ------- spark-memsql/build.gradle | 18 - .../benchmark/MemSqlQueryPerf.scala | 61 --- .../benchmark/MemSqlStreamIngestPerf.scala | 99 ---- 14 files changed, 1284 deletions(-) delete mode 100644 rabbitmq-snappy/build.gradle delete mode 100644 rabbitmq-snappy/src/main/java/io/snappydata/rabbitmq/RabbitMQPublisher.java delete mode 100644 rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQAvroDecoder.scala delete mode 100644 rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQSnappyApp.scala delete mode 100644 spark-cassandra/build.gradle delete mode 100644 spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraQueryPerf.scala delete mode 100644 spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraStreamIngestPerf.scala delete mode 100644 spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/BenchmarkingReceiver.scala delete mode 100644 spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/HQueries.scala delete mode 100644 spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/OLAPStreamingBench.scala delete mode 100644 spark-memsql/build.gradle delete mode 100644 spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlQueryPerf.scala delete mode 100644 spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlStreamIngestPerf.scala diff --git a/assembly/build.gradle b/assembly/build.gradle index fce24ff..f33b252 100644 --- a/assembly/build.gradle +++ b/assembly/build.gradle @@ -4,9 +4,6 @@ archivesBaseName = 'snappy-poc' dependencies { compile rootProject - compile project(':spark-memsql') - compile project(':spark-cassandra') - compile project(':rabbitmq-snappy') } shadowJar { diff --git a/rabbitmq-snappy/build.gradle b/rabbitmq-snappy/build.gradle deleted file mode 100644 index 616e646..0000000 --- a/rabbitmq-snappy/build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -dependencies { - compileOnly "io.snappydata:snappydata-core_2.11:${snappyVersion}" - compileOnly "io.snappydata:snappydata-cluster_2.11:${snappyVersion}" - compileOnly "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" - compileOnly "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" - compileOnly "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" - compileOnly "io.snappydata:snappy-spark-streaming_2.11:${sparkVersion}" - compile 'com.rabbitmq:amqp-client:3.5.7' - compile project(':') -} - -task publishRabbitMQMsgs(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.adanalytics.aggregator.RabbitMQPublisher' - classpath sourceSets.main.runtimeClasspath - classpath configurations.runtime -} - -task receiveRabbitMQMsgs(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.adanalytics.aggregator.RabbitMQSnappyStream' - classpath sourceSets.main.runtimeClasspath - classpath configurations.runtime - jvmArgs = ['-XX:MaxPermSize=512m'] // for snappy -} diff --git a/rabbitmq-snappy/src/main/java/io/snappydata/rabbitmq/RabbitMQPublisher.java b/rabbitmq-snappy/src/main/java/io/snappydata/rabbitmq/RabbitMQPublisher.java deleted file mode 100644 index 6ed9ee4..0000000 --- a/rabbitmq-snappy/src/main/java/io/snappydata/rabbitmq/RabbitMQPublisher.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.rabbitmq; - -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import io.snappydata.adanalytics.AdImpressionGenerator; -import io.snappydata.adanalytics.AdImpressionLog; -import org.apache.avro.io.BinaryEncoder; -import org.apache.avro.io.DatumWriter; -import org.apache.avro.io.EncoderFactory; -import org.apache.avro.specific.SpecificDatumWriter; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * A RabbitMQ client which publishes messages to RabbitMQ server - */ -public class RabbitMQPublisher { - - private final static String QUEUE_NAME = "rabbitmq-q"; - - public static void main(String[] argv) - throws Exception { - ConnectionFactory factory = new ConnectionFactory(); - factory.setHost("localhost"); - Connection connection = factory.newConnection(); - Channel channel = connection.createChannel(); - channel.queueDeclare(QUEUE_NAME, true, false, false, null); - - int logCount = 0; - int totalNumLogs = 1000000; - - while (logCount <= totalNumLogs) { - AdImpressionLog log = AdImpressionGenerator.nextRandomAdImpression(); - channel.basicPublish("", QUEUE_NAME, null, getLogBytes(log)); - logCount += 1; - if (logCount % 100000 == 0) { - System.out.println("RabbitMQPublisher published total " + - logCount + " messages"); - } - } - - channel.close(); - connection.close(); - } - - private static byte[] getLogBytes(AdImpressionLog log) throws IOException { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null); - SpecificDatumWriter writer = - new SpecificDatumWriter(AdImpressionLog.getClassSchema()); - writer.write(log, encoder); - encoder.flush(); - out.close(); - return out.toByteArray(); - } -} diff --git a/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQAvroDecoder.scala b/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQAvroDecoder.scala deleted file mode 100644 index 5a06f92..0000000 --- a/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQAvroDecoder.scala +++ /dev/null @@ -1,14 +0,0 @@ -package io.snappydata.rabbitmq - -import io.snappydata.adanalytics.AdImpressionLog -import org.apache.avro.io.DecoderFactory -import org.apache.avro.specific.SpecificDatumReader -import org.apache.spark.sql.streaming.RabbitMQDecoder - -class RabbitMQAvroDecoder extends RabbitMQDecoder[AdImpressionLog] { - def fromBytes(bytes: scala.Array[scala.Byte]): AdImpressionLog = { - val reader = new SpecificDatumReader[AdImpressionLog](AdImpressionLog.getClassSchema()) - val decoder = DecoderFactory.get().binaryDecoder(bytes, null) - reader.read(null, decoder) - } -} \ No newline at end of file diff --git a/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQSnappyApp.scala b/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQSnappyApp.scala deleted file mode 100644 index 5970f38..0000000 --- a/rabbitmq-snappy/src/main/scala/io/snappydata/rabbitmq/RabbitMQSnappyApp.scala +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.rabbitmq - -import io.snappydata.adanalytics.Configs -import Configs._ -import org.apache.log4j.{Level, Logger} -import org.apache.spark.streaming.SnappyStreamingContext -import org.apache.spark.{SparkConf, SparkContext} - -/** - * A Snappy streaming program to receive RabbitMQ messages - */ -object RabbitMQSnappyApp extends App { - - Logger.getRootLogger().setLevel(Level.ERROR) - - val sparkConf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - - val sc = new SparkContext(sparkConf) - val snsc = new SnappyStreamingContext(sc, batchDuration) - - snsc.sql("drop table if exists adImpressions") - snsc.sql("drop table if exists adImpressionStream") - - snsc.sql("create stream table adImpressionStream (" + - " timestamp long," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using rabbitmq_stream options(" + - " rowConverter 'io.snappydata.adanalytics.aggregator.AdImpressionToRowsConverter' ," + - " host 'localhost',"+ - " queueName 'rabbitmq-q',"+ - " T 'io.snappydata.adanalytics.aggregator.AdImpressionLog'," + - " D 'io.snappydata.adanalytics.aggregator.RabbitMQAvroDecoder')") - - snsc.sql("create table adImpressions(timestamp long, publisher string, " + - "advertiser string, website string, geo string, bid double, cookie string) " + - "using column options ( BUCKETS '29')") - - snsc.getSchemaDStream("adImpressionStream").foreachDataFrame(df => { - df.show - df.write.insertInto("adImpressions") - }) - - snsc.start() - snsc.awaitTermination() -} diff --git a/spark-cassandra/build.gradle b/spark-cassandra/build.gradle deleted file mode 100644 index bdcb2ef..0000000 --- a/spark-cassandra/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -dependencies { - compileOnly "org.apache.spark:spark-core_2.11:1.6.0" - compileOnly "org.apache.spark:spark-streaming_2.11:1.6.0" - compileOnly "org.apache.spark:spark-streaming-kafka_2.11:1.6.0" - // compile "org.apache.spark:spark-streaming-kafka_2.10:1.6.0" //required in assemble jar in cluster mode - compileOnly "org.apache.spark:spark-sql_2.11:1.6.0" - - compile project(':') - compile 'com.datastax.spark:spark-cassandra-connector_2.11:1.6.0-M2' -} - -task startCassandraStreamIngestPerf(type: JavaExec, dependsOn: classes) { - dependsOn ':assembly:shadowJar' - main = 'io.snappydata.benchmark.CassandraStreamIngestPerf' - def filterGuava = sourceSets.test.runtimeClasspath.findAll { !it.getName().contains('guava-14') } - classpath filterGuava - environment 'PROJECT_ASSEMBLY_JAR', "~/guava-16.0.1.jar:~/AdImpressionLogAggr-0.3-assembly.jar" -} - -task startCassandraQueryPerf(type: JavaExec, dependsOn: classes) { - dependsOn ':assembly:shadowJar' - main = 'io.snappydata.benchmark.CassandraQueryPerf' - def filterGuava = sourceSets.test.runtimeClasspath.findAll { !it.getName().contains('guava-14') } - classpath filterGuava - environment 'PROJECT_ASSEMBLY_JAR', "~/guava-16.0.1.jar:~/AdImpressionLogAggr-0.3-assembly.jar" -} - -task startOLAPStreamingBenchmark(type: JavaExec, dependsOn: classes) { - dependsOn ':assembly:shadowJar' - main = 'io.snappydata.benchmark.chbench.OLAPStreamingBench' - maxHeapSize = "57344m" - def filterGuava = sourceSets.test.runtimeClasspath.findAll { !it.getName().contains('guava-14') } - classpath filterGuava - environment 'PROJECT_ASSEMBLY_JAR', "~/guava-16.0.1.jar:~/AdImpressionLogAggr-0.3-assembly.jar" -} - - diff --git a/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraQueryPerf.scala b/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraQueryPerf.scala deleted file mode 100644 index f2e0e45..0000000 --- a/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraQueryPerf.scala +++ /dev/null @@ -1,50 +0,0 @@ -package io.snappydata.benchmark - -import io.snappydata.adanalytics.Configs -import Configs._ -import org.apache.log4j.{Level, Logger} -import org.apache.spark.sql.cassandra.CassandraSQLContext -import org.apache.spark.{SparkConf, SparkContext} - -object CassandraQueryPerf extends App { - - val rootLogger = Logger.getLogger("org"); - rootLogger.setLevel(Level.WARN); - - val conf = new SparkConf(true) - .setAppName(getClass.getSimpleName) - .set("spark.cassandra.connection.host", s"$cassandraHost") - .set("spark.cassandra.auth.username", "cassandra") - .set("spark.cassandra.auth.password", "cassandra") - .set("spark.cassandra.sql.keyspace", "adlogs") - // .set("spark.sql.shuffle.partitions", "8") - .setMaster("local[*]") - .set("spark.executor.cores", "2") - .set("spark.ui.port", "4041") - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - conf.set("spark.driver.extraClassPath", assemblyJar) - conf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(conf) - val msc = new CassandraSQLContext(sc) - msc.setKeyspace("adlogs") - var start = System.currentTimeMillis() - msc.sql("select count(*) AS adCount, geo from adimpressions group" + - " by geo order by adCount desc limit 20").collect() - println("Time for Q1 " + (System.currentTimeMillis() - start )) - - start = System.currentTimeMillis() - msc.sql("select sum (bid) as max_bid, geo from adimpressions group" + - " by geo order by max_bid desc limit 20").collect() - println("Time for Q2 " + (System.currentTimeMillis() - start )) - - start = System.currentTimeMillis() - msc.sql("select sum (bid) as max_bid, publisher from adimpressions" + - " group by publisher order by max_bid desc limit 20").collect() - println("Time for Q3 " + (System.currentTimeMillis() - start )) - - msc.sql("select count(*) as cnt from adimpressions").show() - -} diff --git a/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraStreamIngestPerf.scala b/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraStreamIngestPerf.scala deleted file mode 100644 index 923aeb1..0000000 --- a/spark-cassandra/src/main/scala/io/snappydata/benchmark/CassandraStreamIngestPerf.scala +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import com.datastax.spark.connector.SomeColumns -import com.datastax.spark.connector.cql.CassandraConnector -import io.snappydata.adanalytics.AdImpressionLogAvroDecoder -import io.snappydata.adanalytics.Configs._ -import io.snappydata.adanalytics.AdImpressionLog -import kafka.serializer.StringDecoder -import org.apache.log4j.{Level, Logger} -import org.apache.spark.sql.cassandra.CassandraSQLContext -import org.apache.spark.streaming.StreamingContext -import org.apache.spark.streaming.kafka.KafkaUtils -import org.apache.spark.{SparkConf, SparkContext} - -/** - * Simple direct kafka spark streaming program which pulls log messages - * from kafka broker and ingest those log messages to Cassandra using - * DataStax's Spark Cassandra Connector. To run this program you need to - * start a single instance of Cassandra and run Spark in local mode. - */ -object CassandraStreamIngestPerf extends App { - - val rootLogger = Logger.getLogger("org"); - rootLogger.setLevel(Level.WARN); - - val conf = new SparkConf(true) - .setAppName(getClass.getSimpleName) - .set("spark.cassandra.connection.host", s"$cassandraHost") - .set("spark.cassandra.auth.username", "cassandra") - .set("spark.cassandra.auth.password", "cassandra") - .set("spark.streaming.kafka.maxRatePerPartition", s"$maxRatePerPartition") - .set("spark.cassandra.output.batch.size.bytes", "5120") //8000 * 1024 - .set("spark.cassandra.output.concurrent.writes", "32") - .set("spark.cassandra.output.consistency.level", "ANY") - .set("spark.cassandra.output.batch.grouping.key", "none") ///replica_set/partition - .set("spark.cassandra.sql.keyspace", "adlogs") - .set("spark.executor.cores", "2") - //.set("spark.cassandra.output.batch.size.rows", "500") - //.set("spark.cassandra.output.batch.grouping.buffer.size", "1") //1000 - //.setMaster(s"$sparkMasterURL") - .setMaster("local[*]") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - conf.set("spark.driver.extraClassPath", assemblyJar) - conf.set("spark.executor.extraClassPath", assemblyJar) - } - val sc = new SparkContext(conf) - val csc = new CassandraSQLContext(sc) - CassandraConnector(conf).withSessionDo { session => - // Create keysapce and table in Cassandra - session.execute(s"DROP KEYSPACE IF EXISTS adlogs") - session.execute(s"CREATE KEYSPACE IF NOT EXISTS adlogs " + - s"WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1 }") - session.execute(s"CREATE TABLE IF NOT EXISTS adlogs.adimpressions " + - s"(timestamp bigint, publisher text, advertiser text, " + - "website text, geo text, bid double, cookie text, primary key (timestamp, cookie))") - } - csc.setKeyspace("adlogs") - - // batchDuration of 1 second - val ssc = new StreamingContext(sc, batchDuration) - - // Creates a stream of AdImpressionLog using kafka direct that pulls - // messages from a Kafka Broker - val messages = KafkaUtils.createDirectStream - [String, AdImpressionLog, StringDecoder, AdImpressionLogAvroDecoder](ssc, kafkaParams, topics) - - import com.datastax.spark.connector.streaming._ - - messages.map(_._2).map(ad => - (ad.getTimestamp, ad.getPublisher, ad.getAdvertiser, ad.getWebsite, ad.getGeo, ad.getBid, ad.getCookie)) - .saveToCassandra("adlogs", "adimpressions", - SomeColumns("timestamp", "publisher", "advertiser", "website", "geo", "bid", "cookie")) - - ssc.start - ssc.awaitTermination -} diff --git a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/BenchmarkingReceiver.scala b/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/BenchmarkingReceiver.scala deleted file mode 100644 index 82c1e3b..0000000 --- a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/BenchmarkingReceiver.scala +++ /dev/null @@ -1,68 +0,0 @@ -package io.snappydata.benchmark.chbench - -import java.util.Random -import org.apache.spark.storage.StorageLevel -import org.apache.spark.streaming.receiver.Receiver - -class BenchmarkingReceiver (val maxRecPerSecond: Int, - val numWarehouses: Int, - val numDistrictsPerWarehouse: Int, - val numCustomersPerDistrict: Int, - val itemCount : Int) - extends Receiver[ClickStreamCustomer](StorageLevel.MEMORY_AND_DISK) { - - - var receiverThread: Thread = null - var stopThread = false; - override def onStart() { - receiverThread = new Thread("BenchmarkingReceiver") { - override def run() { - receive() - } - } - receiverThread.start() - } - - override def onStop(): Unit = { - receiverThread.interrupt() - } - - private def receive() { - while (!isStopped()) { - val start = System.currentTimeMillis() - var i = 0; - for (i <- 1 to maxRecPerSecond) { - store(generateClickStream()) - if (isStopped()) { - return - } - } - // If one second hasn't elapsed wait for the remaining time - // before queueing more. - val remainingtime = 1000 - (System.currentTimeMillis() - start) - if (remainingtime > 0) { - Thread.sleep(remainingtime) - } - } - } - - val rand = new Random(123) - - private def generateClickStream(): ClickStreamCustomer = { - - val warehouseID: Int = rand.nextInt(numWarehouses) - val districtID: Int = rand.nextInt(this.numDistrictsPerWarehouse) - val customerID: Int = rand.nextInt(this.numCustomersPerDistrict) - val itemId: Int = rand.nextInt(this.itemCount) - // timespent on website is 100 -500 seconds - val timespent: Int = rand.nextInt(400) + 100 - - new ClickStreamCustomer(warehouseID, districtID, customerID, itemId, timespent) - } -} - -class ClickStreamCustomer (val w_id: Int, - val d_id: Int, - val c_id: Int, - val i_id: Int, - val c_ts: Int) extends Serializable \ No newline at end of file diff --git a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/HQueries.scala b/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/HQueries.scala deleted file mode 100644 index 8ec7b5a..0000000 --- a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/HQueries.scala +++ /dev/null @@ -1,486 +0,0 @@ -package io.snappydata.benchmark.chbench - -object HQueries { - - val Q1: String = "SELECT ol_number, " + - " sum(ol_quantity) AS sum_qty, " + - " sum(ol_amount) AS sum_amount, " + - " avg(ol_quantity) AS avg_qty, " + - " avg(ol_amount) AS avg_amount, " + - " count(*) AS count_order " + - " FROM order_line" + - " WHERE ol_delivery_d > '2007-01-02 00:00:00.000000' " + - " GROUP BY ol_number " + " ORDER BY ol_number" - - val Q2: String = "SELECT su_suppkey, " + - " su_name, " + - " n_name, " + - " i_id, " + - " i_name, " + - " su_address, " + - " su_phone, " + - " su_comment " + - " FROM item, supplier, stock, nation, region, " + - " (SELECT s_i_id AS m_i_id, MIN(s_quantity) AS m_s_quantity " + - " FROM stock, " + " supplier, " + - " nation, " + " region " + - " WHERE PMOD((s_w_id*s_i_id), 10000)=su_suppkey " + - " AND su_nationkey=n_nationkey " + - " AND n_regionkey=r_regionkey " + - " AND r_name LIKE 'Europ%' " + - " GROUP BY s_i_id) m " + - " WHERE i_id = s_i_id " + - " AND PMOD((s_w_id * s_i_id), 10000) = su_suppkey " + - " AND su_nationkey = n_nationkey " + - " AND n_regionkey = r_regionkey " + - " AND i_data LIKE '%b' " + - " AND r_name LIKE 'Europ%' " + - " AND i_id=m_i_id " + - " AND s_quantity = m_s_quantity " + - " ORDER BY n_name, " + - " su_name, " + - " i_id" - val Q3: String = "SELECT ol_o_id, " + - " ol_w_id, " + - " ol_d_id, " + - " sum(ol_amount) AS revenue, " + - " o_entry_d " + - " FROM " + - " customer, " + - " orders, " + - " order_line," + - " new_order" + - " WHERE c_state LIKE 'A%' " + - " AND c_id = o_c_id " + - " AND c_w_id = o_w_id " + - " AND c_d_id = o_d_id " + - " AND no_w_id = o_w_id " + - " AND no_d_id = o_d_id " + - " AND no_o_id = o_id " + - " AND ol_w_id = o_w_id " + - " AND ol_d_id = o_d_id " + - " AND ol_o_id = o_id " + - " AND o_entry_d > '2007-01-02 00:00:00.000000' " + - " GROUP BY ol_o_id, " + - " ol_w_id, " + - " ol_d_id, " + - " o_entry_d " + - " ORDER BY revenue DESC , o_entry_d" - - /*val Q4: String = "SELECT o_ol_cnt, " + - "count(*) AS order_count " + - "FROM orders " + "WHERE exists " + - "(SELECT * " + "FROM order_line " + - "WHERE o_id = ol_o_id " + - "AND o_w_id = ol_w_id " + - "AND o_d_id = ol_d_id " + - "AND ol_delivery_d >= o_entry_d) " + - "GROUP BY o_ol_cnt " + - "ORDER BY o_ol_cnt" - */ - - val Q4: String = "SELECT o_ol_cnt, count(*) AS order_count " + - "FROM orders JOIN order_line ON o_id = ol_o_id " + - "AND o_w_id = ol_w_id " + - "AND o_d_id = ol_d_id " + - "AND ol_delivery_d >= o_entry_d " + - "GROUP BY o_ol_cnt " + - "ORDER BY o_ol_cnt " - - val Q5: String = "SELECT n_name, " + - "sum(ol_amount) AS revenue " + - "FROM customer, " + - "orders, " + - "order_line, " + - "stock, " + - "supplier, " + - "nation, " + - "region " + - "WHERE c_id = o_c_id " + - "AND c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id=o_d_id " + - "AND ol_w_id = s_w_id " + - "AND ol_i_id = s_i_id " + - "AND pMOD((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND ascii(substr(c_state, 1, 1)) = su_nationkey " + - "AND su_nationkey = n_nationkey " + - "AND n_regionkey = r_regionkey " + - "AND r_name = 'Europe' " + - "AND o_entry_d >= '2007-01-02 00:00:00.000000' " + - "GROUP BY n_name " + - "ORDER BY revenue DESC" - - val Q6: String = "SELECT sum(ol_amount) AS revenue " + - "FROM order_line " + - "WHERE ol_delivery_d >= '1999-01-01 00:00:00.000000' " + - "AND ol_delivery_d < '2020-01-01 00:00:00.000000' " + - "AND ol_quantity BETWEEN 1 AND 100000" - - // Select, GroupBY and OrderClause of Q7 has been MOdified - val Q7: String = "SELECT su_nationkey AS supp_nation, " + - "n2.n_nationkey AS cust_nation, " + - "YEAR(o_entry_d) AS l_year, " + - "sum(ol_amount) AS revenue " + - "FROM supplier, " + - "stock, " + - "order_line, " + - "orders, " + - "customer, " + - "nation n1, " + - "nation n2 " + - "WHERE ol_supply_w_id = s_w_id " + - "AND ol_i_id = s_i_id " + - "AND pMOD ((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND c_id = o_c_id " + - "AND c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND su_nationkey = n1.n_nationkey " + - "AND ascii(substr(c_state,1, 1)) = n2.n_nationkey " + - "AND ((n1.n_name = 'Germany' " + - "AND n2.n_name = 'Cambodia') " + - "OR (n1.n_name = 'Cambodia' " + - "AND n2.n_name = 'Germany')) " + - "GROUP BY su_nationkey, " + - "n2.n_nationkey, " + - "YEAR(o_entry_d) " + - "ORDER BY su_nationkey, " + - "n2.n_nationkey, " + - "YEAR(o_entry_d)" - // Modified the group by and order by clauses - val Q8 = "SELECT YEAR (o_entry_d) AS l_year, " + - "sum(CASE WHEN n2.n_name = 'Germany' THEN ol_amount ELSE 0 END) / sum(ol_amount) AS mkt_share " + - "FROM item, " + - "supplier, " + - "stock, " + - "order_line, " + - "orders, " + - "customer, " + - "nation n1, " + - "nation n2, " + - "region " + - "WHERE i_id = s_i_id " + - "AND ol_i_id = s_i_id " + - "AND ol_supply_w_id = s_w_id " + - "AND pMOD ((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND c_id = o_c_id " + - "AND c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND n1.n_nationkey = ascii(substr(c_state, 1, 1)) " + - "AND n1.n_regionkey = r_regionkey " + - "AND ol_i_id < 1000 " + - "AND r_name = 'Europe' " + - "AND su_nationkey = n2.n_nationkey " + - "AND i_data LIKE '%b' " + - "AND i_id = ol_i_id " + - "GROUP BY YEAR(o_entry_d) " + - " ORDER BY YEAR(o_entry_d)" - - // Modified the group by and order by clauses - val Q9 = "SELECT n_name, YEAR(o_entry_d) AS l_year, " + - "sum(ol_amount) AS sum_profit " + - "FROM item, stock, supplier, " + - "order_line, " + - "orders, " + - "nation " + - "WHERE ol_i_id = s_i_id " + - "AND ol_supply_w_id = s_w_id " + - "AND pMOD ((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND ol_i_id = i_id " + - "AND su_nationkey = n_nationkey " + - "AND i_data LIKE '%bb' " + - "GROUP BY n_name, " + - "YEAR(o_entry_d) " + - "ORDER BY n_name, " + - "YEAR(o_entry_d) DESC" - - val Q10 = "SELECT c_id, " + - "c_last, " + - "sum(ol_amount) AS revenue, " + - "c_city, " + - "c_phone, " + - "n_name " + - "FROM customer, " + - "orders, " + - "order_line, " + - "nation " + - "WHERE c_id = o_c_id " + - "AND c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND o_entry_d >= '2007-01-02 00:00:00.000000' " + - "AND o_entry_d <= ol_delivery_d " + - "AND n_nationkey = ascii(substr(c_state, 1, 1)) " + - "GROUP BY c_id, " + - "c_last, " + - "c_city, " + - "c_phone, " + - "n_name " + - "ORDER BY revenue DESC" - - /*val Q11 = "SELECT s_i_id, " + - "sum(s_order_cnt) AS ordercount " + - "FROM stock, " + - "supplier, " + - "nation " + - "WHERE pmod((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND su_nationkey = n_nationkey " + - "AND n_name = 'Germany' " + - "GROUP BY s_i_id HAVING sum(s_order_cnt) > " + - "(SELECT sum(s_order_cnt) * .005 " + - "FROM stock, " + - "supplier, " + - "nation " + - "WHERE pmod((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND su_nationkey = n_nationkey " + - "AND n_name = 'Germany') " + - "ORDER BY ordercount DESC"*/ - - val Q11a = "SELECT sum(s_order_cnt) * .005 " + - "FROM stock, " + - "supplier, " + - "nation " + - "WHERE pmod((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND su_nationkey = n_nationkey " + - "AND trim(n_name) = 'Germany'" - - val Q11b = "SELECT s_i_id, " + - "sum(s_order_cnt) AS ordercount " + - "FROM stock, " + - "supplier, " + - "nation " + - "WHERE pmod((s_w_id * s_i_id), 10000) = su_suppkey " + - "AND su_nationkey = n_nationkey " + - "AND n_name = 'Germany' " + - "GROUP BY s_i_id HAVING sum(s_order_cnt) > ? " + - "ORDER BY ordercount DESC" - - val Q12 = "SELECT o_ol_cnt, " + - "sum(CASE WHEN o_carrier_id = 1 " + - "OR o_carrier_id = 2 THEN 1 ELSE 0 END) AS high_line_count, " + - "sum(CASE WHEN o_carrier_id <> 1 " + - "AND o_carrier_id <> 2 THEN 1 ELSE 0 END) AS low_line_count " + - "FROM orders, " + - "order_line " + - "WHERE ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "AND o_entry_d <= ol_delivery_d " + - "AND ol_delivery_d < '2020-01-01 00:00:00.000000' " + - "GROUP BY o_ol_cnt " + - "ORDER BY o_ol_cnt" - - val Q13 = "SELECT c_count, " + - "count(*) AS custdist " + - "FROM " + - "(SELECT c_id, " + - "count(o_id) AS c_count " + - "FROM customer " + - "LEFT OUTER JOIN orders ON (c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND c_id = o_c_id " + - "AND o_carrier_id > 8) " + - "GROUP BY c_id) AS c_orders " + - "GROUP BY c_count " + - "ORDER BY custdist DESC, c_count DESC" - - val Q14 = " SELECT (100.00 * sum(CASE WHEN i_data LIKE 'PR%' THEN ol_amount ELSE 0 END) / " + - "(1 + sum(ol_amount))) AS promo_revenue " + - "FROM order_line, " + - "item " + - "WHERE ol_i_id = i_id " + - "AND ol_delivery_d >= '2007-01-02 00:00:00.000000' " + - "AND ol_delivery_d < '2020-01-02 00:00:00.000000'" - - val Q15a = "SELECT " + - " pmod((s_w_id * s_i_id),10000) as supplier_no, " + - " sum(ol_amount) as total_revenue " + - "FROM " + - " order_line, stock " + - "WHERE " + - " ol_i_id = s_i_id " + - " AND ol_supply_w_id = s_w_id " + - " AND ol_delivery_d >= '2007-01-02 00:00:00.000000' " + - "GROUP BY pmod((s_w_id * s_i_id),10000)" - - val Q15b = "select max(total_revenue) as mxRevenue from revenue " - - val Q15c = "SELECT su_suppkey, " + - " su_name, " + - " su_address, " + - " su_phone, " + - " total_revenue " + - "FROM supplier, revenue " + - "WHERE su_suppkey = supplier_no " + - " AND total_revenue = ? " + - "ORDER BY su_suppkey" - - val Q16 = "SELECT i_name, " + - "substr(i_data, 1, 3) AS brand, " + - "i_price, " + - "count(DISTINCT (pmod((s_w_id * s_i_id),10000))) AS supplier_cnt " + - "FROM stock, " + - "item " + - "WHERE i_id = s_i_id " + - "AND i_data NOT LIKE 'zz%' " + - "AND pmod((s_w_id * s_i_id),10000) NOT IN " + - "(SELECT SU_SUPPKEY " + - "FROM supplier " + - "WHERE su_comment LIKE '%bad%') " + - "" + - "GROUP BY i_name, " + - "substr(i_data, 1, 3), " + - "i_price " + - "ORDER BY supplier_cnt DESC" - - val Q17 = "SELECT SUM(ol_amount) / 2.0 AS avg_yearly " + - "FROM order_line, " + - "(SELECT i_id, AVG (ol_quantity) AS a " + - "FROM item, " + - "order_line " + - "WHERE i_data LIKE '%b' " + - "AND ol_i_id = i_id " + - "GROUP BY i_id) t " + - "WHERE ol_i_id = t.i_id " + - "AND ol_quantity < t.a" - val Q18 = " SELECT c_last, " + - "c_id, " + - "o_id, " + - "o_entry_d, " + - "o_ol_cnt, " + - "sum(ol_amount) AS amount_sum " + - "FROM customer, " + - "orders, " + - "order_line " + - "WHERE c_id = o_c_id " + - "AND c_w_id = o_w_id " + - "AND c_d_id = o_d_id " + - "AND ol_w_id = o_w_id " + - "AND ol_d_id = o_d_id " + - "AND ol_o_id = o_id " + - "GROUP BY o_id, " + - "o_w_id, " + - "o_d_id, " + - "c_id, " + - "c_last, " + - "o_entry_d, " + - "o_ol_cnt HAVING sum(ol_amount) > 200 " + - "ORDER BY amount_sum DESC, o_entry_d" - - val Q19 = " SELECT sum(ol_amount) AS revenue " + - "FROM order_line, " + - "item " + - "WHERE (ol_i_id = i_id " + - "AND i_data LIKE '%a' " + - "AND ol_quantity >= 1 " + - "AND ol_quantity <= 10 " + - "AND i_price BETWEEN 1 AND 400000 " + - "AND ol_w_id IN (1, 2, 3)) " + - "OR (ol_i_id = i_id " + - "AND i_data LIKE '%b' " + - "AND ol_quantity >= 1 " + - "AND ol_quantity <= 10 " + - "AND i_price BETWEEN 1 AND 400000 " + - "AND ol_w_id IN (1, 2, 4)) OR (ol_i_id = i_id AND i_data LIKE '%c' AND ol_quantity >= 1 " + - "AND ol_quantity <= 10 " + - "AND i_price BETWEEN 1 AND 400000 " + - "AND ol_w_id IN (1, 5, 3))" - - val Q20 = "SELECT su_name, su_address " + - "FROM supplier, " + - "nation " + - "WHERE su_suppkey IN " + - "(SELECT pmod(s_i_id * s_w_id, 10000) " + - "FROM stock " + - "INNER JOIN item ON i_id = s_i_id " + - "INNER JOIN order_line ON ol_i_id = s_i_id " + - "WHERE ol_delivery_d > '2010-05-23 12:00:00' " + - "AND i_data LIKE 'co%' " + - "GROUP BY s_i_id, " + - "s_w_id, " + - "s_quantity HAVING 2*s_quantity > sum(ol_quantity)) " + - "AND su_nationkey = n_nationkey " + - "AND n_name = 'Germany' " + - "ORDER BY su_name" - - val Q21 = "SELECT su_name, " + - " count(*) AS numwait " + - "FROM supplier, " + - " order_line l1, " + - " orders, " + - " stock, " + - " nation " + - "WHERE ol_o_id = o_id " + - " AND ol_w_id = o_w_id " + - " AND ol_d_id = o_d_id " + - " AND ol_w_id = s_w_id " + - " AND ol_i_id = s_i_id " + - " AND pmod((s_w_id * s_i_id),10000) = su_suppkey " + - " AND l1.ol_delivery_d > o_entry_d " + - " AND NOT EXISTS " + - " (SELECT * " + - " FROM order_line l2 " + - " WHERE l2.ol_o_id = l1.ol_o_id " + - " AND l2.ol_w_id = l1.ol_w_id " + - " AND l2.ol_d_id = l1.ol_d_id " + - " AND l2.ol_delivery_d > l1.ol_delivery_d) " + - " AND su_nationkey = n_nationkey " + - " AND n_name = 'Germany' " + - "GROUP BY su_name " + - "ORDER BY numwait DESC, su_name " - - val Q22a = "SELECT avg(c_balance) " + - "FROM customer " + - "WHERE c_balance > 0.00 " + - "AND substring(c_phone,1,1) IN ('1', '2', '3', '4', '5', '6', '7')" - - val Q22b = "SELECT substring(c_state,1,1) AS country, " + - "count(*) AS numcust, " + - "sum(c_balance) AS totacctbal " + - "FROM customer left outer join orders on o_c_id = c_id " + - " AND o_w_id = c_w_id " + - " AND o_d_id = c_d_id " + - "WHERE substring(c_phone,1,1) IN ('1','2','3','4','5','6','7') " + - " AND c_balance > ? " + - " AND o_id is null " + - "GROUP BY substring(c_state,1,1) " + - "ORDER BY substring(c_state,1,1)" - - val queries = Map( - "Q1" -> Q1, - "Q2" -> Q2, - "Q3" -> Q3, - "Q4" -> Q4, - "Q5" -> Q5, - "Q6" -> Q6, - "Q7" -> Q7, - "Q8" -> Q8, - "Q9" -> Q9, - "Q10" -> Q10, - "Q11" -> Q11b, - "Q12" -> Q12, - "Q13" -> Q13, - "Q14" -> Q14, - "Q15" -> Q15c, - "Q16" -> Q16, - "Q17" -> Q17, - "Q18" -> Q18, - "Q19" -> Q19, - "Q20" -> Q20, - "Q21" -> Q21, - "Q22" -> Q22b - ) -} diff --git a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/OLAPStreamingBench.scala b/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/OLAPStreamingBench.scala deleted file mode 100644 index 1138389..0000000 --- a/spark-cassandra/src/main/scala/io/snappydata/benchmark/chbench/OLAPStreamingBench.scala +++ /dev/null @@ -1,185 +0,0 @@ -package io.snappydata.benchmark.chbench - -import java.io.PrintWriter - -import com.datastax.spark.connector.cql.CassandraConnector -import org.apache.log4j.{Level, Logger} -import org.apache.spark.sql.cassandra.CassandraSQLContext -import org.apache.spark.sql.types.{IntegerType, StructType, TimestampType} -import org.apache.spark.sql.{DataFrame, Row} -import org.apache.spark.streaming.{Duration, StreamingContext} -import org.apache.spark.{SparkConf, SparkContext} - -object OLAPStreamingBench extends App { - val rootLogger = Logger.getLogger("org"); - rootLogger.setLevel(Level.WARN); - - val host = "127.0.0.1" - val master = "local[*]" - val numWH = 10 - val memory = "8g" - - val conf = new SparkConf(true) - .setAppName(getClass.getSimpleName) - .set(s"spark.cassandra.connection.host", host) - .set("spark.cassandra.auth.username", "cassandra") - .set("spark.cassandra.auth.password", "cassandra") - .set("spark.cassandra.sql.keyspace", "tpcc") - .set("spark.driver.memory", memory) - .set("spark.executor.memory",memory) - .set("spark.executor.cores", "6") - .set("spark.driver.maxResultSize", "10g") - .set("spark.scheduler.mode", "FAIR") - .setMaster(master) - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - conf.set("spark.driver.extraClassPath", assemblyJar) - conf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(conf) - val cc = new CassandraSQLContext(sc) - val ssc = new StreamingContext(sc, Duration(2000)) - - cc.setKeyspace("tpcc") - CassandraConnector(conf).withSessionDo { session => - println("******* CONNECTED TO CASSANDRA **********") - } - cc.sql("set spark.sql.shuffle.partitions=64") - - val stream = ssc.receiverStream[ClickStreamCustomer]( - new BenchmarkingReceiver(10000, numWH, 10, 30000, 100000)) - - val schema = new StructType() - .add("cs_c_w_id", IntegerType) - .add("cs_c_d_id", IntegerType) - .add("cs_c_id", IntegerType) - .add("cs_i_id", IntegerType) - .add("cs_timespent", IntegerType) - .add("cs_click_d", TimestampType) - - val rows = stream.map(v => Row(v.w_id, - v.d_id, v.c_id, v.i_id, v.c_ts, new java.sql.Timestamp(System.currentTimeMillis))) - - val window_rows = rows.window(new Duration(60 * 1000), new Duration(60 * 1000)) - - window_rows.foreachRDD(rdd => { - val df = cc.createDataFrame(rdd, schema) - val outFileName = s"BenchmarkingStreamingJob-${System.currentTimeMillis()}.out" - val pw = new PrintWriter(outFileName) - val clickstreamlog = "benchmarking" + System.currentTimeMillis() - df.registerTempTable(clickstreamlog) - // Find out the items in the clickstream with - // price range greater than a particular amount. - var resultdfQ1: DataFrame = null - var resultdfQ2: DataFrame = null - cc.synchronized { - resultdfQ1 = cc.sql(s"select i_id, count(i_id) from " + - s" $clickstreamlog, item " + - " where i_id = cs_i_id " + - " AND i_price > 50 " + - " GROUP BY i_id "); - - // Find out which district's customer are currently more online active to - // stop tv commercials in those districts - resultdfQ2 = cc.sql("select avg(cs_timespent) as avgtimespent , cs_c_d_id " + - s"from $clickstreamlog group by cs_c_d_id order by avgtimespent") - } - - val sq1 = System.currentTimeMillis() - resultdfQ1.limit(10).collect().foreach(pw.println) - val endq1 = System.currentTimeMillis() - resultdfQ2.collect().foreach(pw.println) - val endq2 = System.currentTimeMillis() - val output = s"Q1 ${endq1 - sq1} Q2 ${endq2 - endq1}" - val tid = Thread.currentThread() - pw.println(s"$tid Time taken $output") - pw.close() - }) - - ssc.start - - def getCurrentDirectory = new java.io.File(".").getCanonicalPath - - // scalastyle:off println - - var i: Int = 0 - while (i < 4) { - val outFileName = s"HQueries-${i}.out" - - val pw = new PrintWriter(outFileName) - - i = i + 1 - for (q <- HQueries.queries) { - val start: Long = System.currentTimeMillis - val tid = Thread.currentThread() - try { - q._1 match { - case "Q11" => - var df : DataFrame = null - cc.synchronized { - df = cc.sql(HQueries.Q11a) - } - val ret = df.collect() - assert(ret.length == 1) - val paramVal = ret(0).getDecimal(0) - val qry = q._2.replace("?", paramVal.toString) - cc.synchronized { - df = cc.sql(qry) - } - df.collect() - case "Q15" => - var ret : DataFrame = null - cc.synchronized { - ret = cc.sql(HQueries.Q15a) - } - ret.registerTempTable("revenue") - var df : DataFrame = null - cc.synchronized { - df = cc.sql(HQueries.Q15b) - } - val maxV = df.collect() - val paramVal = maxV(0).getDouble(0) - val qry = q._2.replace("?", paramVal.toString) - cc.synchronized { - df = cc.sql(qry) - } - df.collect() - case "Q22" => - var df: DataFrame = null - cc.synchronized { - df = cc.sql(HQueries.Q22a) - } - val ret = df.collect() - assert(ret.length == 1) - val paramVal = ret(0).getDouble(0) - val qry = q._2.replace("?", paramVal.toString) - cc.synchronized { - df = cc.sql(qry) - } - df.collect() - case "Q16" | "Q20" | "Q21" => - pw.println(s"$tid Not running " + q._1) - pw.flush() - //cc.sql(q._2).collect() - case _ => - var df: DataFrame = null - cc.synchronized { - df = cc.sql(q._2) - } - df.collect() - } - } catch { - case e: Throwable => pw.println(s"$tid Exception for query ${q._1}: " + e) - } - val end: Long = System.currentTimeMillis - start - pw.println(s"${new java.util.Date(System.currentTimeMillis())} $tid Time taken by ${q._1} is $end") - pw.flush() - } - pw.close() - } - // // Return the output file name - // s"See ${getCurrentDirectory}" - ssc.awaitTermination -} diff --git a/spark-memsql/build.gradle b/spark-memsql/build.gradle deleted file mode 100644 index 32be270..0000000 --- a/spark-memsql/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -dependencies { - compileOnly "org.apache.spark:spark-core_2.10:1.5.2" - compileOnly "org.apache.spark:spark-streaming_2.10:1.5.2" - compileOnly "org.apache.spark:spark-streaming-kafka_2.10:1.5.2" - compileOnly "org.apache.spark:spark-sql_2.10:1.5.2" - compileOnly "org.apache.spark:spark-catalyst_2.10:1.5.2" - - compile project(':') - compile 'com.memsql:memsql-connector_2.10:1.3.2' -} - -task startMemSqlStreamIngestPerf(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.MemSqlStreamIngestPerf' - def filterGuava = sourceSets.test.runtimeClasspath.findAll { !it.getName().contains('guava-14') } - def guava19 = sourceSets.test.runtimeClasspath.findAll { it.getName().contains('guava-19') } - classpath filterGuava - environment 'PROJECT_ASSEMBLY_JAR', "${guava19[0]}:${assemblyJar.files.asPath}" -} diff --git a/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlQueryPerf.scala b/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlQueryPerf.scala deleted file mode 100644 index 980d4bf..0000000 --- a/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlQueryPerf.scala +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import com.memsql.spark.connector.MemSQLContext -import io.snappydata.adanalytics.Configs._ -import org.apache.log4j.{Level, Logger} -import org.apache.spark.{SparkConf, SparkContext} - -object MemSqlQueryPerf extends App { - - val rootLogger = Logger.getLogger("org"); - rootLogger.setLevel(Level.WARN); - - val conf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - conf.set("spark.driver.extraClassPath", assemblyJar) - conf.set("spark.executor.extraClassPath", assemblyJar) - } - conf.set("memsql.defaultDatabase", "adLogs") - - val sc = new SparkContext(conf) - val msc = new MemSQLContext(sc) - - var start = System.currentTimeMillis() - msc.sql("select count(*) AS adCount, geo from adImpressions group" + - " by geo order by adCount desc limit 20").collect() - println("Time for Q1 " + (System.currentTimeMillis() - start)) - - start = System.currentTimeMillis() - msc.sql("select sum (bid) as max_bid, geo from adImpressions group" + - " by geo order by max_bid desc limit 20").collect() - println("Time for Q2 " + (System.currentTimeMillis() - start)) - - start = System.currentTimeMillis() - msc.sql("select sum (bid) as max_bid, publisher from adImpressions" + - " group by publisher order by max_bid desc limit 20").collect() - println("Time for Q3 " + (System.currentTimeMillis() - start)) - -} - - diff --git a/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlStreamIngestPerf.scala b/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlStreamIngestPerf.scala deleted file mode 100644 index 5bfb569..0000000 --- a/spark-memsql/src/main/scala/io/snappydata/benchmark/MemSqlStreamIngestPerf.scala +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import com.memsql.spark.connector.MemSQLContext -import io.snappydata.adanalytics.{Configs, AdImpressionLogToRowRDD, AdImpressionLogAvroDecoder} -import Configs._ -import io.snappydata.adanalytics.AdImpressionLog -import kafka.serializer.StringDecoder -import org.apache.spark.streaming.StreamingContext -import org.apache.spark.streaming.kafka.KafkaUtils -import org.apache.spark.{SparkConf, SparkContext} - -/** - * Simple direct kafka spark streaming program which pulls log messages - * from kafka broker and ingest those log messages to MemSql using - * Spark MemSql Connector. To run this program you need to - * start an aggregator and leaf node of MemSql and run Spark in local mode. - */ -object MemSqlStreamIngestPerf extends App { - - val conf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - .set("spark.executor.cores", "6") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - conf.set("spark.driver.extraClassPath", assemblyJar) - conf.set("spark.executor.extraClassPath", assemblyJar) - } - conf.set("memsql.defaultDatabase", "adLogs") - - val sc = new SparkContext(conf) - val msc = new MemSQLContext(sc) - - import com.memsql.spark.connector.util.JDBCImplicits._ - - msc.getMemSQLCluster.withMasterConn(conn => { - conn.withStatement(stmt => { - // Create database and table in MemSql - stmt.execute(s"CREATE DATABASE IF NOT EXISTS adLogs") - stmt.execute(s"DROP TABLE IF EXISTS adLogs.adImpressions") - stmt.execute( - s""" - CREATE TABLE adLogs.adImpressions - (timestamp bigint, - publisher varchar(15), - advertiser varchar(15), - website varchar(20), - geo varchar(4), - bid double, - cookie varchar(20), - KEY (`timestamp`) USING CLUSTERED COLUMNSTORE, - SHARD KEY (timestamp)) - """) - }) - }) - - // batchDuration of 1 second - val ssc = new StreamingContext(sc, batchDuration) - - val schema = msc.table("adLogs.adImpressions").schema - - val rowConverter = new AdImpressionLogToRowRDD - - import com.memsql.spark.connector._ - - // Creates a stream of AdImpressionLog using kafka direct that pulls - // messages from a Kafka Broker - val messages = KafkaUtils.createDirectStream - [String, AdImpressionLog, StringDecoder, AdImpressionLogAvroDecoder](ssc, kafkaParams, topics) - - // transform the Spark RDDs as per the table schema and save it to MemSql - messages.map(_._2).foreachRDD(rdd => { - msc.createDataFrame(rowConverter.convert(rdd), schema) - .saveToMemSQL("adLogs", "adImpressions") - }) - - ssc.start - ssc.awaitTermination -} - - From 44e94e4996c7380b01459dc2590f80725846bddc Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Tue, 22 Oct 2019 17:11:41 +0530 Subject: [PATCH 02/30] - SnappyAPILogAggregator class contains the structured streaming job for ad analytics. - Upgraded the producer to kafka 10 - removed async producer class as with new version of kafka by default the producer is async - cleaning up code which is not used anymore --- build.gradle | 27 ++-- settings.gradle | 2 +- .../AdImpressionLogAvroDeserializer.scala | 17 +++ .../AdImpressionLogAvroSerializer.scala | 29 ++++ .../io/snappydata/adanalytics/Codec.scala | 94 ------------ .../KafkaAdImpressionProducer.scala | 37 +++-- .../adanalytics/SnappyAPILogAggregator.scala | 135 ++++++++++++------ .../SnappyAPILogAggregatorJob.scala | 85 ----------- .../adanalytics/SnappySQLLogAggregator.scala | 116 --------------- .../SnappySQLLogAggregatorJob.scala | 92 ------------ .../CustomReceiverSnappyIngestionPerf.scala | 82 ----------- .../KafkaAdImpressionAsyncProducer.scala | 85 ----------- 12 files changed, 182 insertions(+), 619 deletions(-) create mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala create mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/Codec.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregatorJob.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregatorJob.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/CustomReceiverSnappyIngestionPerf.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/KafkaAdImpressionAsyncProducer.scala diff --git a/build.gradle b/build.gradle index 6001302..18abbb5 100644 --- a/build.gradle +++ b/build.gradle @@ -8,14 +8,13 @@ archivesBaseName = 'snappy-poc' allprojects { - version = '1.0.0' + version = '1.1.1' repositories { + mavenLocal() mavenCentral() maven { url "https://oss.sonatype.org/content/groups/public" } maven { url "https://oss.sonatype.org/content/repositories/snapshots" } - maven { url "http://repository.snappydata.io/repository/internal" } - maven { url "http://repository.snappydata.io/repository/snapshots" } maven { url "http://mvnrepository.com/artifact" } maven { url 'https://clojars.org/repo' } } @@ -28,8 +27,8 @@ allprojects { apply plugin: "com.commercehub.gradle.plugin.avro" ext { - sparkVersion = '2.0.1-3' - snappyVersion = '1.0.0' + sparkVersion = '2.1.1.7' + snappyVersion = '1.1.1' } configurations.all { @@ -44,15 +43,21 @@ allprojects { } dependencies { - compileOnly "io.snappydata:snappydata-core_2.11:${snappyVersion}" - compileOnly "io.snappydata:snappydata-cluster_2.11:${snappyVersion}" - compileOnly "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" - compileOnly "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" - compileOnly "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" + //todo[vatsal]: following five dependencies are kept as compile dependencies + // cause generateAdImpressions target is failing when these dependencies + // are made compileOnly. Figure out a way to make generateAdImpressions + // without making these as compile dependencies because making these + // dependencies compile increases the size of the uber jar. + compile "io.snappydata:snappydata-core_2.11:${snappyVersion}" + compile "io.snappydata:snappydata-cluster_2.11:${snappyVersion}" + compile "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" + compile "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" + compile "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" // compileOnly "io.snappydata:snappydata-aqp_2.11:${snappyVersion}" + compile 'org.apache.kafka:kafka-clients:0.10.0.1' compile 'com.miguno:kafka-avro-codec_2.10:0.1.1-SNAPSHOT' - compile 'org.apache.kafka:kafka_2.11:0.8.2.1' + compile 'org.apache.kafka:kafka_2.11:0.10.0.1' compile 'com.twitter:algebird-core_2.10:0.1.11' compile 'com.googlecode.javaewah:JavaEWAH:1.1.5' compile 'org.joda:joda-convert:1.2' diff --git a/settings.gradle b/settings.gradle index 553809b..7b093e8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'spark-memsql', 'spark-cassandra', 'rabbitmq-snappy', 'assembly' +include 'assembly' diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala new file mode 100644 index 0000000..3ab8f25 --- /dev/null +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala @@ -0,0 +1,17 @@ +//todo[vatsal]: add appropreate copyright header +package io.snappydata.adanalytics + +import org.apache.avro.io.{BinaryDecoder, DecoderFactory} +import org.apache.avro.specific.SpecificDatumReader + +object AdImpressionLogAvroDeserializer { + lazy val datumReader = new SpecificDatumReader[AdImpressionLog](AdImpressionLog.getClassSchema) + val decoder = new ThreadLocal[BinaryDecoder] + val adImpressionLog = new ThreadLocal[AdImpressionLog] + + def deserialize(data: Array[Byte]): AdImpressionLog = { + decoder.set(DecoderFactory.get.binaryDecoder(data, decoder.get())) + adImpressionLog.set(datumReader.read(adImpressionLog.get(), decoder.get())) + adImpressionLog.get() + } +} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala new file mode 100644 index 0000000..5d061a1 --- /dev/null +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala @@ -0,0 +1,29 @@ +//todo[vatsal]: add appropreate copyright header +package io.snappydata.adanalytics + +import java.io.ByteArrayOutputStream +import java.util + +import io.snappydata.adanalytics.AdImpressionLogAvroSerializer.{binaryEncoder, datumWriter} +import org.apache.avro.generic.GenericDatumWriter +import org.apache.avro.io.{BinaryEncoder, EncoderFactory} + +class AdImpressionLogAvroSerializer extends org.apache.kafka.common.serialization.Serializer[AdImpressionLog] { + override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} //no op + + override def serialize(topic: String, data: AdImpressionLog): Array[Byte] = { + val byteArrayOutputStream = new ByteArrayOutputStream() + binaryEncoder.set(EncoderFactory.get.binaryEncoder(byteArrayOutputStream, binaryEncoder.get)) + datumWriter.write(data, binaryEncoder.get()) + binaryEncoder.get().flush() + byteArrayOutputStream.close() + byteArrayOutputStream.toByteArray + } + + override def close(): Unit = {} //no op +} + +object AdImpressionLogAvroSerializer { + val binaryEncoder = new ThreadLocal[BinaryEncoder] + lazy val datumWriter = new GenericDatumWriter[AdImpressionLog](AdImpressionLog.SCHEMA$) +} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/Codec.scala b/src/main/scala/io/snappydata/adanalytics/Codec.scala deleted file mode 100644 index 97d3910..0000000 --- a/src/main/scala/io/snappydata/adanalytics/Codec.scala +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.adanalytics - -import com.miguno.kafka.avro.{AvroDecoder, AvroEncoder} -import kafka.utils.VerifiableProperties -import org.apache.avro.io.DecoderFactory -import org.apache.avro.specific.SpecificDatumReader -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.Row -import org.apache.spark.sql.streaming.{StreamConverter, StreamToRowsConverter} - -class AdImpressionLogAvroEncoder(props: VerifiableProperties = null) - extends AvroEncoder[AdImpressionLog](props, AdImpressionLog.getClassSchema) - -class AdImpressionLogAvroDecoder(props: VerifiableProperties = null) - extends AvroDecoder[AdImpressionLog](props, AdImpressionLog.getClassSchema) - -class AdImpressionToRowsConverter extends StreamToRowsConverter with Serializable { - - override def toRows(message: Any): Seq[Row] = { - val log = message.asInstanceOf[AdImpressionLog] - Seq(Row.fromSeq(Seq( - new java.sql.Timestamp(log.getTimestamp), - log.getPublisher.toString, - log.getAdvertiser.toString, - log.getWebsite.toString, - log.getGeo.toString, - log.getBid, - log.getCookie.toString))) - } -} - -/** - * Convertes Spark RDD[AdImpressionLog] to RDD[Row] - * to insert into table - */ -class AdImpressionLogToRowRDD extends Serializable { - - def convert(logRdd: RDD[AdImpressionLog]): RDD[Row] = { - logRdd.map(log => { - Row(log.getTimestamp, - log.getPublisher.toString, - log.getAdvertiser.toString, - log.getWebsite.toString, - log.getGeo.toString, - log.getBid, - log.getCookie.toString) - }) - } -} - - -class AvroSocketStreamConverter extends StreamConverter with Serializable { - override def convert(inputStream: java.io.InputStream): Iterator[AdImpressionLog] = { - val reader = new SpecificDatumReader[AdImpressionLog](AdImpressionLog.getClassSchema) - val decoder = DecoderFactory.get().directBinaryDecoder(inputStream, null) - new Iterator[AdImpressionLog] { - - val log: AdImpressionLog = new AdImpressionLog() - var nextVal = log - nextVal = reader.read(nextVal, decoder) - - override def hasNext: Boolean = nextVal != null - - override def next(): AdImpressionLog = { - val n = nextVal - if (n ne null) { - nextVal = reader.read(nextVal, decoder) - n - } else { - throw new NoSuchElementException() - } - } - } - } - - override def getTargetType: scala.Predef.Class[_] = classOf[AdImpressionLog] -} diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index 066c7a2..f69e637 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -18,26 +18,28 @@ package io.snappydata.adanalytics import java.util.Properties +import java.util.concurrent.Future import io.snappydata.adanalytics.Configs._ -import kafka.producer.{KeyedMessage, Producer, ProducerConfig} import io.snappydata.adanalytics.KafkaAdImpressionProducer._ +import org.apache.hadoop.ipc.RetriableException +import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord, RecordMetadata} /** * A simple Kafka Producer program which randomly generates * ad impression log messages and sends it to Kafka broker. * This program generates and sends 10 million messages. + * + * Note that this producer sends messages on Kafka in async manner. */ -object KafkaAdImpressionProducer{ +object KafkaAdImpressionProducer { val props = new Properties() - props.put("serializer.class", "io.snappydata.adanalytics.AdImpressionLogAvroEncoder") - props.put("partitioner.class", "kafka.producer.DefaultPartitioner") - props.put("key.serializer.class", "kafka.serializer.StringEncoder") - props.put("metadata.broker.list", brokerList) + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") + props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAvroSerializer") + props.put("bootstrap.servers", "localhost:9092") - val config = new ProducerConfig(props) - val producer = new Producer[String, AdImpressionLog](config) + val producer = new KafkaProducer[String, AdImpressionLog](props) def main(args: Array[String]) { println("Sending Kafka messages of topic " + kafkaTopic + " to brokers " + brokerList) @@ -52,9 +54,20 @@ object KafkaAdImpressionProducer{ System.exit(0) } - def sendToKafka(log: AdImpressionLog) = { - producer.send(new KeyedMessage[String, AdImpressionLog]( - Configs.kafkaTopic, log.getTimestamp.toString, log)) + def sendToKafka(log: AdImpressionLog): Future[RecordMetadata] = { + producer.send(new ProducerRecord[String, AdImpressionLog]( + Configs.kafkaTopic, log.getTimestamp.toString, log), new org.apache.kafka.clients.producer.Callback() { + override def onCompletion(metadata: RecordMetadata, exception: Exception): Unit = { + if (exception != null) { + if (exception.isInstanceOf[RetriableException]) { + println(s"Encountered a retriable exception while sending messages: $exception") + } else { + throw exception + } + } + } + } + ) } } @@ -71,7 +84,7 @@ final class Worker extends Runnable { if (timeRemaining > 0) { Thread.sleep(timeRemaining) } - if (j !=0 & (j % 200000) == 0) { + if (j != 0 & (j % 200000) == 0) { println(s" ${Thread.currentThread().getName} sent $j Kafka messages" + s" of topic $kafkaTopic to brokers $brokerList ") } diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala index b33a161..f369b96 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala @@ -17,24 +17,26 @@ package io.snappydata.adanalytics +import com.typesafe.config.{Config, ConfigFactory} import io.snappydata.adanalytics.Configs._ -import kafka.serializer.StringDecoder -import org.apache.spark.sql.Row -import org.apache.spark.sql.streaming.SchemaDStream -import org.apache.spark.streaming.kafka.KafkaUtils -import org.apache.spark.streaming.{Duration, SnappyStreamingContext} +import org.apache.kafka.common.serialization.ByteArrayDeserializer +import org.apache.spark.sql._ +import org.apache.spark.sql.catalyst.encoders.RowEncoder +import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, window} +import org.apache.spark.sql.types._ import org.apache.spark.{SparkConf, SparkContext} /** - * Example using Spark API + Snappy extension to model a Stream as a DataFrame. - * The Spark driver and executors run in local mode and simply use Snappy - * cluster as the data store. - */ -object SnappyAPILogAggregator extends App { + * Example using Spark API + Snappy extension to model a Stream as a DataFrame. + * + * This example can be run either in local mode or can be submitted as a job + * to an already running SnappyData cluster. + */ +object SnappyAPILogAggregator extends SnappySQLJob with App { val conf = new SparkConf() .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") // local split + .setMaster(s"$sparkMasterURL") .set("snappydata.store.locators", s"$snappyLocators") .set("spark.ui.port", "4041") .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") @@ -48,43 +50,94 @@ object SnappyAPILogAggregator extends App { } val sc = new SparkContext(conf) - val ssc = new SnappyStreamingContext(sc, batchDuration) + private val snappy = new SnappySession(sc) - // The volumes are low. Optimize Spark shuffle by reducing the partition count - ssc.sql("set spark.sql.shuffle.partitions=8") + runSnappyJob(snappy, ConfigFactory.empty()) - // stream of (topic, ImpressionLog) - val messages = KafkaUtils.createDirectStream - [String, AdImpressionLog, StringDecoder, AdImpressionLogAvroDecoder](ssc, kafkaParams, topics) + /** Contains the implementation of the Job, Snappy uses this as + * an entry point to execute Snappy job + */ + override def runSnappyJob(snappy: SnappySession, jobConfig: Config): Any = { - // Filter out bad messages ...use a second window - val logs = messages.map(_._2).filter(_.getGeo != Configs.UnknownGeo) - .window(Duration(1000), Duration(1000)) + // The volumes are low. Optimize Spark shuffle by reducing the partition count + snappy.sql("set spark.sql.shuffle.partitions=8") - // We want to process the stream as a DataFrame/Table ... easy to run - // analytics on stream ...will be standard part of Spark 2.0 (Structured - // streaming) - val rows = logs.map(v => Row(new java.sql.Timestamp(v.getTimestamp), v.getPublisher.toString, - v.getAdvertiser.toString, v.getWebsite.toString, v.getGeo.toString, v.getBid, v.getCookie.toString)) + import org.apache.spark.sql.streaming.ProcessingTime + snappy.sql("drop table if exists adImpressionStream") + snappy.sql("drop table if exists sampledAdImpressions") + snappy.sql("drop table if exists aggrAdImpressions") - val logStreamAsTable : SchemaDStream = ssc.createSchemaDStream(rows, getAdImpressionSchema) + snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + + " geo string, avg_bid double, imps long, uniques long) " + + "using column options(buckets '11')") + val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), + StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), + StructField("bid", DoubleType), StructField("cookie", StringType))) - import org.apache.spark.sql.functions._ + def binaryToRowConverter: Array[Byte] => Row = { + v => { + val adImpressionLog = AdImpressionLogAvroDeserializer.deserialize(v) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, + adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + } + } - /** - * We want to execute the following analytic query ... using the DataFrame - * API ... - * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques - * from AdImpressionLog group by publisher, geo, timestamp" - */ - logStreamAsTable.foreachDataFrame(df => { - val df1 = df.groupBy("publisher", "geo", "timestamp") + val df = snappy.readStream + .format("kafka") + .option("kafka.bootstrap.servers", brokerList) + .option("value.deserializer", classOf[ByteArrayDeserializer].getName) + .option("startingOffsets", "earliest") + .option("maxOffsetsPerTrigger", 10000) + .option("subscribe", kafkaTopic) + .load().select("value").as[Array[Byte]](Encoders.BINARY) + .map(binaryToRowConverter)(RowEncoder.apply(schema)) + .filter(s"geo != '${Configs.UnknownGeo}'") + + // Group by on sliding window of 1 second + val windowedDF = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), + df.col("publisher"), df.col("geo")) .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), - countDistinct("cookie").alias("uniques")) - df1.show() - }) + approx_count_distinct("cookie").alias("uniques")) + + val logStream = windowedDF.select("window.start", "publisher", "geo", "avg_bid", "imps", "uniques") + .writeStream + .format("snappysink") + .queryName("log_stream1") + .trigger(ProcessingTime("1 seconds")) + .option("tableName","aggrAdImpressions") + .option("checkpointLocation", this.getClass.getCanonicalName) + .outputMode("update") + .start - // start rolling! - ssc.start - ssc.awaitTermination + logStream.awaitTermination() + } + + override def isValidJob(snappy: SnappySession, config: Config): SnappyJobValidation = { + SnappyJobValid() + } } + + +//todo[vatsal]: remove this code after final testing +// +///** +// * We want to execute the following analytic query on each batch dataframe: +// * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques +// * from AdImpressionLog group by publisher, geo, timestamp +// */ +//class CustomSinkCallback1 extends SnappySinkCallback { +// override def process(snappySession: SnappySession, sinkProps: Map[String, String], batchId: Long, +// df: Dataset[Row], possibleDuplicate: Boolean): Unit = { +// +//// df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds") +//// , df.col("timestamp"), df.col("publisher"), df.col("geo")).agg() +// val frame = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), +// df.col("timestamp"), df.col("publisher"), df.col("geo")) +// .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), +// countDistinct("cookie").alias("uniques")) +// frame.show +// frame.select("timestamp","publisher", "geo", "avg_bid", "imps", "uniques") +// .write.insertInto("aggrAdImpressions") +// } +//} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregatorJob.scala b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregatorJob.scala deleted file mode 100644 index 34bf0f5..0000000 --- a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregatorJob.scala +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.adanalytics - -import com.typesafe.config.Config -import io.snappydata.adanalytics.Configs._ -import kafka.serializer.StringDecoder -import org.apache.spark.sql.streaming.{SchemaDStream, SnappyStreamingJob} -import org.apache.spark.sql.{Row, SnappyJobValid, SnappyJobValidation} -import org.apache.spark.streaming.kafka.KafkaUtils -import org.apache.spark.streaming.{Seconds, SnappyStreamingContext} - -/** - * Same as SnappyAPILogAggregator except this streaming job runs in the data - * store cluster. By implementing a SnappyStreamingJob we allow this program - * to run managed in the snappy cluster. - * Here we use Snappy SQL extensions to process a stream as - * micro-batches of DataFrames instead of using the Spark Streaming API based - * on RDDs. This is similar to what we will see in Spark 2.0 (Structured - * streaming). - * - * Run this program using bin/snappy-job.sh - */ -class SnappyAPILogAggregatorJob extends SnappyStreamingJob { - - /** contains the implementation of the Job, Snappy uses this as - * an entry point to execute Snappy job - */ - override def runSnappyJob(snsc: SnappyStreamingContext, jobConfig: Config): Any = { - - // The volumes are low. Optimize Spark shuffle by reducing the partition count - snsc.sql("set spark.sql.shuffle.partitions=8") - - // stream of (topic, ImpressionLog) - val messages = KafkaUtils.createDirectStream - [String, AdImpressionLog, StringDecoder, AdImpressionLogAvroDecoder](snsc, kafkaParams, topics) - - // Filter out bad messages ...use a 1 second window - val logs = messages.map(_._2).filter(_.getGeo != Configs.UnknownGeo) - .window(Seconds(1), Seconds(1)) - - // Best to operate stream as a DataFrame/Table ... easy to run analytics on stream - val rows = logs.map(v => Row(new java.sql.Timestamp(v.getTimestamp), v.getPublisher.toString, - v.getAdvertiser.toString, v.getWebsite.toString, v.getGeo.toString, v.getBid, v.getCookie.toString)) - - val logStreamAsTable : SchemaDStream = snsc.createSchemaDStream(rows, getAdImpressionSchema) - - import org.apache.spark.sql.functions._ - - /** - * We want to execute the following analytic query ... using the DataFrame - * API ... - * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques - * from AdImpressionLog group by publisher, geo, timestamp" - */ - logStreamAsTable.foreachDataFrame(df => { - val df1 = df.groupBy("publisher", "geo", "timestamp") - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), - countDistinct("cookie").alias("uniques")) - df1.show() - }) - - snsc.start() - snsc.awaitTermination() - } - - override def isValidJob(snsc: SnappyStreamingContext, config: Config): SnappyJobValidation = { - SnappyJobValid() - } -} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala deleted file mode 100644 index 43b5ce6..0000000 --- a/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.adanalytics - -import io.snappydata.adanalytics.Configs._ -import org.apache.spark.SparkContext -import org.apache.spark.sql.streaming.SchemaDStream -import org.apache.spark.streaming.SnappyStreamingContext - -/** - * We use Snappy SQL extensions to process a stream as - * micro-batches of DataFrames instead of using the Spark Streaming API based - * on RDDs. This is similar to what we will see in Spark 2.0 (Structured - * streaming). - * - * Not only does the use of SQL permit optimizations in the spark engine but - * we make the Stream visible as a Table to external clients. For instance, - * you can connect using JDBC and run a query on the stream table. - * - * This program will run in a standalong JVM and connect to the Snappy - * cluster as the data store. - */ -object SnappySQLLogAggregator extends App { - - val sparkConf = new org.apache.spark.SparkConf() - .setAppName(getClass.getSimpleName) - .set("spark.sql.inMemoryColumnarStorage.compressed", "false") - .set("spark.sql.inMemoryColumnarStorage.batchSize", "2000") - .setMaster(s"$sparkMasterURL") - .set("snappydata.store.locators", s"$snappyLocators") - .set("spark.ui.port", "4041") - .set("spark.streaming.kafka.maxRatePerPartition", s"$maxRatePerPartition") - - // add the "assembly" jar to executor classpath - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - sparkConf.set("spark.driver.extraClassPath", assemblyJar) - sparkConf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(sparkConf) - val snsc = new SnappyStreamingContext(sc, batchDuration) - - //Spark tip : Keep shuffle count low when data volume is low. - snsc.sql("set spark.sql.shuffle.partitions=8") - - snsc.sql("drop table if exists aggrAdImpressions") - snsc.sql("drop table if exists sampledAdImpressions") - snsc.sql("drop table if exists adImpressionStream") - - /** - * Create a stream over the Kafka source. The messages are converted to Row - * objects and comply with the schema defined in the 'create' below. - * This is mostly just a SQL veneer over Spark Streaming. The stream table - * is also automatically registered with the SnappyData catalog so external - * clients can see this stream as a table - */ - snsc.sql("create stream table adImpressionStream (" + - " time_stamp timestamp," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using directkafka_stream options(" + - " rowConverter 'io.snappydata.adanalytics.AdImpressionToRowsConverter' ," + - s" kafkaParams 'metadata.broker.list->$brokerList;auto.offset.reset->smallest'," + - s" topics '$kafkaTopic'," + - " K 'java.lang.String'," + - " V 'io.snappydata.adanalytics.AdImpressionLog', " + - " KD 'kafka.serializer.StringDecoder', " + - " VD 'io.snappydata.adanalytics.AdImpressionLogAvroDecoder')") - - // Next, create the Column table where we ingest all our data into. - snsc.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + - " geo string, avg_bid double, imps long, uniques long) " + - "using column options(buckets '11')") - // You can make these tables persistent, add partitioned keys, replicate - // for HA, overflow to HDFS, etc, etc. ... Read the docs. - - snsc.sql("CREATE SAMPLE TABLE sampledAdImpressions" + - " OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") - - // Execute this query once every second. Output is a SchemaDStream. - val resultStream : SchemaDStream = snsc.registerCQ( - "select time_stamp, publisher, geo, avg(bid) as avg_bid," + - " count(*) as imps , count(distinct(cookie)) as uniques" + - " from adImpressionStream window (duration 1 seconds, slide 1 seconds)"+ - " where geo != 'unknown' group by publisher, geo, time_stamp") - - resultStream.foreachDataFrame( df => { - df.write.insertInto("aggrAdImpressions") - }) - // Above we use the Spark Data Source API to write to our Column table. - // This will automatically localize the partitions in the data store. No - // Shuffling. - - snsc.start() - snsc.awaitTermination() -} diff --git a/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregatorJob.scala b/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregatorJob.scala deleted file mode 100644 index 53d3337..0000000 --- a/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregatorJob.scala +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.adanalytics - -import com.typesafe.config.Config -import io.snappydata.adanalytics.Configs._ -import org.apache.spark.sql.streaming.{SchemaDStream, SnappyStreamingJob} -import org.apache.spark.sql.{SnappyJobValid, SnappyJobValidation} -import org.apache.spark.streaming.{Seconds, SnappyStreamingContext} - -/** - * Same as SnappySQLogAggregator except this streaming job runs in the data - * store cluster. By implementing a SnappyStreamingJob we allow this program - * to run managed in the snappy cluster. - * Here we use Snappy SQL to process a stream as - * micro-batches of DataFrames instead of using the Spark Streaming API based - * on RDDs. This is similar to what we will see in Spark 2.0 (Structured - * streaming). - * - * Run this program using bin/snappy-job.sh - */ -class SnappySQLLogAggregatorJob extends SnappyStreamingJob { - - override def runSnappyJob(snsc: SnappyStreamingContext, jobConfig: Config): Any = { - - //Spark tip : Keep shuffle count low when data volume is low. - snsc.sql("set spark.sql.shuffle.partitions=8") - - snsc.sql("drop table if exists adImpressionStream") - snsc.sql("drop table if exists sampledAdImpressions") - snsc.sql("drop table if exists aggrAdImpressions") - - snsc.sql("create stream table adImpressionStream (" + - " time_stamp timestamp," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using directkafka_stream options(" + - " rowConverter 'io.snappydata.adanalytics.AdImpressionToRowsConverter' ," + - s" kafkaParams 'metadata.broker.list->$brokerList;auto.offset.reset->smallest'," + - s" topics '$kafkaTopic'," + - " K 'java.lang.String'," + - " V 'io.snappydata.adanalytics.AdImpressionLog', " + - " KD 'kafka.serializer.StringDecoder', " + - " VD 'io.snappydata.adanalytics.AdImpressionLogAvroDecoder')") - - // Next, create the Column table where we ingest all our data into. - snsc.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + - " geo string, avg_bid double, imps long, uniques long) " + - "using column options(buckets '11')") - - snsc.sql("CREATE SAMPLE TABLE sampledAdImpressions" + - " OPTIONS(qcs 'geo,publisher', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") - - // Execute this query once every second. Output is a SchemaDStream. - val resultStream: SchemaDStream = snsc.registerCQ( - "select min(time_stamp), publisher, geo, avg(bid) as avg_bid," + - " count(*) as imps , count(distinct(cookie)) as uniques" + - " from adImpressionStream window (duration 1 seconds, slide 1 seconds)" + - " where geo != 'unknown' group by publisher, geo") - - resultStream.foreachDataFrame(df => { - df.write.insertInto("aggrAdImpressions") - df.write.insertInto("sampledAdImpressions") - }) - - snsc.start() - snsc.awaitTermination() - } - - override def isValidJob(snsc: SnappyStreamingContext, config: Config): SnappyJobValidation = { - SnappyJobValid() - } -} diff --git a/src/main/scala/io/snappydata/benchmark/CustomReceiverSnappyIngestionPerf.scala b/src/main/scala/io/snappydata/benchmark/CustomReceiverSnappyIngestionPerf.scala deleted file mode 100644 index 17dc435..0000000 --- a/src/main/scala/io/snappydata/benchmark/CustomReceiverSnappyIngestionPerf.scala +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import io.snappydata.adanalytics.{Configs, AdImpressionGenerator} -import Configs._ -import io.snappydata.adanalytics.AdImpressionLog -import org.apache.spark.sql.Row -import org.apache.spark.storage.StorageLevel -import org.apache.spark.streaming.SnappyStreamingContext -import org.apache.spark.streaming.receiver.Receiver -import org.apache.spark.{SparkConf, SparkContext} - -object CustomReceiverSnappyIngestionPerf extends App { - - val sparkConf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - sparkConf.set("spark.driver.extraClassPath", assemblyJar) - sparkConf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(sparkConf) - val snsc = new SnappyStreamingContext(sc, batchDuration) - - snsc.snappyContext.dropTable("adImpressions", ifExists = true) - - val stream = snsc.receiverStream[AdImpressionLog](new AdImpressionReceiver) - - val rows = stream.map(v => Row(new java.sql.Timestamp(v.getTimestamp), v.getPublisher.toString, - v.getAdvertiser.toString, v.getWebsite.toString, v.getGeo.toString, v.getBid, v.getCookie.toString)) - - val logStreamAsTable = snsc.createSchemaDStream(rows, getAdImpressionSchema) - - snsc.snappyContext.createTable("adImpressions", "column", getAdImpressionSchema, - Map("buckets" -> "29")) - - logStreamAsTable.foreachDataFrame(_.write.insertInto("adImpressions")) - - snsc.start() - snsc.awaitTermination() - -} - - -final class AdImpressionReceiver extends Receiver[AdImpressionLog](StorageLevel.MEMORY_AND_DISK_2) { - override def onStart() { - new Thread("AdImpressionReceiver") { - override def run() { - receive() - } - }.start() - } - - override def onStop() { - } - - private def receive() { - while (!isStopped()) { - store(AdImpressionGenerator.nextRandomAdImpression()) - } - } -} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/benchmark/KafkaAdImpressionAsyncProducer.scala b/src/main/scala/io/snappydata/benchmark/KafkaAdImpressionAsyncProducer.scala deleted file mode 100644 index e5f1571..0000000 --- a/src/main/scala/io/snappydata/benchmark/KafkaAdImpressionAsyncProducer.scala +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import java.util.Properties - -import io.snappydata.adanalytics.Configs._ -import io.snappydata.adanalytics.KafkaAdImpressionProducer._ -import io.snappydata.adanalytics.{AdImpressionGenerator, AdImpressionLog, Configs} -import kafka.producer.{KeyedMessage, Producer, ProducerConfig} - -/** - * A simple Kafka Producer program which randomly generates - * ad impression log messages and sends it to Kafka broker. - * This program generates and sends 10 million messages. - */ -object KafkaAdImpressionAsyncProducer{ - - val props = new Properties() - props.put("producer.type", "async") - props.put("request.required.acks", "0") - props.put("serializer.class", "io.snappydata.adanalytics.AdImpressionLogAvroEncoder") - props.put("queue.buffering.max.messages", "1000000") // 10000 - props.put("metadata.broker.list", brokerList) - props.put("partitioner.class", "kafka.producer.DefaultPartitioner") - props.put("key.serializer.class", "kafka.serializer.StringEncoder") - props.put("batch.size", "9000000") // bytes - props.put("linger.ms", "50") - - val config = new ProducerConfig(props) - val producer = new Producer[String, AdImpressionLog](config) - - def main(args: Array[String]) { - println("Sending Kafka messages of topic " + kafkaTopic + " to brokers " + brokerList) - val threads = new Array[Thread](numProducerThreads) - for (i <- 0 until numProducerThreads) { - val thread = new Thread(new Worker()) - thread.start() - threads(i) = thread - } - threads.foreach(_.join()) - println(s"Done sending $numLogsPerThread Kafka messages of topic $kafkaTopic") - System.exit(0) - } - - def sendToKafka(log: AdImpressionLog) = { - producer.send(new KeyedMessage[String, AdImpressionLog]( - Configs.kafkaTopic, log.getTimestamp.toString, log)) - } -} - -final class Worker extends Runnable { - def run() { - for (j <- 0 to numLogsPerThread by maxLogsPerSecPerThread) { - val start = System.currentTimeMillis() - for (i <- 0 to maxLogsPerSecPerThread) { - sendToKafka(AdImpressionGenerator.nextRandomAdImpression()) - } - // If one second hasn't elapsed wait for the remaining time - // before queueing more. - val timeRemaining = 1000 - (System.currentTimeMillis() - start) - if (timeRemaining > 0) { - Thread.sleep(timeRemaining) - } - if (j !=0 & (j % 200000) == 0) { - println(s"Sent $j Kafka messages of topic $kafkaTopic") - } - } - } -} From a341625aeb4c1dabfcb3f56e68964c4b87949f1f Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Tue, 22 Oct 2019 19:35:57 +0530 Subject: [PATCH 03/30] [SNAP-3195] Exposing `spark.sql.constraintPropagation.enabled` config to disable optimization rules related to constraint propagation. Cherry-picked from e011004bedca47be998a0c14fe22a6f9bb5090cd and resolved merge conflicts. --- .../adanalytics/SparkLogAggregator.scala | 146 +++++++++--------- 1 file changed, 74 insertions(+), 72 deletions(-) diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 7e7b4d0..7277492 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,72 +1,74 @@ -package io.snappydata.adanalytics - -import com.twitter.algebird.{HLL, HyperLogLogMonoid} -import io.snappydata.adanalytics.Configs._ -import kafka.serializer.StringDecoder -import org.apache.spark.SparkConf -import org.apache.spark.streaming.kafka.KafkaUtils -import org.apache.spark.streaming.{Seconds, StreamingContext} -import org.joda.time.DateTime - -/** - * Vanilla Spark implementation with no Snappy extensions being used. - * Code is from https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/ - * This implementation uses a HyperLogLog to find uniques. We skip this - * probabilistic structure in our implementation as we can easily extract the - * exact distinct count for such small time windows. - **/ -object SparkLogAggregator extends App { - - val sc = new SparkConf() - .setAppName(getClass.getName) - .setMaster("local[*]") - val ssc = new StreamingContext(sc, Seconds(1)) - - // stream of (topic, ImpressionLog) - val messages = KafkaUtils.createDirectStream - [String, AdImpressionLog, StringDecoder, AdImpressionLogAvroDecoder](ssc, kafkaParams, topics) - - // to count uniques - lazy val hyperLogLog = new HyperLogLogMonoid(12) - - // we filter out non resolved geo (unknown) and map (pub, geo) -> AggLog that will be reduced - val logsByPubGeo = messages.map(_._2).filter(_.getGeo != Configs.UnknownGeo).map { - log => - val key = PublisherGeoKey(log.getPublisher.toString, log.getGeo.toString) - val agg = AggregationLog( - timestamp = log.getTimestamp, - sumBids = log.getBid, - imps = 1, - uniquesHll = hyperLogLog(log.getCookie.toString.getBytes()) - ) - (key, agg) - } - - // Reduce to generate imps, uniques, sumBid per pub and geo per 2 seconds - val aggLogs = logsByPubGeo.reduceByKeyAndWindow(reduceAggregationLogs, Seconds(2)) - - aggLogs.foreachRDD(rdd => { - rdd.foreach(f => { - println("AggregationLog {timestamp=" + f._2.timestamp + " sumBids=" + f._2.sumBids + " imps=" + f._2.imps + "}") - }) - }) - - // start rolling! - ssc.start - ssc.awaitTermination - - private def reduceAggregationLogs(aggLog1: AggregationLog, aggLog2: AggregationLog) = { - aggLog1.copy( - timestamp = math.min(aggLog1.timestamp, aggLog2.timestamp), - sumBids = aggLog1.sumBids + aggLog2.sumBids, - imps = aggLog1.imps + aggLog2.imps, - uniquesHll = aggLog1.uniquesHll + aggLog2.uniquesHll - ) - } -} - -case class AggregationLog(timestamp: Long, sumBids: Double, imps: Int = 1, uniquesHll: HLL) - -case class AggregationResult(date: DateTime, publisher: String, geo: String, imps: Int, uniques: Int, avgBids: Double) - -case class PublisherGeoKey(publisher: String, geo: String) +//package io.snappydata.adanalytics +// +//import com.twitter.algebird.{HLL, HyperLogLogMonoid} +//import io.snappydata.adanalytics.Configs._ +//import org.apache.spark.SparkConf +//import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies} +//import org.apache.spark.streaming.{Seconds, StreamingContext} +// +//import org.joda.time.DateTime +// +///** +// * Vanilla Spark implementation with no Snappy extensions being used. +// * Code is from https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/ +// * This implementation uses a HyperLogLog to find uniques. We skip this +// * probabilistic structure in our implementation as we can easily extract the +// * exact distinct count for such small time windows. +// **/ +//object SparkLogAggregator extends App { +// +// val sc = new SparkConf() +// .setAppName(getClass.getName) +// .setMaster("local[*]") +// val ssc = new StreamingContext(sc, Seconds(1)) +// +// // stream of (topic, ImpressionLog) +// val consumerStrategies = ConsumerStrategies +// .Subscribe[String, AdImpressionLog](topics, kafkaParams) +// val messages = KafkaUtils.createDirectStream[String, AdImpressionLog](ssc, +// LocationStrategies.PreferConsistent, consumerStrategies) +// +// // to count uniques +// lazy val hyperLogLog = new HyperLogLogMonoid(12) +// +// // we filter out non resolved geo (unknown) and map (pub, geo) -> AggLog that will be reduced +// val logsByPubGeo = messages.map(_.value()).filter(_.getGeo != Configs.UnknownGeo).map { +// log => +// val key = PublisherGeoKey(log.getPublisher.toString, log.getGeo.toString) +// val agg = AggregationLog( +// timestamp = log.getTimestamp, +// sumBids = log.getBid, +// imps = 1, +// uniquesHll = hyperLogLog(log.getCookie.toString.getBytes()) +// ) +// (key, agg) +// } +// +// // Reduce to generate imps, uniques, sumBid per pub and geo per 2 seconds +// val aggLogs = logsByPubGeo.reduceByKeyAndWindow(reduceAggregationLogs, Seconds(2)) +// +// aggLogs.foreachRDD(rdd => { +// rdd.foreach(f => { +// println("AggregationLog {timestamp=" + f._2.timestamp + " sumBids=" + f._2.sumBids + " imps=" + f._2.imps + "}") +// }) +// }) +// +// // start rolling! +// ssc.start +// ssc.awaitTermination +// +// private def reduceAggregationLogs(aggLog1: AggregationLog, aggLog2: AggregationLog) = { +// aggLog1.copy( +// timestamp = math.min(aggLog1.timestamp, aggLog2.timestamp), +// sumBids = aggLog1.sumBids + aggLog2.sumBids, +// imps = aggLog1.imps + aggLog2.imps, +// uniquesHll = aggLog1.uniquesHll + aggLog2.uniquesHll +// ) +// } +//} +// +//case class AggregationLog(timestamp: Long, sumBids: Double, imps: Int = 1, uniquesHll: HLL) +// +//case class AggregationResult(date: DateTime, publisher: String, geo: String, imps: Int, uniques: Int, avgBids: Double) +// +//case class PublisherGeoKey(publisher: String, geo: String) From 4c6fc3dcf4de1c0776902734e95563348e0dd45f Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 4 Nov 2019 11:40:31 +0530 Subject: [PATCH 04/30] Including some compileOnly dependencies as part of test dependencies. --- build.gradle | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 18abbb5..8d8c6d9 100644 --- a/build.gradle +++ b/build.gradle @@ -43,16 +43,11 @@ allprojects { } dependencies { - //todo[vatsal]: following five dependencies are kept as compile dependencies - // cause generateAdImpressions target is failing when these dependencies - // are made compileOnly. Figure out a way to make generateAdImpressions - // without making these as compile dependencies because making these - // dependencies compile increases the size of the uber jar. - compile "io.snappydata:snappydata-core_2.11:${snappyVersion}" - compile "io.snappydata:snappydata-cluster_2.11:${snappyVersion}" - compile "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" - compile "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" - compile "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" + compileOnly "io.snappydata:snappydata-core_2.11:${snappyVersion}" + compileOnly "io.snappydata:snappydata-cluster_2.11:${snappyVersion}" + compileOnly "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" + compileOnly "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" + compileOnly "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" // compileOnly "io.snappydata:snappydata-aqp_2.11:${snappyVersion}" compile 'org.apache.kafka:kafka-clients:0.10.0.1' @@ -64,6 +59,11 @@ dependencies { compile 'com.opencsv:opencsv:3.3' } +sourceSets { + test.compileClasspath += configurations.compileOnly + test.runtimeClasspath += configurations.compileOnly +} + task generateAvro(type: com.commercehub.gradle.plugin.avro.GenerateAvroJavaTask) { source("src/avro") outputDir = file("src/main/java") From 614c6ce525a1280de6fa7773d061cb319e5f24ae Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 4 Nov 2019 15:43:00 +0530 Subject: [PATCH 05/30] - Eliminating the use of threadlocal to reuse instances while doing AVRO deserialization. Instead creating new instance of Deserializer per partition. - Also explicitly providing new instance of `SpecificData` while creating `SpecificDatumReader`. Without this the `SpecificDatumReader` internally uses a singleton instance of `SpecificData` which maintains cache of loaded classes. This can lead to `ClassCastException` as the DatumReader end up using cached classes which are loaded by different classloader. --- .../AdImpressionLogAVRODeserializer.scala | 34 ++++++++ .../AdImpressionLogAVROSerializer.scala | 45 +++++++++++ .../AdImpressionLogAvroDeserializer.scala | 17 ---- .../AdImpressionLogAvroSerializer.scala | 29 ------- .../KafkaAdImpressionProducer.scala | 2 +- .../adanalytics/SnappyAPILogAggregator.scala | 77 ++++++++----------- 6 files changed, 111 insertions(+), 93 deletions(-) create mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala create mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala delete mode 100644 src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala new file mode 100644 index 0000000..7dad669 --- /dev/null +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + +package io.snappydata.adanalytics + +import org.apache.avro.io.{BinaryDecoder, DecoderFactory} +import org.apache.avro.specific.{SpecificData, SpecificDatumReader} + +class AdImpressionLogAVRODeserializer { + @transient private lazy val datumReader = new SpecificDatumReader[AdImpressionLog](AdImpressionLog.getClassSchema, + AdImpressionLog.getClassSchema, new SpecificData()) + @transient private var decoder: BinaryDecoder = _ + @transient private var result: AdImpressionLog = _ + + def deserialize(data: Array[Byte]): AdImpressionLog = { + decoder = DecoderFactory.get.binaryDecoder(data, decoder) + result = datumReader.read(result, decoder) + result + } +} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala new file mode 100644 index 0000000..d195c9c --- /dev/null +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + +package io.snappydata.adanalytics + +import java.io.ByteArrayOutputStream +import java.util + +import io.snappydata.adanalytics.AdImpressionLogAVROSerializer.{binaryEncoder, datumWriter} +import org.apache.avro.generic.GenericDatumWriter +import org.apache.avro.io.{BinaryEncoder, EncoderFactory} + +class AdImpressionLogAVROSerializer extends org.apache.kafka.common.serialization.Serializer[AdImpressionLog] { + override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} + + override def serialize(topic: String, data: AdImpressionLog): Array[Byte] = { + val byteArrayOutputStream = new ByteArrayOutputStream() + binaryEncoder.set(EncoderFactory.get.binaryEncoder(byteArrayOutputStream, binaryEncoder.get)) + datumWriter.write(data, binaryEncoder.get()) + binaryEncoder.get().flush() + byteArrayOutputStream.close() + byteArrayOutputStream.toByteArray + } + + override def close(): Unit = {} +} + +object AdImpressionLogAVROSerializer { + val binaryEncoder = new ThreadLocal[BinaryEncoder] + lazy val datumWriter = new GenericDatumWriter[AdImpressionLog](AdImpressionLog.getClassSchema) +} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala deleted file mode 100644 index 3ab8f25..0000000 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroDeserializer.scala +++ /dev/null @@ -1,17 +0,0 @@ -//todo[vatsal]: add appropreate copyright header -package io.snappydata.adanalytics - -import org.apache.avro.io.{BinaryDecoder, DecoderFactory} -import org.apache.avro.specific.SpecificDatumReader - -object AdImpressionLogAvroDeserializer { - lazy val datumReader = new SpecificDatumReader[AdImpressionLog](AdImpressionLog.getClassSchema) - val decoder = new ThreadLocal[BinaryDecoder] - val adImpressionLog = new ThreadLocal[AdImpressionLog] - - def deserialize(data: Array[Byte]): AdImpressionLog = { - decoder.set(DecoderFactory.get.binaryDecoder(data, decoder.get())) - adImpressionLog.set(datumReader.read(adImpressionLog.get(), decoder.get())) - adImpressionLog.get() - } -} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala deleted file mode 100644 index 5d061a1..0000000 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAvroSerializer.scala +++ /dev/null @@ -1,29 +0,0 @@ -//todo[vatsal]: add appropreate copyright header -package io.snappydata.adanalytics - -import java.io.ByteArrayOutputStream -import java.util - -import io.snappydata.adanalytics.AdImpressionLogAvroSerializer.{binaryEncoder, datumWriter} -import org.apache.avro.generic.GenericDatumWriter -import org.apache.avro.io.{BinaryEncoder, EncoderFactory} - -class AdImpressionLogAvroSerializer extends org.apache.kafka.common.serialization.Serializer[AdImpressionLog] { - override def configure(configs: util.Map[String, _], isKey: Boolean): Unit = {} //no op - - override def serialize(topic: String, data: AdImpressionLog): Array[Byte] = { - val byteArrayOutputStream = new ByteArrayOutputStream() - binaryEncoder.set(EncoderFactory.get.binaryEncoder(byteArrayOutputStream, binaryEncoder.get)) - datumWriter.write(data, binaryEncoder.get()) - binaryEncoder.get().flush() - byteArrayOutputStream.close() - byteArrayOutputStream.toByteArray - } - - override def close(): Unit = {} //no op -} - -object AdImpressionLogAvroSerializer { - val binaryEncoder = new ThreadLocal[BinaryEncoder] - lazy val datumWriter = new GenericDatumWriter[AdImpressionLog](AdImpressionLog.SCHEMA$) -} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index f69e637..78b5988 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -36,7 +36,7 @@ object KafkaAdImpressionProducer { val props = new Properties() props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") - props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAvroSerializer") + props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAVROSerializer") props.put("bootstrap.servers", "localhost:9092") val producer = new KafkaProducer[String, AdImpressionLog](props) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala index f369b96..18c6f63 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala @@ -22,7 +22,8 @@ import io.snappydata.adanalytics.Configs._ import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.RowEncoder -import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, window} +import org.apache.spark.sql.functions.{avg, count, countDistinct, window} +import org.apache.spark.sql.streaming.SnappySinkCallback import org.apache.spark.sql.types._ import org.apache.spark.{SparkConf, SparkContext} @@ -36,8 +37,6 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { val conf = new SparkConf() .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - .set("snappydata.store.locators", s"$snappyLocators") .set("spark.ui.port", "4041") .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .registerAvroSchemas(AdImpressionLog.getClassSchema) @@ -63,8 +62,6 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { snappy.sql("set spark.sql.shuffle.partitions=8") import org.apache.spark.sql.streaming.ProcessingTime - snappy.sql("drop table if exists adImpressionStream") - snappy.sql("drop table if exists sampledAdImpressions") snappy.sql("drop table if exists aggrAdImpressions") snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + @@ -74,15 +71,6 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) - def binaryToRowConverter: Array[Byte] => Row = { - v => { - val adImpressionLog = AdImpressionLogAvroDeserializer.deserialize(v) - Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, - adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, - adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) - } - } - val df = snappy.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerList) @@ -91,22 +79,25 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { .option("maxOffsetsPerTrigger", 10000) .option("subscribe", kafkaTopic) .load().select("value").as[Array[Byte]](Encoders.BINARY) - .map(binaryToRowConverter)(RowEncoder.apply(schema)) + .mapPartitions(itr => { + val deserializer = new AdImpressionLogSpecificDeserializer + itr.map(data => { + val adImpressionLog = deserializer.deserialize(data) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, + adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + }) + })(RowEncoder.apply(schema)) .filter(s"geo != '${Configs.UnknownGeo}'") - // Group by on sliding window of 1 second - val windowedDF = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), - df.col("publisher"), df.col("geo")) - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), - approx_count_distinct("cookie").alias("uniques")) - - val logStream = windowedDF.select("window.start", "publisher", "geo", "avg_bid", "imps", "uniques") + val logStream = df .writeStream .format("snappysink") .queryName("log_stream1") .trigger(ProcessingTime("1 seconds")) - .option("tableName","aggrAdImpressions") - .option("checkpointLocation", this.getClass.getCanonicalName) + .option("tableName", "aggrAdImpressions") + .option("sinkCallback", "io.snappydata.adanalytics.CustomSinkCallback") + .option("checkpointLocation", s"/tmp/${this.getClass.getCanonicalName}") .outputMode("update") .start @@ -118,26 +109,20 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { } } +/** + * We want to execute the following analytic query on each batch dataframe: + * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques + * from AdImpressionLog group by publisher, geo, timestamp + */ +class CustomSinkCallback extends SnappySinkCallback { + override def process(snappySession: SnappySession, sinkProps: Map[String, String], batchId: Long, + df: Dataset[Row], possibleDuplicate: Boolean): Unit = { -//todo[vatsal]: remove this code after final testing -// -///** -// * We want to execute the following analytic query on each batch dataframe: -// * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques -// * from AdImpressionLog group by publisher, geo, timestamp -// */ -//class CustomSinkCallback1 extends SnappySinkCallback { -// override def process(snappySession: SnappySession, sinkProps: Map[String, String], batchId: Long, -// df: Dataset[Row], possibleDuplicate: Boolean): Unit = { -// -//// df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds") -//// , df.col("timestamp"), df.col("publisher"), df.col("geo")).agg() -// val frame = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), -// df.col("timestamp"), df.col("publisher"), df.col("geo")) -// .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), -// countDistinct("cookie").alias("uniques")) -// frame.show -// frame.select("timestamp","publisher", "geo", "avg_bid", "imps", "uniques") -// .write.insertInto("aggrAdImpressions") -// } -//} \ No newline at end of file + val frame = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), + df.col("timestamp"), df.col("publisher"), df.col("geo")) + .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), + countDistinct("cookie").alias("uniques")) + frame.select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") + .write.insertInto("aggrAdImpressions") + } +} \ No newline at end of file From 50e679ab269fc4f9df9283ee2cf714aa3b6ef620 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 4 Nov 2019 15:49:44 +0530 Subject: [PATCH 06/30] Updating README file. --- README.md | 108 ++++++++++++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 5bb63dd..6346876 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -##### We benchmarked this code example against the [MemSQL Spark Connector](https://github.com/memsql/memsql-spark-connector) and the [Cassandra Spark Connector](https://github.com/datastax/spark-cassandra-connector). SnappyData outperformed Cassandra by 45x and MemSQL by 3x on query execution while concurrently ingesting. The benchmark is described [here](http://www.snappydata.io/blog/snappydata-memsql-cassandra-a-performance-benchmark). -##### There is a screencast associated with this repo [here](https://youtu.be/bXofwFtmHjE) ##### [Skip directly to instructions](#lets-get-this-going) @@ -21,8 +19,8 @@ ### Purpose Here we use a simplified Ad Analytics example, which streams in [AdImpression](https://en.wikipedia.org/wiki/Impression_(online_media)) logs, pre-aggregating the logs and ingesting into the built-in in-memory columnar store (where the data is stored both in 'exact' form as well as a stratified sample). We showcase the following aspects of this unified cluster: -- Simplicity of using SQL or the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to model streams in spark. -- The use of SQL/SchemaDStream API (as continuous queries) to pre-aggregate AdImpression logs (it is faster and much more convenient to incorporate more complex analytics, rather than using map-reduce). +- Simplicity of using the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to model streams in spark. +- The use of Structured Streaming API to pre-aggregate AdImpression logs (it is faster and much more convenient to incorporate more complex analytics, rather than using map-reduce). - Demonstrate storing the pre-aggregated logs into the SnappyData columnar store with high efficiency. While the store itself provides a rich set of features like hybrid row+column store, eager replication, WAN replicas, HA, choice of memory-only, HDFS, native disk persistence, eviction, etc we only work with a column table in this simple example. - Run OLAP queries from any SQL client both on the full data set as well as sampled data (showcasing sub-second interactive query speeds). The stratified sample allows us to manage an infinitely growing data set at a fraction of the cost otherwise required. @@ -31,9 +29,10 @@ We borrow our use case implementation from this [blog](https://chimpler.wordpres Our architecture is depicted in the figure below. -We consider an adnetwork where adservers log impressions in [Apache Kafka](http://kafka.apache.org/) (distributed publish-subscribe messaging system). These impressions are then aggregated by [Spark Streaming](http://spark.apache.org/streaming/) into the SnappyData Store. External clients connect to the same cluster using JDBC/ODBC and run arbitrary OLAP queries. +We consider an adnetwork where adservers log impressions in [Apache Kafka](http://kafka.apache.org/) (distributed publish-subscribe messaging system). These impressions are then aggregated by [Spark Structured Streaming](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html) into the SnappyData Store. External clients connect to the same cluster using JDBC/ODBC and run arbitrary OLAP queries. As AdServers can feed logs from many websites and given that each AdImpression log message represents a single Ad viewed by a user, one can expect thousands of messages every second. It is crucial that ingestion logic keeps up with the stream. To accomplish this, SnappyData collocates the store partitions with partitions created by Spark Streaming. i.e. a batch of data from the stream in each Spark executor is transformed into a compressed column batch and stored in the same JVM, avoiding redundant shuffles (except for HA). +TODO: Need to review this architecture diagram ![Architecture Kinda](AdAnalytics_Architecture.png) @@ -54,6 +53,7 @@ Some examples of interactive queries: - **Impression trends for advertisers over time;** - **Top ads based on uniques count for each Geo.** +//todo[vatsal]: the timestamp millis values should be zero if we are aggregating on the window of 1 second So the aggregation will look something like: |timestamp |publisher |geo | avg_bid |imps|uniques| @@ -66,51 +66,51 @@ So the aggregation will look something like: ### Code highlights We implemented the ingestion logic using 3 methods mentioned below but only describe the SQL approach for brevity here. -- [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) (from the original blog). -- [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala) to work with the stream as a sequence of DataFrames. (btw, SQL based access to streams is also the theme behind [Structured streaming](https://issues.apache.org/jira/browse/SPARK-8360) being introduced in Spark 2.0 ) -- [SQL based](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala) - described below. +TODO: verify the links +- [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) +- [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala) to work with the stream as a sequence of DataFrames. + #### Generating the AdImpression logs +TODO: verify this step with along with the code snippet A [KafkaAdImpressionGenerator](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc)(Avro formatted objects) in batches to Kafka. ```scala val props = new Properties() - props.put("serializer.class", "io.snappydata.adanalytics.AdImpressionLogAvroEncoder") - props.put("partitioner.class", "kafka.producer.DefaultPartitioner") - props.put("key.serializer.class", "kafka.serializer.StringEncoder") - props.put("metadata.broker.list", brokerList) - val config = new ProducerConfig(props) - val producer = new Producer[String, AdImpressionLog](config) - sendToKafka(generateAdImpression()) - - def generateAdImpression(): AdImpressionLog = { - val random = new Random() - val timestamp = System.currentTimeMillis() - val publisher = Publishers(random.nextInt(NumPublishers)) - val advertiser = Advertisers(random.nextInt(NumAdvertisers)) - val website = s"website_${random.nextInt(Constants.NumWebsites)}.com" - val cookie = s"cookie_${random.nextInt(Constants.NumCookies)}" - val geo = Geos(random.nextInt(Geos.size)) - val bid = math.abs(random.nextDouble()) % 1 - val log = new AdImpressionLog() + //props.put("partitioner.class", "kafka.producer.DefaultPartitioner") + props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") + props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAvroSerializer") + props.put("bootstrap.servers", "localhost:9092") + + val producer = new KafkaProducer[String, AdImpressionLog](props) + + def main(args: Array[String]) { + println("Sending Kafka messages of topic " + kafkaTopic + " to brokers " + brokerList) + val threads = new Array[Thread](numProducerThreads) + for (i <- 0 until numProducerThreads) { + val thread = new Thread(new Worker()) + thread.start() + threads(i) = thread + } + threads.foreach(_.join()) + println(s"Done sending $numLogsPerThread Kafka messages of topic $kafkaTopic") + System.exit(0) } - - def sendToKafka(log: AdImpressionLog) = { - producer.send(new KeyedMessage[String, AdImpressionLog]( - Constants.kafkaTopic, log.getTimestamp.toString, log)) + + def sendToKafka(log: AdImpressionLog): Future[RecordMetadata] = { + producer.send(new ProducerRecord[String, AdImpressionLog]( + Configs.kafkaTopic, log.getTimestamp.toString, log)) } ``` -#### Spark stream as SQL table and Continuous query - [SnappySQLLogAggregator](src/main/scala/io/snappydata/adanalytics/SnappySQLLogAggregator.scala) creates a stream over the Kafka source. The messages are converted to [Row](https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/Row.html) objects using [AdImpressionToRowsConverter](src/main/scala/io/snappydata/adanalytics/Codec.scala) to comply with the schema defined in the 'create stream table' below. -This is mostly just a SQL veneer over Spark Streaming. The stream table is also automatically registered with the SnappyData catalog so external clients can access this stream as a table. - -Next, a continuous query is registered on the stream table that is used to create the aggregations we spoke about above. The query aggregates metrics for each publisher and geo every 1 second. This query runs every time a batch is emitted. It returns a SchemaDStream. +#### Spark Structured Streaming With Snappysink + [SnappyLogAggregator](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregatorJob.scala) creates a stream over the Kafka source and ingests data into Snappydata table using [`Snappysink`](https://snappydatainc.github.io/snappydata/howto/use_stream_processing_with_snappydata/#structured-streaming). +TODO: replace with structured streaming code ```scala val sc = new SparkContext(sparkConf) val snsc = new SnappyStreamingContext(sc, batchDuration) /** - * AdImpressionStream presents the stream as a Table. It is registered with the Snappy catalog and hence queriable. + * AdImpressionStream presents the stream as a Table. It is registered with the Snappy catalog and hence queriable. * Underneath the covers, this is an abstraction over a DStream. DStream batches are emitted as DataFrames here. */ snsc.sql("create stream table adImpressionStream (" + @@ -140,19 +140,6 @@ Next, a continuous query is registered on the stream table that is used to creat " from adImpressionStream window (duration 1 seconds, slide 1 seconds)" + " where geo != 'unknown' group by publisher, geo") ``` -#### Ingesting into Column table -Next, create the Column table and ingest result of continuous query of aggregating AdImpressionLogs. Here we use the Spark Data Source API to write to the aggrAdImpressions table. This will automatically localize the partitions in the data store without shuffling the data. -```scala - snsc.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + - " geo string, avg_bid double, imps long, uniques long) " + - "using column options(buckets '11')") - //Simple in-memory partitioned, columnar table with 11 partitions. - //Other table types, options to replicate, persist, overflow, etc are defined - // here -> http://snappydatainc.github.io/snappydata/rowAndColumnTables/ - - //Persist using the Spark DataSource API - resultStream.foreachDataFrame(_.write.insertInto("aggrAdImpressions")) -``` #### Ingesting into a Sample table Finally, create a sample table that ingests from the column table specified above. This is the table that approximate queries will execute over. Here we create a query column set on the 'geo' column, specify how large of a sample we want relative to the column table (3%) and specify which table to ingest from: @@ -165,9 +152,10 @@ Finally, create a sample table that ingests from the column table specified abov ### Let's get this going In order to run this example, we need to install the following: -1. [Apache Kafka 2.11-0.8.2.1](http://kafka.apache.org/downloads.html) -2. [SnappyData 1.0.0 Enterprise Release](https://www.snappydata.io/download). Download the binary snappydata-1.0.0-bin.tar.gz and Unzip it. -The binaries will be inside "snappydata-1.0.0-bin" directory. +1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) +TODO: link to enterprise TIBCO ComputeDB here? +2. [SnappyData 1.1.1 Enterprise Release](). Download the binary snappydata-1.0.0-bin.tar.gz and Unzip it. +The binaries will be inside "snappydata-1.1.1-bin" directory. 3. JDK 8 Then checkout the Ad analytics example @@ -175,7 +163,7 @@ Then checkout the Ad analytics example git clone https://github.com/SnappyDataInc/snappy-poc.git ``` -Note that the instructions for kafka configuration below are for 2.11-0.8.2.1 version of Kafka. +Note that the instructions for kafka configuration below are for 2.11-0.10.2.2 version of Kafka. To setup kafka cluster, start Zookeeper first from the root kafka folder with default zookeeper.properties: ``` @@ -205,7 +193,7 @@ Goto the SnappyData product install home directory. In conf subdirectory, create file "spark-env.sh"(copy spark-env.sh.template) and add this line ... ``` -SPARK_DIST_CLASSPATH=SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.0.0-assembly.jar +SPARK_DIST_CLASSPATH=SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` > Make sure you set the SNAPPY_POC_HOME directory appropriately above @@ -219,13 +207,11 @@ Start SnappyData cluster using following command from installation directory. This will start one locator, one server and a lead node. You can understand the roles of these nodes [here](https://github.com/SnappyDataInc/snappydata/blob/master/docs/GettingStarted.md#snappydata-cluster-explanation) - - Submit the streaming job to the cluster and start it (consume the stream, aggregate and store). > Make sure you copy/paste the SNAPPY_POC_HOME path from above in the command below where indicated ``` -./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappySQLLogAggregatorJob --app-jar SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.0.0-assembly.jar --stream +./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregatorJob --app-jar SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel processing from kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. @@ -234,7 +220,7 @@ Start generating and publishing logs to Kafka from the `/snappy-poc/` folder ``` ./gradlew generateAdImpressions ``` - +TODO: provide some instruction to verify that the streaming is running without delay. You can see the Spark streaming processing batches of data once every second in the [Spark console](http://localhost:4040/streaming/). It is important that our stream processing keeps up with the input rate. So, we note that the 'Scheduling Delay' doesn't keep increasing and 'Processing time' remains less than a second. ### Next, interact with the data. Fast. @@ -263,12 +249,6 @@ Let's do a quick count to make sure we have the ingested data: select count(*) from aggrAdImpressions; ``` -Let's also directly query the stream using SQL: - -```sql -select count(*) from adImpressionStream; -``` - Now, lets run some OLAP queries on the column table of exact data. First, lets find the top 20 geographies with the most ad impressions: ```sql From a0da5287e3cb10453f83b22552cad6d32552d652 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 4 Nov 2019 16:14:00 +0530 Subject: [PATCH 07/30] Fixing serializer name --- .../io/snappydata/adanalytics/SnappyAPILogAggregator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala index 18c6f63..c0dcedb 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala @@ -80,7 +80,7 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { .option("subscribe", kafkaTopic) .load().select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { - val deserializer = new AdImpressionLogSpecificDeserializer + val deserializer = new AdImpressionLogAVRODeserializer itr.map(data => { val adImpressionLog = deserializer.deserialize(data) Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, From ca36c75ca130097bdf0b4330061a2f537c7aa7d0 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 5 Dec 2019 19:30:38 +0530 Subject: [PATCH 08/30] Using structured streaming windowed aggregation with watermarking instead of custom sink implementaion. --- README.md | 2 +- build.gradle | 2 +- ...egator.scala => SnappyLogAggregator.scala} | 37 ++--- .../adanalytics/SparkLogAggregator.scala | 142 +++++++++--------- 4 files changed, 83 insertions(+), 100 deletions(-) rename src/main/scala/io/snappydata/adanalytics/{SnappyAPILogAggregator.scala => SnappyLogAggregator.scala} (79%) diff --git a/README.md b/README.md index 6346876..4cdf9bd 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ So the aggregation will look something like: We implemented the ingestion logic using 3 methods mentioned below but only describe the SQL approach for brevity here. TODO: verify the links - [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) -- [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala) to work with the stream as a sequence of DataFrames. +- [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) to work with the stream as a sequence of DataFrames. #### Generating the AdImpression logs diff --git a/build.gradle b/build.gradle index 8d8c6d9..96a8048 100644 --- a/build.gradle +++ b/build.gradle @@ -87,7 +87,7 @@ task generateAdImpressions(type: JavaExec, dependsOn: classes) { } task aggeregateAdImpressions_API(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.adanalytics.SnappyAPILogAggregator' + main = 'io.snappydata.adanalytics.SnappyLogAggregator' jvmArgs = ['-XX:MaxPermSize=512m'] classpath sourceSets.test.runtimeClasspath environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala similarity index 79% rename from src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala rename to src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index c0dcedb..15aafe7 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyAPILogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -22,8 +22,7 @@ import io.snappydata.adanalytics.Configs._ import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.RowEncoder -import org.apache.spark.sql.functions.{avg, count, countDistinct, window} -import org.apache.spark.sql.streaming.SnappySinkCallback +import org.apache.spark.sql.functions.{avg, count, approx_count_distinct, window} import org.apache.spark.sql.types._ import org.apache.spark.{SparkConf, SparkContext} @@ -33,7 +32,7 @@ import org.apache.spark.{SparkConf, SparkContext} * This example can be run either in local mode or can be submitted as a job * to an already running SnappyData cluster. */ -object SnappyAPILogAggregator extends SnappySQLJob with App { +object SnappyLogAggregator extends SnappySQLJob with App { val conf = new SparkConf() .setAppName(getClass.getSimpleName) @@ -71,6 +70,7 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) + import snappy.implicits._ val df = snappy.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerList) @@ -90,13 +90,20 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { })(RowEncoder.apply(schema)) .filter(s"geo != '${Configs.UnknownGeo}'") - val logStream = df + val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) + .withWatermark("eventTime", "10 seconds") + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"timestamp", $"publisher", $"geo") + .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), + approx_count_distinct("cookie").alias("uniques")) + .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") + + val logStream = windowedDF .writeStream .format("snappysink") - .queryName("log_stream1") + .queryName("log_stream") .trigger(ProcessingTime("1 seconds")) .option("tableName", "aggrAdImpressions") - .option("sinkCallback", "io.snappydata.adanalytics.CustomSinkCallback") + //todo[vatsal]: accept checkpoint directory as argument .option("checkpointLocation", s"/tmp/${this.getClass.getCanonicalName}") .outputMode("update") .start @@ -107,22 +114,4 @@ object SnappyAPILogAggregator extends SnappySQLJob with App { override def isValidJob(snappy: SnappySession, config: Config): SnappyJobValidation = { SnappyJobValid() } -} - -/** - * We want to execute the following analytic query on each batch dataframe: - * select publisher, geo, avg(bid) as avg_bid, count(*) imps, count(distinct(cookie)) uniques - * from AdImpressionLog group by publisher, geo, timestamp - */ -class CustomSinkCallback extends SnappySinkCallback { - override def process(snappySession: SnappySession, sinkProps: Map[String, String], batchId: Long, - df: Dataset[Row], possibleDuplicate: Boolean): Unit = { - - val frame = df.groupBy(window(df.col("timestamp"), "1 seconds", "1 seconds"), - df.col("timestamp"), df.col("publisher"), df.col("geo")) - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), - countDistinct("cookie").alias("uniques")) - frame.select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") - .write.insertInto("aggrAdImpressions") - } } \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 7277492..6488151 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,74 +1,68 @@ -//package io.snappydata.adanalytics -// -//import com.twitter.algebird.{HLL, HyperLogLogMonoid} -//import io.snappydata.adanalytics.Configs._ -//import org.apache.spark.SparkConf -//import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies} -//import org.apache.spark.streaming.{Seconds, StreamingContext} -// -//import org.joda.time.DateTime -// -///** -// * Vanilla Spark implementation with no Snappy extensions being used. -// * Code is from https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/ -// * This implementation uses a HyperLogLog to find uniques. We skip this -// * probabilistic structure in our implementation as we can easily extract the -// * exact distinct count for such small time windows. -// **/ -//object SparkLogAggregator extends App { -// -// val sc = new SparkConf() -// .setAppName(getClass.getName) -// .setMaster("local[*]") -// val ssc = new StreamingContext(sc, Seconds(1)) -// -// // stream of (topic, ImpressionLog) -// val consumerStrategies = ConsumerStrategies -// .Subscribe[String, AdImpressionLog](topics, kafkaParams) -// val messages = KafkaUtils.createDirectStream[String, AdImpressionLog](ssc, -// LocationStrategies.PreferConsistent, consumerStrategies) -// -// // to count uniques -// lazy val hyperLogLog = new HyperLogLogMonoid(12) -// -// // we filter out non resolved geo (unknown) and map (pub, geo) -> AggLog that will be reduced -// val logsByPubGeo = messages.map(_.value()).filter(_.getGeo != Configs.UnknownGeo).map { -// log => -// val key = PublisherGeoKey(log.getPublisher.toString, log.getGeo.toString) -// val agg = AggregationLog( -// timestamp = log.getTimestamp, -// sumBids = log.getBid, -// imps = 1, -// uniquesHll = hyperLogLog(log.getCookie.toString.getBytes()) -// ) -// (key, agg) -// } -// -// // Reduce to generate imps, uniques, sumBid per pub and geo per 2 seconds -// val aggLogs = logsByPubGeo.reduceByKeyAndWindow(reduceAggregationLogs, Seconds(2)) -// -// aggLogs.foreachRDD(rdd => { -// rdd.foreach(f => { -// println("AggregationLog {timestamp=" + f._2.timestamp + " sumBids=" + f._2.sumBids + " imps=" + f._2.imps + "}") -// }) -// }) -// -// // start rolling! -// ssc.start -// ssc.awaitTermination -// -// private def reduceAggregationLogs(aggLog1: AggregationLog, aggLog2: AggregationLog) = { -// aggLog1.copy( -// timestamp = math.min(aggLog1.timestamp, aggLog2.timestamp), -// sumBids = aggLog1.sumBids + aggLog2.sumBids, -// imps = aggLog1.imps + aggLog2.imps, -// uniquesHll = aggLog1.uniquesHll + aggLog2.uniquesHll -// ) -// } -//} -// -//case class AggregationLog(timestamp: Long, sumBids: Double, imps: Int = 1, uniquesHll: HLL) -// -//case class AggregationResult(date: DateTime, publisher: String, geo: String, imps: Int, uniques: Int, avgBids: Double) -// -//case class PublisherGeoKey(publisher: String, geo: String) +package io.snappydata.adanalytics + +import io.snappydata.adanalytics.Configs._ +import org.apache.kafka.common.serialization.ByteArrayDeserializer +import org.apache.spark.SparkConf +import org.apache.spark.sql.catalyst.encoders.RowEncoder +import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, window} +import org.apache.spark.sql.types._ +import org.apache.spark.sql.{Encoders, Row, SparkSession} +import org.apache.spark.streaming.{Seconds, StreamingContext} +/** + * Vanilla Spark implementation with no Snappy extensions being used. + */ +object SparkLogAggregator extends App { + + val sc = new SparkConf() + .setAppName(getClass.getName) + .setMaster("local[*]") + val ssc = new StreamingContext(sc, Seconds(1)) + val schema = StructType(Seq(StructField("timestamp1", TimestampType), StructField("publisher", StringType), + StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), + StructField("bid", DoubleType), StructField("cookie", StringType))) + + private val spark = SparkSession.builder().getOrCreate() + import spark.implicits._ +// private val snappy = new SnappySession(spark.sparkContext) + val df = spark.readStream + .format("kafka") + .option("kafka.bootstrap.servers", brokerList) + .option("value.deserializer", classOf[ByteArrayDeserializer].getName) + .option("startingOffsets", "earliest") + .option("maxOffsetsPerTrigger", 100000) + .option("subscribe", kafkaTopic) + .load().select("value").as[Array[Byte]](Encoders.BINARY) + .mapPartitions(itr => { + val deserializer = new AdImpressionLogAVRODeserializer + itr.map(data => { + val adImpressionLog = deserializer.deserialize(data) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, + adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + }) + })(RowEncoder.apply(schema)) + .filter(s"geo != '${Configs.UnknownGeo}'") + + // Group by on sliding window of 1 second + val windowedDF = df.withColumn("eventTime", $"timestamp1".cast("timestamp")) + .withWatermark("eventTime", "10 seconds") + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), + df.col("publisher"), df.col("geo")) + .agg(avg("bid").alias("avg_bid"),count("geo").alias("imps"), + approx_count_distinct("cookie").alias("uniques")) + + val logStream = windowedDF.select("window.start", "publisher", "geo", "imps", "uniques") + .map(r=>Row(r.getValuesMap(Seq("start","publisher","geo","avg_bid","imps","uniques")) + .mkString(",")))(RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true))))) + .writeStream + .queryName("spark_log_stream") + //todo[vatsal]: accept checkpoint directory as argument + .option("checkpointLocation", "/tmp/"+this.getClass.getCanonicalName) + .outputMode("update") + .format("kafka") + .option("kafka.bootstrap.servers", "localhost:9092") + .option("topic", "adImpressionsOut") + .start() + + logStream.awaitTermination() +} From 2322df4bd172e19054dfac96619e159fb5bd7cb6 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Tue, 10 Dec 2019 17:18:23 +0530 Subject: [PATCH 09/30] Formatting and correcting README --- README.md | 199 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 130 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 4cdf9bd..c4d358f 100644 --- a/README.md +++ b/README.md @@ -12,25 +12,45 @@ 7. [Slack/Gitter/Stackoverflow discussion](#ask-questions-start-a-discussion) ### Introduction -[SnappyData](https://github.com/SnappyDataInc/snappydata) aims to deliver real time operational analytics at interactive speeds with commodity infrastructure and far less complexity than today. SnappyData fulfills this promise by -- Enabling streaming, transactions and interactive analytics in a single unifying system rather than stitching different solutions—and -- Delivering true interactive speeds via a state-of-the-art approximate query engine that leverages a multitude of synopses as well as the full dataset. SnappyData implements this by deeply integrating an in-memory database into Apache Spark. +[SnappyData](https://github.com/SnappyDataInc/snappydata) aims to deliver real time operational analytics at interactive +speeds with commodity infrastructure and far less complexity than today. +SnappyData fulfills this promise by +- Enabling streaming, transactions and interactive analytics in a single unifying system rather than stitching different +solutions—and +- Delivering true interactive speeds via a state-of-the-art approximate query engine that leverages a multitude of +synopses as well as the full dataset. SnappyData implements this by deeply integrating an in-memory database into +Apache Spark. ### Purpose -Here we use a simplified Ad Analytics example, which streams in [AdImpression](https://en.wikipedia.org/wiki/Impression_(online_media)) logs, pre-aggregating the logs and ingesting into the built-in in-memory columnar store (where the data is stored both in 'exact' form as well as a stratified sample). +Here we use a simplified Ad Analytics example, which streams in [AdImpression](https://en.wikipedia.org/wiki/Impression_(online_media)) +logs, pre-aggregating the logs and ingesting into the built-in in-memory columnar store (where the data is stored both +in 'exact' form as well as a stratified sample). We showcase the following aspects of this unified cluster: -- Simplicity of using the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to model streams in spark. -- The use of Structured Streaming API to pre-aggregate AdImpression logs (it is faster and much more convenient to incorporate more complex analytics, rather than using map-reduce). -- Demonstrate storing the pre-aggregated logs into the SnappyData columnar store with high efficiency. While the store itself provides a rich set of features like hybrid row+column store, eager replication, WAN replicas, HA, choice of memory-only, HDFS, native disk persistence, eviction, etc we only work with a column table in this simple example. -- Run OLAP queries from any SQL client both on the full data set as well as sampled data (showcasing sub-second interactive query speeds). The stratified sample allows us to manage an infinitely growing data set at a fraction of the cost otherwise required. +- Simplicity of using the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to +model streams in spark. +- The use of Structured Streaming API to pre-aggregate AdImpression logs (it is faster and much more convenient to +incorporate more complex analytics, rather than using map-reduce). +- Demonstrate storing the pre-aggregated logs into the SnappyData columnar store with high efficiency. While the store +itself provides a rich set of features like hybrid row+column store, eager replication, WAN replicas, HA, choice of memory-only, HDFS, native disk persistence, eviction, etc we only work with a column table in this simple example. +- Run OLAP queries from any SQL client both on the full data set as well as sampled data (showcasing sub-second +interactive query speeds). The stratified sample allows us to manage an infinitely growing data set at a fraction of the +cost otherwise required. ### Ad Impression Analytics use case -We borrow our use case implementation from this [blog](https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/) - We more or less use the same data structure and aggregation logic and we have adapted this code to showcase the SnappyData programming model extensions to Spark. We retain the native Spark example for comparison. +We borrow our use case implementation from this [blog](https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/) +\- We more or less use the same data structure and aggregation logic and we have adapted this code to showcase the +SnappyData programming model extensions to Spark. We have also kept the native Spark example using structured streaming +for comparison. Our architecture is depicted in the figure below. -We consider an adnetwork where adservers log impressions in [Apache Kafka](http://kafka.apache.org/) (distributed publish-subscribe messaging system). These impressions are then aggregated by [Spark Structured Streaming](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html) into the SnappyData Store. External clients connect to the same cluster using JDBC/ODBC and run arbitrary OLAP queries. -As AdServers can feed logs from many websites and given that each AdImpression log message represents a single Ad viewed by a user, one can expect thousands of messages every second. It is crucial that ingestion logic keeps up with the stream. To accomplish this, SnappyData collocates the store partitions with partitions created by Spark Streaming. i.e. a batch of data from the stream in each Spark executor is transformed into a compressed column batch and stored in the same JVM, avoiding redundant shuffles (except for HA). +We consider an adnetwork where adservers log impressions in [Apache Kafka](http://kafka.apache.org/). These impressions +are then aggregated using [Spark Structured Streaming](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html) into the SnappyData Store. External clients connect to the same cluster using JDBC/ODBC and run arbitrary OLAP queries. +As AdServers can feed logs from many websites and given that each AdImpression log message represents a single Ad viewed +by a user, one can expect thousands of messages every second. It is crucial that ingestion logic keeps up with the +stream. To accomplish this, SnappyData collocates the store partitions with partitions created by Spark Streaming. +i.e. a batch of data from the stream in each Spark executor is transformed into a compressed column batch and stored in +the same JVM, avoiding redundant shuffles (except for HA). TODO: Need to review this architecture diagram ![Architecture Kinda](AdAnalytics_Architecture.png) @@ -47,7 +67,9 @@ The incoming AdImpression log is formatted as depicted below. |2016-05-25 16:45:29.027|publisher29|advertiser29|website836|WA |0.896101|cookie781| -We pre-aggregate these logs by publisher and geo, and compute the average bid, the number of impressions and the number of uniques (the number of unique users that viewed the Ad) every 2 seconds. We want to maintain the last day’s worth of data in memory for interactive analytics from external clients. +We pre-aggregate these logs by publisher and geo, and compute the average bid, the number of impressions and the number +of uniques (the number of unique users that viewed the Ad) every 2 seconds(TODO[vatsal]- every second?). We want to +maintain the last day’s worth of data in memory for interactive analytics from external clients. Some examples of interactive queries: - **Find total uniques for a certain AD grouped on geography;** - **Impression trends for advertisers over time;** @@ -65,15 +87,16 @@ So the aggregation will look something like: |2016-05-25 16:44:56.803 |publisher38| WI |0.4585381957119518|40 |31 | ### Code highlights -We implemented the ingestion logic using 3 methods mentioned below but only describe the SQL approach for brevity here. -TODO: verify the links -- [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) -- [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) to work with the stream as a sequence of DataFrames. +TODO[vatsal] : verify these links after merge to master +We implemented the ingestion logic using [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) +and [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) +to work with the stream as a sequence of DataFrames. #### Generating the AdImpression logs -TODO: verify this step with along with the code snippet -A [KafkaAdImpressionGenerator](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc)(Avro formatted objects) in batches to Kafka. +TODO[vatsal]: verify this step with along with the code snippet +A [KafkaAdImpressionGenerator](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates +Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc)(Avro formatted objects) in batches to Kafka. ```scala val props = new Properties() //props.put("partitioner.class", "kafka.producer.DefaultPartitioner") @@ -102,58 +125,80 @@ A [KafkaAdImpressionGenerator](src/main/scala/io/snappydata/adanalytics/KafkaAdI } ``` #### Spark Structured Streaming With Snappysink - [SnappyLogAggregator](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregatorJob.scala) creates a stream over the Kafka source and ingests data into Snappydata table using [`Snappysink`](https://snappydatainc.github.io/snappydata/howto/use_stream_processing_with_snappydata/#structured-streaming). + [SnappyLogAggregator](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) creates a stream over the + Kafka source and ingests data into Snappydata table using [`Snappysink`](https://snappydatainc.github.io/snappydata/howto/use_stream_processing_with_snappydata/#structured-streaming). TODO: replace with structured streaming code ```scala - val sc = new SparkContext(sparkConf) - val snsc = new SnappyStreamingContext(sc, batchDuration) - - /** - * AdImpressionStream presents the stream as a Table. It is registered with the Snappy catalog and hence queriable. - * Underneath the covers, this is an abstraction over a DStream. DStream batches are emitted as DataFrames here. - */ - snsc.sql("create stream table adImpressionStream (" + - " time_stamp timestamp," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using directkafka_stream options" + - " (storagelevel 'MEMORY_AND_DISK_SER_2'," + - " rowConverter 'io.snappydata.adanalytics.AdImpressionToRowsConverter' ," + - s" kafkaParams 'metadata.broker.list->$brokerList'," + - s" topics '$kafkaTopic'," + - " K 'java.lang.String'," + - " V 'io.snappydata.adanalytics.AdImpressionLog', " + - " KD 'kafka.serializer.StringDecoder', " + - " VD 'io.snappydata.adanalytics.AdImpressionLogAvroDecoder')") - - // Aggregate metrics for each publisher, geo every few seconds. Just 1 second in this example. - // With the stream registered as a table, we can execute arbitrary queries. - // These queries run each time a batch is emitted by the stream. A continuous query. - val resultStream: SchemaDStream = snsc.registerCQ( - "select min(time_stamp), publisher, geo, avg(bid) as avg_bid," + - " count(*) as imps , count(distinct(cookie)) as uniques" + - " from adImpressionStream window (duration 1 seconds, slide 1 seconds)" + - " where geo != 'unknown' group by publisher, geo") +// The volumes are low. Optimize Spark shuffle by reducing the partition count +snappy.sql("set spark.sql.shuffle.partitions=8") + +import org.apache.spark.sql.streaming.ProcessingTime +snappy.sql("drop table if exists aggrAdImpressions") + +snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + + " geo string, avg_bid double, imps long, uniques long) " + + "using column options(buckets '11')") +val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), + StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), + StructField("bid", DoubleType), StructField("cookie", StringType))) + +import snappy.implicits._ +val df = snappy.readStream + .format("kafka") + .option("kafka.bootstrap.servers", brokerList) + .option("value.deserializer", classOf[ByteArrayDeserializer].getName) + .option("startingOffsets", "earliest") + .option("maxOffsetsPerTrigger", 10000) + .option("subscribe", kafkaTopic) + .load().select("value").as[Array[Byte]](Encoders.BINARY) + .mapPartitions(itr => { + val deserializer = new AdImpressionLogAVRODeserializer + itr.map(data => { + val adImpressionLog = deserializer.deserialize(data) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, + adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + }) + })(RowEncoder.apply(schema)) + .filter(s"geo != '${Configs.UnknownGeo}'") + +val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) + .withWatermark("eventTime", "10 seconds") + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"timestamp", $"publisher", $"geo") + .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), + approx_count_distinct("cookie").alias("uniques")) + .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") + +val logStream = windowedDF + .writeStream + .format("snappysink") + .queryName("log_stream") + .trigger(ProcessingTime("1 seconds")) + .option("tableName", "aggrAdImpressions") + //todo[vatsal]: accept checkpoint directory as argument + .option("checkpointLocation", s"/tmp/${this.getClass.getCanonicalName}") + .outputMode("update") + .start + +logStream.awaitTermination() ``` #### Ingesting into a Sample table -Finally, create a sample table that ingests from the column table specified above. This is the table that approximate queries will execute over. Here we create a query column set on the 'geo' column, specify how large of a sample we want relative to the column table (3%) and specify which table to ingest from: +Finally, create a sample table that ingests from the column table specified above. This is the table that approximate +queries will execute over. Here we create a query column set on the 'geo' column, specify how large of a sample we want +relative to the column table (3%) and specify which table to ingest from: ```scala - snsc.sql("CREATE SAMPLE TABLE sampledAdImpressions" + - " OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") +snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + +" OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") ``` ### Let's get this going In order to run this example, we need to install the following: 1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) -TODO: link to enterprise TIBCO ComputeDB here? +TODO[vatsal]: link to enterprise TIBCO ComputeDB here? 2. [SnappyData 1.1.1 Enterprise Release](). Download the binary snappydata-1.0.0-bin.tar.gz and Unzip it. The binaries will be inside "snappydata-1.1.1-bin" directory. 3. JDK 8 @@ -205,23 +250,27 @@ Start SnappyData cluster using following command from installation directory. ./sbin/snappy-start-all.sh ``` -This will start one locator, one server and a lead node. You can understand the roles of these nodes [here](https://github.com/SnappyDataInc/snappydata/blob/master/docs/GettingStarted.md#snappydata-cluster-explanation) +This will start one locator, one server and a lead node. You can understand the roles of these nodes [here](https://snappydatainc.github.io/snappydata/architecture/cluster_architecture/) Submit the streaming job to the cluster and start it (consume the stream, aggregate and store). > Make sure you copy/paste the SNAPPY_POC_HOME path from above in the command below where indicated ``` -./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregatorJob --app-jar SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` -SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel processing from kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. +SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can +automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel +processing from kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. Start generating and publishing logs to Kafka from the `/snappy-poc/` folder ``` ./gradlew generateAdImpressions ``` -TODO: provide some instruction to verify that the streaming is running without delay. -You can see the Spark streaming processing batches of data once every second in the [Spark console](http://localhost:4040/streaming/). It is important that our stream processing keeps up with the input rate. So, we note that the 'Scheduling Delay' doesn't keep increasing and 'Processing time' remains less than a second. + +You can monitor the streaming query processing on the [Structured Streaming UI](http://localhost:4040/streaming/). It is +important that our stream processing keeps up with the input rate. So, we should note that the `Processing Rate` keeps +up with `Input Rate` and `Processing Time` remains less than the trigger interval which is one second. ### Next, interact with the data. Fast. Now, we can run some interactive analytic queries on the pre-aggregated data. From the root SnappyData folder, enter: @@ -236,7 +285,8 @@ Once this loads, connect to your running local cluster with: connect client 'localhost:1527'; ``` -Set Spark shuffle partitions low since we don't have a lot of data; you can optionally view the members of the cluster as well: +Set Spark shuffle partitions low since we don't have a lot of data; you can optionally view the members of the cluster +as well: ``` set spark.sql.shuffle.partitions=7; @@ -249,7 +299,8 @@ Let's do a quick count to make sure we have the ingested data: select count(*) from aggrAdImpressions; ``` -Now, lets run some OLAP queries on the column table of exact data. First, lets find the top 20 geographies with the most ad impressions: +Now, lets run some OLAP queries on the column table of exact data. First, lets find the top 20 geographies with the most +ad impressions: ```sql select count(*) AS adCount, geo from aggrAdImpressions group by geo order by adCount desc limit 20; @@ -261,9 +312,15 @@ Next, let's find the total uniques for a given ad, grouped by geography: select sum(uniques) AS totalUniques, geo from aggrAdImpressions where publisher='publisher11' group by geo order by totalUniques desc limit 20; ``` -Now that we've seen some standard OLAP queries over the exact data, let's execute the same queries on our sample tables using SnappyData's [Approximate Query Processing techinques](https://github.com/SnappyDataInc/snappydata/blob/master/docs/aqp.md). In most production situations, the latency difference here would be significant because the volume of data in the exact table would be much higher than the sample tables. Since this is an example, there will not be a significant difference; we are showcasing how easy AQP is to use. +Now that we've seen some standard OLAP queries over the exact data, let's execute the same queries on our sample tables +using SnappyData's [Approximate Query Processing techinques](https://github.com/SnappyDataInc/snappydata/blob/master/docs/aqp.md). +In most production situations, the latency difference here would be significant because the volume of data in the exact +table would be much higher than the sample tables. Since this is an example, there will not be a significant difference; +we are showcasing how easy AQP is to use. -We are asking for an error rate of 20% or below and a confidence interval of 0.95 (note the last two clauses on the query). The addition of these last two clauses route the query to the sample table despite the exact table being in the FROM clause. If the error rate exceeds 20% an exception will be produced: +We are asking for an error rate of 20% or below and a confidence interval of 0.95 (note the last two clauses on the query). +The addition of these last two clauses route the query to the sample table despite the exact table being in the FROM +clause. If the error rate exceeds 20% an exception will be produced: ```sql select count(*) AS adCount, geo from aggrAdImpressions group by geo order by adCount desc limit 20 with error 0.20 confidence 0.95 ; @@ -275,7 +332,8 @@ And the second query from above: select sum(uniques) AS totalUniques, geo from aggrAdImpressions where publisher='publisher11' group by geo order by totalUniques desc limit 20 with error 0.20 confidence 0.95 ; ``` -Note that you can still query the sample table without specifying error and confidence clauses by simply specifying the sample table in the FROM clause: +Note that you can still query the sample table without specifying error and confidence clauses by simply specifying the +sample table in the FROM clause: ```sql select sum(uniques) AS totalUniques, geo from sampledAdImpressions where publisher='publisher11' group by geo order by totalUniques desc; @@ -287,15 +345,18 @@ Now, we check the size of the sample table: select count(*) as sample_cnt from sampledAdImpressions; ``` -Finally, stop the SnappyData cluser with: +Finally, stop the SnappyData cluster with: ``` ./sbin/snappy-stop-all.sh ``` ### So, what was the point again? -Hopefully we showed you how simple yet flexible it is to parallely ingest, process using SQL, run continuous queries, store data in column and sample tables and interactively query data. All in a single unified cluster. -We will soon release Part B of this exercise - a benchmark of this use case where we compare SnappyData to other alternatives. Coming soon. +Hopefully we showed you how simple yet flexible it is to parallely ingest, process using SQL, run continuous queries, +store data in column and sample tables and interactively query data. All in a single unified cluster. +TODO[vatsal]: should we keep this line? +We will soon release Part B of this exercise - a benchmark of this use case where we compare SnappyData to other +alternatives. Coming soon. ### Ask questions, start a Discussion From 0ca98cf9e16545975632b9ec9ec157da746243ca Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Fri, 13 Dec 2019 14:06:10 +0530 Subject: [PATCH 10/30] Cleaning up some unused code. Completing some TODOs. --- .../io/snappydata/adanalytics/Configs.scala | 5 +- .../KafkaAdImpressionProducer.scala | 2 +- .../adanalytics/SnappyLogAggregator.scala | 5 +- .../adanalytics/SparkLogAggregator.scala | 7 +- .../benchmark/CSVSnappyIngestionPerf.scala | 99 ----------- .../benchmark/KafkaSnappyIngestionPerf.scala | 83 --------- .../benchmark/SnappyStreamIngestPerfJob.scala | 55 ------ .../SocketAdImpressionGenerator.scala | 164 ------------------ .../benchmark/SocketSnappyIngestionPerf.scala | 71 -------- 9 files changed, 10 insertions(+), 481 deletions(-) delete mode 100644 src/main/scala/io/snappydata/benchmark/CSVSnappyIngestionPerf.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/KafkaSnappyIngestionPerf.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/SnappyStreamIngestPerfJob.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/SocketAdImpressionGenerator.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/SocketSnappyIngestionPerf.scala diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index a0a37be..ac14ea9 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -40,6 +40,10 @@ object Configs { "metadata.broker.list" -> brokerList ) + // Ideally checkpoint directory should be at some shared HDFS location accessible by all the nodes + val snappyLogAggregatorCheckpointDir = s"/tmp/snappyLogAggregator" + val sparkLogAggregatorCheckpointDir = s"/tmp/sparkLogAggregator" + val hostname = "localhost" val socketPort = 9000 @@ -90,5 +94,4 @@ object Configs { StructField("bid", DoubleType, true), StructField("cookie", StringType, true))) } - } diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index 78b5988..6e5b3ad 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -37,7 +37,7 @@ object KafkaAdImpressionProducer { val props = new Properties() props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAVROSerializer") - props.put("bootstrap.servers", "localhost:9092") + props.put("bootstrap.servers", brokerList) val producer = new KafkaProducer[String, AdImpressionLog](props) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 15aafe7..683f6cc 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -100,11 +100,10 @@ object SnappyLogAggregator extends SnappySQLJob with App { val logStream = windowedDF .writeStream .format("snappysink") - .queryName("log_stream") + .queryName("log_aggregator") .trigger(ProcessingTime("1 seconds")) .option("tableName", "aggrAdImpressions") - //todo[vatsal]: accept checkpoint directory as argument - .option("checkpointLocation", s"/tmp/${this.getClass.getCanonicalName}") + .option("checkpointLocation", snappyLogAggregatorCheckpointDir) .outputMode("update") .start diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 6488151..7aad36f 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -55,12 +55,11 @@ object SparkLogAggregator extends App { .map(r=>Row(r.getValuesMap(Seq("start","publisher","geo","avg_bid","imps","uniques")) .mkString(",")))(RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true))))) .writeStream - .queryName("spark_log_stream") - //todo[vatsal]: accept checkpoint directory as argument - .option("checkpointLocation", "/tmp/"+this.getClass.getCanonicalName) + .queryName("spark_log_aggregator") + .option("checkpointLocation", sparkLogAggregatorCheckpointDir) .outputMode("update") .format("kafka") - .option("kafka.bootstrap.servers", "localhost:9092") + .option("kafka.bootstrap.servers", brokerList) .option("topic", "adImpressionsOut") .start() diff --git a/src/main/scala/io/snappydata/benchmark/CSVSnappyIngestionPerf.scala b/src/main/scala/io/snappydata/benchmark/CSVSnappyIngestionPerf.scala deleted file mode 100644 index bcd377f..0000000 --- a/src/main/scala/io/snappydata/benchmark/CSVSnappyIngestionPerf.scala +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ -package io.snappydata.benchmark - -import java.io.FileReader - -import com.opencsv.CSVReader -import io.snappydata.adanalytics.Configs -import io.snappydata.adanalytics.AdImpressionLog -import Configs._ -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.Row -import org.apache.spark.streaming.SnappyStreamingContext -import org.apache.spark.{SparkConf, SparkContext} - -import scala.collection.mutable.Queue -import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.Future -import scala.util.{Failure, Success} - -object CSVSnappyIngestionPerf extends App { - - val sparkConf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - sparkConf.set("spark.driver.extraClassPath", assemblyJar) - sparkConf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(sparkConf) - - val snsc = new SnappyStreamingContext(sc, batchDuration) - - snsc.snappyContext.dropTable("adImpressions", ifExists = true) - - val rddQueue = Queue[RDD[AdImpressionLog]]() - - val logStream = snsc.queueStream(rddQueue) - - val rows = logStream.map(v => Row(new java.sql.Timestamp(v.getTimestamp), v.getPublisher.toString, - v.getAdvertiser.toString, v.getWebsite.toString, v.getGeo.toString, v.getBid, v.getCookie.toString)) - - val logStreamAsTable = snsc.createSchemaDStream(rows, getAdImpressionSchema) - - snsc.snappyContext.createTable("adImpressions", "column", getAdImpressionSchema, - Map("buckets" -> "29")) - - logStreamAsTable.foreachDataFrame(_.write.insertInto("adImpressions")) - - val csvReader = Future { - import collection.JavaConverters._ - - val csvFile = new CSVReader(new FileReader("adimpressions.csv")) - csvFile.iterator.asScala - .map { fields => { - val log = new AdImpressionLog() - log.setTimestamp(fields(0).toLong) - log.setPublisher(fields(1)) - log.setAdvertiser(fields(2)) - log.setWebsite(fields(3)) - log.setGeo(fields(4)) - log.setBid(fields(5).toDouble) - log.setCookie(fields(6)) - log - } - }.grouped(100000).foreach { logs => - val logRDD = sc.parallelize(logs, 8) - rddQueue += logRDD - } - } - - csvReader.onComplete { - case Success(value) => - case Failure(e) => e.printStackTrace - } - - snsc.start() - snsc.awaitTermination() - -} diff --git a/src/main/scala/io/snappydata/benchmark/KafkaSnappyIngestionPerf.scala b/src/main/scala/io/snappydata/benchmark/KafkaSnappyIngestionPerf.scala deleted file mode 100644 index 44d8c95..0000000 --- a/src/main/scala/io/snappydata/benchmark/KafkaSnappyIngestionPerf.scala +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import io.snappydata.adanalytics.Configs._ -import org.apache.spark.SparkContext -import org.apache.spark.streaming.SnappyStreamingContext - -/** - * Simple direct kafka spark streaming program which pulls log messages - * from kafka broker and ingest those log messages to Snappy store. - */ -object KafkaSnappyIngestionPerf extends App { - - val sparkConf = new org.apache.spark.SparkConf() - .setAppName(getClass.getSimpleName) - .set("spark.sql.inMemoryColumnarStorage.compressed", "false") - .set("spark.sql.inMemoryColumnarStorage.batchSize", "2000") - .set("spark.streaming.kafka.maxRatePerPartition" , s"$maxRatePerPartition") - //.setMaster("local[*]") - .setMaster(s"$snappyMasterURL") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - sparkConf.set("spark.driver.extraClassPath", assemblyJar) - sparkConf.set("spark.executor.extraClassPath", assemblyJar) - } - - sparkConf.set("spark.driver.extraJavaOptions", "-Dgemfire.tombstone-gc-threshold=5000") - sparkConf.set("spark.executor.extraJavaOptions", "-Dgemfire.tombstone-gc-threshold=5000") - - val sc = new SparkContext(sparkConf) - val snsc = new SnappyStreamingContext(sc, batchDuration) - - snsc.sql("drop table if exists adImpressions") - snsc.sql("drop table if exists adImpressionStream") - - // Create a stream of AdImpressionLog which will pull the log messages - // from Kafka broker - snsc.sql("create stream table adImpressionStream (" + - " time_stamp timestamp," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using directkafka_stream options (" + - " rowConverter 'io.snappydata.adanalytics.AdImpressionToRowsConverter' ," + - s" kafkaParams 'metadata.broker.list->$brokerList'," + - s" topics '$kafkaTopic'," + - " K 'java.lang.String'," + - " V 'io.snappydata.adanalytics.AdImpressionLog', " + - " KD 'kafka.serializer.StringDecoder', " + - " VD 'io.snappydata.adanalytics.AdImpressionLogAvroDecoder')") - - snsc.sql("create table adImpressions(times_tamp timestamp, publisher string, " + - "advertiser string, website string, geo string, bid double, cookie string) " + - "using column " + - "options ( buckets '29', persistent 'asynchronous')") - - // Save the streaming data to snappy store per second (btachDuration) - snsc.getSchemaDStream("adImpressionStream") - .foreachDataFrame(_.write.insertInto("adImpressions")) - - snsc.start - snsc.awaitTermination -} diff --git a/src/main/scala/io/snappydata/benchmark/SnappyStreamIngestPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappyStreamIngestPerfJob.scala deleted file mode 100644 index cd6b07d..0000000 --- a/src/main/scala/io/snappydata/benchmark/SnappyStreamIngestPerfJob.scala +++ /dev/null @@ -1,55 +0,0 @@ -package io.snappydata.benchmark - -import com.typesafe.config.Config -import io.snappydata.adanalytics.Configs._ -import org.apache.spark.sql.streaming.SnappyStreamingJob -import org.apache.spark.sql.{SnappyJobValid, SnappyJobValidation} -import org.apache.spark.streaming.SnappyStreamingContext - -class SnappyStreamIngestPerfJob extends SnappyStreamingJob { - - override def runSnappyJob(snsc: SnappyStreamingContext, jobConfig: Config): Any = { - //snsc.sql("drop table if exists adImpressions") - snsc.sql("drop table if exists adImpressionStream") - - // Create a stream of AdImpressionLog which will pull the log messages - // from Kafka broker - snsc.sql("create stream table adImpressionStream (" + - " time_stamp timestamp," + - " publisher string," + - " advertiser string," + - " website string," + - " geo string," + - " bid double," + - " cookie string) " + - " using directkafka_stream options (" + - " rowConverter 'io.snappydata.adanalytics.AdImpressionToRowsConverter' ," + - s" kafkaParams 'metadata.broker.list->$brokerList'," + - s" topics '$kafkaTopic'," + - " K 'java.lang.String'," + - " V 'io.snappydata.adanalytics.AdImpressionLog', " + - " KD 'kafka.serializer.StringDecoder', " + - " VD 'io.snappydata.adanalytics.AdImpressionLogAvroDecoder')") - - snsc.sql("create table adImpressions(times_tamp timestamp, publisher string, " + - "advertiser string, website string, geo string, bid double, cookie string) " + - "using column " + - "options ( buckets '29')") - - snsc.sql("CREATE SAMPLE TABLE sampledAdImpressions" + - " OPTIONS(qcs 'geo,publisher', fraction '0.02', strataReservoirSize '50', baseTable 'adImpressions')") - - // Save the streaming data to snappy store per second (btachDuration) - snsc.getSchemaDStream("adImpressionStream").foreachDataFrame( df => { - df.write.insertInto("adImpressions") - df.write.insertInto("sampledAdImpressions") - }) - - snsc.start - snsc.awaitTermination - } - - override def isValidJob(snsc: SnappyStreamingContext, config: Config): SnappyJobValidation = { - SnappyJobValid() - } -} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/benchmark/SocketAdImpressionGenerator.scala b/src/main/scala/io/snappydata/benchmark/SocketAdImpressionGenerator.scala deleted file mode 100644 index a1c658b..0000000 --- a/src/main/scala/io/snappydata/benchmark/SocketAdImpressionGenerator.scala +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ -package io.snappydata.benchmark - -import java.io.{ByteArrayOutputStream, IOException} -import java.net.ServerSocket - -import io.snappydata.adanalytics.{Configs, AdImpressionGenerator} -import io.snappydata.adanalytics.AdImpressionLog -import org.apache.avro.io.EncoderFactory -import org.apache.avro.specific.SpecificDatumWriter -import org.apache.spark.streaming.StreamUtils -import Configs._ - -/** - * A Simple program which writes Avro objects to socket stream - */ -object SocketAdImpressionGenerator extends App { - - val bytesPerSec = 800000000 - val blockSize = bytesPerSec / 10 - val bufferStream = new ByteArrayOutputStream(blockSize + 1000) - val encoder = EncoderFactory.get.directBinaryEncoder(bufferStream, null) - val writer = new SpecificDatumWriter[AdImpressionLog]( - AdImpressionLog.getClassSchema) - while (bufferStream.size < blockSize) { - writer.write(AdImpressionGenerator.nextRandomAdImpression, encoder) - } -// encoder.flush -// bufferStream.close - - val serverSocket = new ServerSocket(socketPort) - println("Listening on port " + socketPort) - - while (true) { - val socket = serverSocket.accept() - println("Got a new connection") - val out = StreamUtils.getRateLimitedOutputStream(socket.getOutputStream, bytesPerSec) - try { - while (true) { - out.write(bufferStream.toByteArray) - //out.flush - } - } catch { - case e: IOException => - println("Client disconnected") - socket.close() - } - } -} - -/* -final class Server(port: Int) extends Runnable { - def run(): Unit = { - launchServerSockets(port) - } - - private def launchServerSockets(port: Int): Unit = { - val serverSocket = new ServerSocket(port, 50, InetAddress.getLocalHost) - println("Listening on port " + port) - - while (true) { - val socket = serverSocket.accept() - println("Got a new connection on "+ port) - try { - while (true) { - val threads = new Array[Thread](1) - for (i <- 0 until 1) { - val thread = new Thread(new Ingester(socket)) - thread.start() - threads(i) = thread - } - threads.foreach(_.join()) - } - } catch { - case e: IOException => - println("Client disconnected from port " + port) - socket.close() - } - } - } -} - -final class Ingester(socket: Socket) extends Runnable { - def run() { - for (i <- 0 until 100000) { - val out = new ByteArrayOutputStream(630000) //1000 AdImpressions - val encoder = EncoderFactory.get.directBinaryEncoder(out, null) - val writer = new SpecificDatumWriter[AdImpressionLog]( - AdImpressionLog.getClassSchema) - while (out.size < 630000) { - writer.write(generateAdImpression, encoder) - } - encoder.flush - out.close - writeToSocket(socket, out.toByteArray) - } - } - - private def writeToSocket(socket: Socket, bytes: Array[Byte]) = synchronized { - socket.getOutputStream.write(bytes) - socket.getOutputStream.flush() - } - - private def generateAdImpression(): AdImpressionLog = { - val numPublishers = 50 - val numAdvertisers = 30 - val publishers = (0 to numPublishers).map("publisher" +) - val advertisers = (0 to numAdvertisers).map("advertiser" +) - val unknownGeo = "un" - - val geos = Seq("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", - "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", - "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", - "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", - "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", unknownGeo) - - val numWebsites = 999 - val numCookies = 999 - val websites = (0 to numWebsites).map("website" +) - val cookies = (0 to numCookies).map("cookie" +) - - val random = new java.util.Random() - val timestamp = System.currentTimeMillis() - val publisher = publishers(random.nextInt(numPublishers - 10 + 1) + 10) - val advertiser = advertisers(random.nextInt(numAdvertisers - 10 + 1) + 10) - val website = websites(random.nextInt(numWebsites - 100 + 1) + 100) - val cookie = cookies(random.nextInt(numCookies - 100 + 1) + 100) - val geo = geos(random.nextInt(geos.size)) - val bid = math.abs(random.nextDouble()) % 1 - - val log = new AdImpressionLog() -// log.setTimestamp(1L) -// log.setPublisher("publisher") -// log.setAdvertiser("advertiser") -// log.setWebsite("website") -// log.setGeo("geo") -// log.setBid(1D) -// log.setCookie("cookie") - log.setTimestamp(timestamp) - log.setPublisher(publisher) - log.setAdvertiser(advertiser) - log.setWebsite(website) - log.setGeo(geo) - log.setBid(bid) - log.setCookie(cookie) - log - } -} -*/ diff --git a/src/main/scala/io/snappydata/benchmark/SocketSnappyIngestionPerf.scala b/src/main/scala/io/snappydata/benchmark/SocketSnappyIngestionPerf.scala deleted file mode 100644 index 1fbcd89..0000000 --- a/src/main/scala/io/snappydata/benchmark/SocketSnappyIngestionPerf.scala +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import io.snappydata.adanalytics.{Configs, AvroSocketStreamConverter} -import Configs._ -import io.snappydata.adanalytics.AdImpressionLog -import org.apache.spark.sql.Row -import org.apache.spark.storage.StorageLevel -import org.apache.spark.streaming.SnappyStreamingContext -import org.apache.spark.{SparkConf, SparkContext} - -/** - * Simple Snappy streaming program which pulls log messages - * from socket and ingest those log messages to Snappy store. - */ -object SocketSnappyIngestionPerf extends App { - - val sparkConf = new SparkConf() - .setAppName(getClass.getSimpleName) - .setMaster(s"$sparkMasterURL") - //.setMaster("snappydata://localhost:10334") - .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .set("spark.executor.extraJavaOptions", - " -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:FreqInlineSize=300 -XX:MaxInlineSize=300 ") - .set("spark.streaming.blockInterval", "50") - - val assemblyJar = System.getenv("PROJECT_ASSEMBLY_JAR") - if (assemblyJar != null) { - sparkConf.set("spark.driver.extraClassPath", assemblyJar) - sparkConf.set("spark.executor.extraClassPath", assemblyJar) - } - - val sc = new SparkContext(sparkConf) - - val snsc = new SnappyStreamingContext(sc, batchDuration) - - snsc.snappyContext.dropTable("adImpressions", ifExists = true) - - val converter = new AvroSocketStreamConverter - - val logStream = snsc.socketStream[AdImpressionLog](hostname, socketPort, converter.convert, StorageLevel.MEMORY_ONLY) - - val rows = logStream.map(v => Row(new java.sql.Timestamp(v.getTimestamp), v.getPublisher.toString, - v.getAdvertiser.toString, v.getWebsite.toString, v.getGeo.toString, v.getBid, v.getCookie.toString)) - - val logStreamAsTable = snsc.createSchemaDStream(rows, getAdImpressionSchema) - - snsc.snappyContext.createTable("adImpressions", "column", getAdImpressionSchema, - Map("buckets" -> "29")) - - logStreamAsTable.foreachDataFrame(_.write.insertInto("adImpressions")) - - snsc.start() - snsc.awaitTermination() -} From 058c3d31cc98ff9146006cedd1b78dfb3a602bab Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 16 Dec 2019 12:38:42 +0530 Subject: [PATCH 11/30] Removed some TODOs along with minor documentation corrections --- README.md | 61 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index c4d358f..fc46327 100644 --- a/README.md +++ b/README.md @@ -88,21 +88,20 @@ So the aggregation will look something like: ### Code highlights TODO[vatsal] : verify these links after merge to master -We implemented the ingestion logic using [Vanilla Spark API](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) -and [Spark API with Snappy extensions](https://github.com/SnappyDataInc/snappy-poc/blob/master/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) +We implemented the ingestion logic using [Vanilla Spark API](src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) +and [Spark API with Snappy extensions](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) to work with the stream as a sequence of DataFrames. -#### Generating the AdImpression logs -TODO[vatsal]: verify this step with along with the code snippet -A [KafkaAdImpressionGenerator](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates +#### Generating the AdImpression logs +A [KafkaAdImpressionProducer](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc)(Avro formatted objects) in batches to Kafka. - ```scala + +```scala val props = new Properties() - //props.put("partitioner.class", "kafka.producer.DefaultPartitioner") props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer") - props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAvroSerializer") - props.put("bootstrap.servers", "localhost:9092") + props.put("value.serializer", "io.snappydata.adanalytics.AdImpressionLogAVROSerializer") + props.put("bootstrap.servers", brokerList) val producer = new KafkaProducer[String, AdImpressionLog](props) @@ -121,14 +120,24 @@ Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc) def sendToKafka(log: AdImpressionLog): Future[RecordMetadata] = { producer.send(new ProducerRecord[String, AdImpressionLog]( - Configs.kafkaTopic, log.getTimestamp.toString, log)) + Configs.kafkaTopic, log.getTimestamp.toString, log), new org.apache.kafka.clients.producer.Callback() { + override def onCompletion(metadata: RecordMetadata, exception: Exception): Unit = { + if (exception != null) { + if (exception.isInstanceOf[RetriableException]) { + println(s"Encountered a retriable exception while sending messages: $exception") + } else { + throw exception + } + } + } + } + ) } - ``` +``` #### Spark Structured Streaming With Snappysink [SnappyLogAggregator](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) creates a stream over the Kafka source and ingests data into Snappydata table using [`Snappysink`](https://snappydatainc.github.io/snappydata/howto/use_stream_processing_with_snappydata/#structured-streaming). -TODO: replace with structured streaming code ```scala // The volumes are low. Optimize Spark shuffle by reducing the partition count snappy.sql("set spark.sql.shuffle.partitions=8") @@ -173,11 +182,10 @@ val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) val logStream = windowedDF .writeStream .format("snappysink") - .queryName("log_stream") + .queryName("log_aggregator") .trigger(ProcessingTime("1 seconds")) .option("tableName", "aggrAdImpressions") - //todo[vatsal]: accept checkpoint directory as argument - .option("checkpointLocation", s"/tmp/${this.getClass.getCanonicalName}") + .option("checkpointLocation", snappyLogAggregatorCheckpointDir) .outputMode("update") .start @@ -199,17 +207,10 @@ In order to run this example, we need to install the following: 1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) TODO[vatsal]: link to enterprise TIBCO ComputeDB here? -2. [SnappyData 1.1.1 Enterprise Release](). Download the binary snappydata-1.0.0-bin.tar.gz and Unzip it. +2. [SnappyData 1.1.1 Enterprise Release](). Download the artifact snappydata-1.1.1-bin.tar.gz and Unzip it. The binaries will be inside "snappydata-1.1.1-bin" directory. 3. JDK 8 -Then checkout the Ad analytics example -``` -git clone https://github.com/SnappyDataInc/snappy-poc.git -``` - -Note that the instructions for kafka configuration below are for 2.11-0.10.2.2 version of Kafka. - To setup kafka cluster, start Zookeeper first from the root kafka folder with default zookeeper.properties: ``` bin/zookeeper-server-start.sh config/zookeeper.properties @@ -225,6 +226,11 @@ From the root kafka folder, Create a topic "adImpressionsTopic": bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 8 --topic adImpressionsTopic --replication-factor=1 ``` +Checkout the Ad analytics example +``` +git clone https://github.com/SnappyDataInc/snappy-poc.git +``` + Next from the checkout `/snappy-poc/` directory, build the example ``` -- Build and create a jar having all dependencies in assembly/build/libs @@ -238,7 +244,7 @@ Goto the SnappyData product install home directory. In conf subdirectory, create file "spark-env.sh"(copy spark-env.sh.template) and add this line ... ``` -SPARK_DIST_CLASSPATH=SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +SPARK_DIST_CLASSPATH=$SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` > Make sure you set the SNAPPY_POC_HOME directory appropriately above @@ -256,7 +262,7 @@ Submit the streaming job to the cluster and start it (consume the stream, aggreg > Make sure you copy/paste the SNAPPY_POC_HOME path from above in the command below where indicated ``` -./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar $SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can @@ -268,7 +274,7 @@ Start generating and publishing logs to Kafka from the `/snappy-poc/` folder ./gradlew generateAdImpressions ``` -You can monitor the streaming query processing on the [Structured Streaming UI](http://localhost:4040/streaming/). It is +You can monitor the streaming query processing on the [Structured Streaming UI](http://localhost:5050/structuredstreaming/). It is important that our stream processing keeps up with the input rate. So, we should note that the `Processing Rate` keeps up with `Input Rate` and `Processing Time` remains less than the trigger interval which is one second. @@ -354,9 +360,6 @@ Finally, stop the SnappyData cluster with: ### So, what was the point again? Hopefully we showed you how simple yet flexible it is to parallely ingest, process using SQL, run continuous queries, store data in column and sample tables and interactively query data. All in a single unified cluster. -TODO[vatsal]: should we keep this line? -We will soon release Part B of this exercise - a benchmark of this use case where we compare SnappyData to other -alternatives. Coming soon. ### Ask questions, start a Discussion From aba27925f5f1a7f4c9b09b40b8c1ce0d487428ec Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 16 Dec 2019 15:43:09 +0530 Subject: [PATCH 12/30] Clean up --- README.md | 18 ++--- build.gradle | 74 +------------------ .../adanalytics/SnappyLogAggregator.scala | 6 +- .../adanalytics/SparkLogAggregator.scala | 13 ++-- 4 files changed, 21 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index fc46327..5a9c96f 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,12 @@ The incoming AdImpression log is formatted as depicted below. We pre-aggregate these logs by publisher and geo, and compute the average bid, the number of impressions and the number -of uniques (the number of unique users that viewed the Ad) every 2 seconds(TODO[vatsal]- every second?). We want to -maintain the last day’s worth of data in memory for interactive analytics from external clients. +of uniques (the number of unique users that viewed the Ad) every second. We want to maintain the last day’s worth of +data in memory for interactive analytics from external clients. Some examples of interactive queries: -- **Find total uniques for a certain AD grouped on geography;** -- **Impression trends for advertisers over time;** -- **Top ads based on uniques count for each Geo.** +- **Find total uniques for a certain AD grouped on geography** +- **Impression trends for advertisers over time** +- **Top ads based on uniques count for each Geo** //todo[vatsal]: the timestamp millis values should be zero if we are aggregating on the window of 1 second So the aggregation will look something like: @@ -87,12 +87,10 @@ So the aggregation will look something like: |2016-05-25 16:44:56.803 |publisher38| WI |0.4585381957119518|40 |31 | ### Code highlights -TODO[vatsal] : verify these links after merge to master -We implemented the ingestion logic using [Vanilla Spark API](src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) -and [Spark API with Snappy extensions](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) +We implemented the ingestion logic using [Vanilla Spark Structured Streaming](src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) +and [Spark Structured Streaming with Snappy Sink](src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala) to work with the stream as a sequence of DataFrames. - #### Generating the AdImpression logs A [KafkaAdImpressionProducer](src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala) simulates Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc)(Avro formatted objects) in batches to Kafka. @@ -241,7 +239,7 @@ Next from the checkout `/snappy-poc/` directory, build the example ``` Goto the SnappyData product install home directory. -In conf subdirectory, create file "spark-env.sh"(copy spark-env.sh.template) and add this line ... +In conf subdirectory, create file "spark-env.sh" (copy spark-env.sh.template) and add this line ... ``` SPARK_DIST_CLASSPATH=$SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar diff --git a/build.gradle b/build.gradle index 96a8048..a47d816 100644 --- a/build.gradle +++ b/build.gradle @@ -51,12 +51,7 @@ dependencies { // compileOnly "io.snappydata:snappydata-aqp_2.11:${snappyVersion}" compile 'org.apache.kafka:kafka-clients:0.10.0.1' - compile 'com.miguno:kafka-avro-codec_2.10:0.1.1-SNAPSHOT' compile 'org.apache.kafka:kafka_2.11:0.10.0.1' - compile 'com.twitter:algebird-core_2.10:0.1.11' - compile 'com.googlecode.javaewah:JavaEWAH:1.1.5' - compile 'org.joda:joda-convert:1.2' - compile 'com.opencsv:opencsv:3.3' } sourceSets { @@ -86,82 +81,17 @@ task generateAdImpressions(type: JavaExec, dependsOn: classes) { environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath } -task aggeregateAdImpressions_API(type: JavaExec, dependsOn: classes) { +task aggeregateAdImpressions(type: JavaExec, dependsOn: classes) { main = 'io.snappydata.adanalytics.SnappyLogAggregator' jvmArgs = ['-XX:MaxPermSize=512m'] classpath sourceSets.test.runtimeClasspath environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath } -task aggeregateAdImpressions_SQL(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.adanalytics.SnappySQLLogAggregator' - jvmArgs = ['-XX:MaxPermSize=512m'] - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task generateAdImpressions_Socket(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.SocketAdImpressionGenerator' - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath - maxHeapSize = "8196m" -} - -task startSnappyIngestionPerf_Socket(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.SocketSnappyIngestionPerf' - jvmArgs = ['-XX:MaxPermSize=512m'] - maxHeapSize = "8196m" - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task startSnappyIngestionPerf_CustomReceiver(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.CustomReceiverSnappyIngestionPerf' - jvmArgs = ['-XX:MaxPermSize=512m'] - maxHeapSize = "8196m" - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task startSnappyIngestionPerf_CSV(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.CSVSnappyIngestionPerf' - jvmArgs = ['-XX:MaxPermSize=512m'] - maxHeapSize = "8196m" - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - task startSnappyIngestionPerf_Kafka(type: JavaExec, dependsOn: classes) { main = 'io.snappydata.benchmark.KafkaSnappyIngestionPerf' jvmArgs = ['-XX:MaxPermSize=512m'] maxHeapSize = "8196m" classpath sourceSets.test.runtimeClasspath environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task product(type: Exec) { - dependsOn ':assembly:shadowJar' - - def productDir = "${rootProject.buildDir}/snappydata-poc" - def snappyData = System.env.SNAPPYDATA - if (snappyData == null || snappyData.length() == 0) { - snappyData = "${projectDir}/../snappydata" - } - - doFirst { - delete productDir - file("${productDir}/lib").mkdirs() - } - - // first execute the snappydata "product" target based on env var SNAPPYDATA - workingDir snappyData - commandLine './gradlew', 'copyProduct', "-PcopyToDir=${productDir}" - - // lastly copy own assembly fat jar in product lib dir - doLast { - copy { - from assemblyJar - into "${productDir}/lib" - } - } -} +} \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 683f6cc..5797dc1 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -22,7 +22,7 @@ import io.snappydata.adanalytics.Configs._ import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.RowEncoder -import org.apache.spark.sql.functions.{avg, count, approx_count_distinct, window} +import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, min, window} import org.apache.spark.sql.types._ import org.apache.spark.{SparkConf, SparkContext} @@ -92,8 +92,8 @@ object SnappyLogAggregator extends SnappySQLJob with App { val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") - .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"timestamp", $"publisher", $"geo") - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") + .agg(min("timestamp").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias("imps"), approx_count_distinct("cookie").alias("uniques")) .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 7aad36f..54d2292 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -8,6 +8,7 @@ import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, window import org.apache.spark.sql.types._ import org.apache.spark.sql.{Encoders, Row, SparkSession} import org.apache.spark.streaming.{Seconds, StreamingContext} + /** * Vanilla Spark implementation with no Snappy extensions being used. */ @@ -22,8 +23,10 @@ object SparkLogAggregator extends App { StructField("bid", DoubleType), StructField("cookie", StringType))) private val spark = SparkSession.builder().getOrCreate() + import spark.implicits._ -// private val snappy = new SnappySession(spark.sparkContext) + + // private val snappy = new SnappySession(spark.sparkContext) val df = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerList) @@ -44,15 +47,15 @@ object SparkLogAggregator extends App { .filter(s"geo != '${Configs.UnknownGeo}'") // Group by on sliding window of 1 second - val windowedDF = df.withColumn("eventTime", $"timestamp1".cast("timestamp")) + val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), - df.col("publisher"), df.col("geo")) - .agg(avg("bid").alias("avg_bid"),count("geo").alias("imps"), + df.col("publisher"), df.col("geo")) + .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), approx_count_distinct("cookie").alias("uniques")) val logStream = windowedDF.select("window.start", "publisher", "geo", "imps", "uniques") - .map(r=>Row(r.getValuesMap(Seq("start","publisher","geo","avg_bid","imps","uniques")) + .map(r => Row(r.getValuesMap(Seq("start", "publisher", "geo", "avg_bid", "imps", "uniques")) .mkString(",")))(RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true))))) .writeStream .queryName("spark_log_aggregator") From 20db11a4e5e339a5e256ae9dd64372f63de32540 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 16 Dec 2019 16:49:01 +0530 Subject: [PATCH 13/30] some corrections --- .../io/snappydata/adanalytics/SparkLogAggregator.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 54d2292..7384ea3 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,6 +1,7 @@ package io.snappydata.adanalytics import io.snappydata.adanalytics.Configs._ +import org.apache.commons.lang.StringEscapeUtils import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.SparkConf import org.apache.spark.sql.catalyst.encoders.RowEncoder @@ -18,7 +19,7 @@ object SparkLogAggregator extends App { .setAppName(getClass.getName) .setMaster("local[*]") val ssc = new StreamingContext(sc, Seconds(1)) - val schema = StructType(Seq(StructField("timestamp1", TimestampType), StructField("publisher", StringType), + val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) @@ -26,7 +27,6 @@ object SparkLogAggregator extends App { import spark.implicits._ - // private val snappy = new SnappySession(spark.sparkContext) val df = spark.readStream .format("kafka") .option("kafka.bootstrap.servers", brokerList) @@ -49,14 +49,14 @@ object SparkLogAggregator extends App { // Group by on sliding window of 1 second val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") - .groupBy(window($"eventTime", "1 seconds", "1 seconds"), - df.col("publisher"), df.col("geo")) + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), approx_count_distinct("cookie").alias("uniques")) + private val encoder = RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true)))) val logStream = windowedDF.select("window.start", "publisher", "geo", "imps", "uniques") .map(r => Row(r.getValuesMap(Seq("start", "publisher", "geo", "avg_bid", "imps", "uniques")) - .mkString(",")))(RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true))))) + .map(s => StringEscapeUtils.escapeCsv(s.toString())).mkString(",")))(encoder) .writeStream .queryName("spark_log_aggregator") .option("checkpointLocation", sparkLogAggregatorCheckpointDir) From 25c70248c38504500ffd1ca891768d00600f9e4a Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Wed, 18 Dec 2019 12:46:48 +0530 Subject: [PATCH 14/30] Increasing max offset value per trigger. --- .../scala/io/snappydata/adanalytics/SnappyLogAggregator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 5797dc1..61b3df6 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -76,7 +76,7 @@ object SnappyLogAggregator extends SnappySQLJob with App { .option("kafka.bootstrap.servers", brokerList) .option("value.deserializer", classOf[ByteArrayDeserializer].getName) .option("startingOffsets", "earliest") - .option("maxOffsetsPerTrigger", 10000) + .option("maxOffsetsPerTrigger", 100000) .option("subscribe", kafkaTopic) .load().select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { From 2bb9391cbf67d5c06a43baf0001a88119befecfb Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 19 Dec 2019 15:41:21 +0530 Subject: [PATCH 15/30] Creating sample table on top of target table. --- .../scala/io/snappydata/adanalytics/SnappyLogAggregator.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 61b3df6..ca4d5e3 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -62,10 +62,14 @@ object SnappyLogAggregator extends SnappySQLJob with App { import org.apache.spark.sql.streaming.ProcessingTime snappy.sql("drop table if exists aggrAdImpressions") + snappy.sql("drop table if exists sampledAdImpressions") snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + " geo string, avg_bid double, imps long, uniques long) " + "using column options(buckets '11')") + snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + + " OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") + val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) From bfd1547c97cb109630ec62c542fcb9c5b59b3403 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Fri, 20 Dec 2019 11:04:31 +0530 Subject: [PATCH 16/30] Dropping sample table before base table. --- .../scala/io/snappydata/adanalytics/SnappyLogAggregator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index ca4d5e3..9ecb123 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -61,8 +61,8 @@ object SnappyLogAggregator extends SnappySQLJob with App { snappy.sql("set spark.sql.shuffle.partitions=8") import org.apache.spark.sql.streaming.ProcessingTime - snappy.sql("drop table if exists aggrAdImpressions") snappy.sql("drop table if exists sampledAdImpressions") + snappy.sql("drop table if exists aggrAdImpressions") snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + " geo string, avg_bid double, imps long, uniques long) " + From 1b300ce612c726e6730fd35b177f0d7bc5409d77 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 6 Jan 2020 14:53:32 +0530 Subject: [PATCH 17/30] Adding docs in the code. --- README.md | 6 +- .../adanalytics/SnappyLogAggregator.scala | 57 ++++++++++++------- .../adanalytics/SparkLogAggregator.scala | 27 +++++---- 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 5a9c96f..00c1e95 100644 --- a/README.md +++ b/README.md @@ -242,11 +242,11 @@ Goto the SnappyData product install home directory. In conf subdirectory, create file "spark-env.sh" (copy spark-env.sh.template) and add this line ... ``` -SPARK_DIST_CLASSPATH=$SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +SPARK_DIST_CLASSPATH=/assembly/build/libs/snappy-poc-1.1.1-assembly.jar ``` -> Make sure you set the SNAPPY_POC_HOME directory appropriately above +> Make sure you set the `snappy_poc_home` directory appropriately above -Leave this file open as you will copy/paste the path for SNAPPY_POC_HOME shortly. +Leave this file open as you will copy/paste the path for `snappy_poc_home` shortly. Start SnappyData cluster using following command from installation directory. diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 9ecb123..23ec01d 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -22,16 +22,32 @@ import io.snappydata.adanalytics.Configs._ import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.encoders.RowEncoder -import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, min, window} +import org.apache.spark.sql.functions._ +import org.apache.spark.sql.streaming.ProcessingTime import org.apache.spark.sql.types._ import org.apache.spark.{SparkConf, SparkContext} /** - * Example using Spark API + Snappy extension to model a Stream as a DataFrame. - * - * This example can be run either in local mode or can be submitted as a job - * to an already running SnappyData cluster. - */ + * Example using Spark API + Snappy extension to model a Stream as a DataFrame. + * + * This example can be run either in local mode or can be submitted as a job + * to an already running SnappyData cluster. + * + * To run the job as snappy-job use following command from snappy product home: + * {{{ + * ./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics \ + * --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar \ + * + * }}} + * + * To run the job as a smart connector application use the following command: + * {{{ + * ./bin/spark-submit --class io.snappydata.adanalytics.SnappyLogAggregator \ + * --conf spark.snappydata.connection=localhost:1527 --master \ + * + * }}} + * Note that for smart connector mode the application UI will be started on 4041 port. + */ object SnappyLogAggregator extends SnappySQLJob with App { val conf = new SparkConf() @@ -52,26 +68,23 @@ object SnappyLogAggregator extends SnappySQLJob with App { runSnappyJob(snappy, ConfigFactory.empty()) - /** Contains the implementation of the Job, Snappy uses this as - * an entry point to execute Snappy job - */ + /** Contains the implementation of the Job, Snappy uses this as an entry point to execute + * Snappy job + */ override def runSnappyJob(snappy: SnappySession, jobConfig: Config): Any = { // The volumes are low. Optimize Spark shuffle by reducing the partition count snappy.sql("set spark.sql.shuffle.partitions=8") - import org.apache.spark.sql.streaming.ProcessingTime - snappy.sql("drop table if exists sampledAdImpressions") snappy.sql("drop table if exists aggrAdImpressions") snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + " geo string, avg_bid double, imps long, uniques long) " + "using column options(buckets '11')") - snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + - " OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") - val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), - StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), + val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", + StringType), StructField("advertiser", StringType), + StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) import snappy.implicits._ @@ -80,24 +93,30 @@ object SnappyLogAggregator extends SnappySQLJob with App { .option("kafka.bootstrap.servers", brokerList) .option("value.deserializer", classOf[ByteArrayDeserializer].getName) .option("startingOffsets", "earliest") + // limiting maximum events to be processed in a single batch .option("maxOffsetsPerTrigger", 100000) .option("subscribe", kafkaTopic) .load().select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { + // Reuse deserializer for each partition which will internally reuse decoder and data object val deserializer = new AdImpressionLogAVRODeserializer itr.map(data => { val adImpressionLog = deserializer.deserialize(data) - Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, - adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, - adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher + .toString, adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, + adImpressionLog.getCookie.toString) }) })(RowEncoder.apply(schema)) + // filtering invalid records .filter(s"geo != '${Configs.UnknownGeo}'") + // Aggregating records with val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") - .agg(min("timestamp").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias("imps"), + .agg(unix_timestamp(min("timestamp"), "MM-dd-yyyy HH:mm:ss").alias("timestamp"), + avg("bid").alias("avg_bid"), count("geo").alias("imps"), approx_count_distinct("cookie").alias("uniques")) .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 7384ea3..073d331 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -4,15 +4,16 @@ import io.snappydata.adanalytics.Configs._ import org.apache.commons.lang.StringEscapeUtils import org.apache.kafka.common.serialization.ByteArrayDeserializer import org.apache.spark.SparkConf -import org.apache.spark.sql.catalyst.encoders.RowEncoder -import org.apache.spark.sql.functions.{approx_count_distinct, avg, count, window} +import org.apache.spark.sql.catalyst.encoders.{ExpressionEncoder, RowEncoder} +import org.apache.spark.sql.functions._ import org.apache.spark.sql.types._ import org.apache.spark.sql.{Encoders, Row, SparkSession} import org.apache.spark.streaming.{Seconds, StreamingContext} /** - * Vanilla Spark implementation with no Snappy extensions being used. - */ + * Vanilla Spark implementation with no Snappy extensions being used. The aggregated data is + * written to a kafka topic. + */ object SparkLogAggregator extends App { val sc = new SparkConf() @@ -44,19 +45,23 @@ object SparkLogAggregator extends App { adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) }) })(RowEncoder.apply(schema)) - .filter(s"geo != '${Configs.UnknownGeo}'") + .filter(s"geo != '${Configs.UnknownGeo}'") // filtering invalid data // Group by on sliding window of 1 second val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), - approx_count_distinct("cookie").alias("uniques")) + .agg(min("timestamp").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias + ("imps"), approx_count_distinct("cookie").alias("uniques")) + .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") - private val encoder = RowEncoder(StructType(Seq(StructField("value", StringType, nullable = true)))) - val logStream = windowedDF.select("window.start", "publisher", "geo", "imps", "uniques") - .map(r => Row(r.getValuesMap(Seq("start", "publisher", "geo", "avg_bid", "imps", "uniques")) - .map(s => StringEscapeUtils.escapeCsv(s.toString())).mkString(",")))(encoder) + // content of 'value' column will be written to kafka topic as value + private val targetSchema = StructType(Seq(StructField("value", StringType))) + implicit val encoder: ExpressionEncoder[Row] = RowEncoder(targetSchema) + + // writing aggregated records on a kafka topic in CSV format + val logStream = windowedDF + .map(r => Row(r.toSeq.map(f => StringEscapeUtils.escapeCsv(f.toString)).mkString(","))) .writeStream .queryName("spark_log_aggregator") .option("checkpointLocation", sparkLogAggregatorCheckpointDir) From c1d4c51e0730630ebf9b321a824cf63758b1929e Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 13 Jan 2020 16:19:39 +0530 Subject: [PATCH 18/30] Updating copyright header --- .../adanalytics/AdImpressionGenerator.scala | 2 +- .../AdImpressionLogAVRODeserializer.scala | 2 +- .../AdImpressionLogAVROSerializer.scala | 2 +- .../io/snappydata/adanalytics/Configs.scala | 2 +- .../adanalytics/KafkaAdImpressionProducer.scala | 2 +- .../adanalytics/SnappyLogAggregator.scala | 2 +- .../adanalytics/SparkLogAggregator.scala | 17 +++++++++++++++++ .../benchmark/SnappyQueryPerfJob.scala | 17 +++++++++++++++++ .../benchmark/SnappySampleQueryPerfJob.scala | 17 +++++++++++++++++ 9 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala index e420822..773a714 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala index 7dad669..5b691e1 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala index d195c9c..0f1fbba 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index ac14ea9..5271bf8 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index 6e5b3ad..ba740d5 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 23ec01d..307e869 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 SnappyData, Inc. All rights reserved. + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 073d331..bf44ff9 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + package io.snappydata.adanalytics import io.snappydata.adanalytics.Configs._ diff --git a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala index d0bd9f5..bd921d1 100644 --- a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala +++ b/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + package io.snappydata.benchmark import java.io.PrintWriter diff --git a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala index ef48c80..3d6694b 100644 --- a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala +++ b/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + package io.snappydata.benchmark import java.io.PrintWriter From 137e0a566dda50102f1e1f83803b638fce71a7a9 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Fri, 17 Jan 2020 16:46:02 +0530 Subject: [PATCH 19/30] removing unused maven repos --- build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.gradle b/build.gradle index a47d816..69de09e 100644 --- a/build.gradle +++ b/build.gradle @@ -13,10 +13,7 @@ allprojects { repositories { mavenLocal() mavenCentral() - maven { url "https://oss.sonatype.org/content/groups/public" } - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } maven { url "http://mvnrepository.com/artifact" } - maven { url 'https://clojars.org/repo' } } apply plugin: 'java' From 81460814148717634533ccd6950b83b207439af9 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 13 Feb 2020 16:35:24 +0530 Subject: [PATCH 20/30] Updating copyright header --- .../scala/io/snappydata/adanalytics/AdImpressionGenerator.scala | 2 +- .../adanalytics/AdImpressionLogAVRODeserializer.scala | 2 +- .../snappydata/adanalytics/AdImpressionLogAVROSerializer.scala | 2 +- src/main/scala/io/snappydata/adanalytics/Configs.scala | 2 +- .../io/snappydata/adanalytics/KafkaAdImpressionProducer.scala | 2 +- .../scala/io/snappydata/adanalytics/SnappyLogAggregator.scala | 2 +- .../scala/io/snappydata/adanalytics/SparkLogAggregator.scala | 2 +- src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala | 2 +- .../io/snappydata/benchmark/SnappySampleQueryPerfJob.scala | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala index 773a714..685de1c 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala index 5b691e1..1260695 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala index 0f1fbba..f2057a1 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index 5271bf8..90795a7 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index ba740d5..1d18fd7 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 307e869..9596033 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index bf44ff9..f554082 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala index bd921d1..3c5d6a7 100644 --- a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala +++ b/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You diff --git a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala index 3d6694b..3e773ad 100644 --- a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala +++ b/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 TIBCO Software Inc. All rights reserved. + * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You From 7ea61b02e2d5e56696c964d4759b6d6d81e523fe Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 17 Feb 2020 18:14:22 +0530 Subject: [PATCH 21/30] - updating diagram - cleanup - correction in readme - bumping up snappy version --- AdAnalytics_Architecture.png | Bin 363077 -> 359925 bytes README.md | 41 ++++++------ build.gradle | 24 +------ .../io/snappydata/adanalytics/Configs.scala | 34 +--------- .../adanalytics/SnappyLogAggregator.scala | 5 +- .../adanalytics/SparkLogAggregator.scala | 9 ++- .../benchmark/SnappyQueryPerfJob.scala | 55 ---------------- .../benchmark/SnappySampleQueryPerfJob.scala | 60 ------------------ 8 files changed, 37 insertions(+), 191 deletions(-) delete mode 100644 src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala delete mode 100644 src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala diff --git a/AdAnalytics_Architecture.png b/AdAnalytics_Architecture.png index b45c3d0c37788fdf529bcac03f6d2148e9b64595..b3eae526df2d430487e75b6846a90f7e1fe87533 100644 GIT binary patch literal 359925 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�-Pk&%&s zJP!=00Fi=!nIBVzP5Z0Rq~e^PY$DCiOti%5{PHJ*uwrPD<7h=yRow+Bz(HVnU%$cu zzb!pIeLFB(JFK-sA1u~m{`m2uun0xRWTSdiC?MZLRIqG2kcMc>`8BW^tFHlfJ-Yh? z*Q`!JPdH(hX|=<%0&e8S1Pw2QuWUCLWqv$lTdr2-3*^9AmW)rF&#eYE-?$-u|L4)m zT}K{`??OQK$GT6y^dM!^690!3-Ik@cIq>kk^Y z@ zq7R;GquPwYv@*pt<;;%7vjJn{E}yyV-D=t}LAvMS(?*w>ZAfw1Tets5)muPC-9_EQ zbPh0dh;%89bji?2D;?4)sibtLv~;6@AdP^4bcl3!j)-(gNPc&G-uM5lcZso?yy`EP=dMVHE^?{FReWyjUD3Puz9^0naIP!VvN*CrrT}tK z(DtmkZe4b{k`Mcm<#9DN&g(dhWIj$I|FsS}48gx#G0*0j�kEw_ys?YdQkXi=9`u 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�HoFlRI$6SzQJ9^ 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 z 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 z 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%0As60O0sTl-t9VmXuUDBy1Qdr44Je z_?a6~+MG9{D4eeVctQ%NTJR9Aiwy-ot#u!*@kis^-qV%@@H7D3$#cqh*57%B_*Rr9 zOK^OSPJwO?^R+9UZdu8XQVv506V0m?6UjJM!dZQ`Nx%-*F0+uYheQy<_(Zv#+-|OP z?xXp3@#aYa&s1V+yze3_H(8h#@r1x%V{@17B+cV-gFM2+y4BUf+h^_^1M{6{5T9sT z@cs(w*5Z>)35&n1gCdgXUYf?q7H`Jy3Oy-rr&l=+W}s9%|F6>!1hf%l)BD5odVPKq zJZ#$9a;y}Z@ z{d^g9iB=JnF)}aRJo+80IF2RnV>5u3cW)@a6wHXH+KlHuN#edz(X|w_wG@kPmv9f` zBpb=JG@OCOp1x7czt}gQ%uY%68BV4ys&BDziE4N3s5c9J9ve*Na>1llU()z41*aQ8ioyPsz(4Aoj2o=?fF0{qHu zP!eB>Bn&%J)F-ofugK@5P>$Z6u`ZOX@$TOW4gMtmn&L|FYkd z%s6@@7=3L_)H=NW<+y3Tf^$-4k@%VNDev1$3gms|!WC0Siua7Br1cXoEXM0e^l{(w zaoOmQ9$SWXSkZ_%vCE3QRXu5wLaj;p?O3?C0w+ER?^^d{;fBRIE;$c{{XGfv=&J$| zbIRfj<&SC>hYW|X=}W*qY0D~Cxayl;xcs7bq(3=}MpI|F(rrXgYm1!}(h&w5o!OjPLc zsyr-R!74mIt+p0kz=dUi`He^*E$^c3g#JmLL5rK0H|syNfqV{MmbC^=I8iJk5ag4M z7xfD&%lanL%`jTVu+B}RXi|ErIf7QyqLv(TcUh;Q z4Qc0(+he)U-4hmR`*Y*FEX{E;d}5Xyakn3SUB%>rb}=dUk+0T&L{XCDt*mNr%?2bj z3`v#B(gqRXZOb!NvLc(sw$E&gbTqA68y!`z*B)@Rhny`+i(PKJpN2KLTZp}|?%pL< zrfUEX2a2-2y*<~;m5R46N^@#gBVYmmS}5*-z(d}~Mt`rks_NY5{odyfGY4o8T?e>z zJ3}#u2abgXhnc$xXt%_vpZ%LkD-3{+ZRe^N&6UK}$+A4Tx+8uEUBc_NMsbbpx6fo= zRGf4P4cIYHJ6*3oDtV^)3)$n!IZ6+2j~%gL=|{ijNo}wx}JaaB=`Vc zNo<=jhe6X|(0_@F0PBCMt^MXSYXF7NMV7u+DgeC&G{=h5?@)(k!LHb+FEzW(`?;grq; zC`QtT#I>Y`EMifE@mNMIKIp7X-$ibi#iEdF*^yX7DMQhyz+g@ln^TV3Z{FA2>wziP z7GIw_(r)kw57u4AS~ooEZ_Z!OIftxiX+QhFQnMJTwZB_wAAc0)g%k#9HtqT1=|2Ve z0MnBi$s1n75eVmBRz5+_Ig|Km=P&25qFuurFj=W@LqS&EzSiaD^og&+$x|{Uva*zL z(PwJdQa#>)sMT657*nZ7NYxO)uNub;#S#n0U!y4&Knv;r2!w{kpltynx3`P;w~N{# z0@yuY0>s~|*Pz_>fZZ1QR^6OUVqqMeiat@2*#rG!bo#AImoCZU_4U(Y3=M5n?90Ud ziOEoXe7inYgrxTisfZ)WL{Lf?L5;SeTW2Yf?!)LaJbl$6ro>WUYsdriVg`&r*xlwt z!BA!PoFDk$@7E|^dW#r2jXRPXw7=OcYpuKO4Vaw!0qB`Y$Fk?OHBO}%U zsAbQXTE1_San$0Pf~t<$DRY<+?{O3gSutPo(lYx?rPF)WZ?ASFud@)Rv8^r?`m#lz zI`h|(>Pe3K74wNZp(vc*Np5a#9r~1MbC!$=CN6ULd9Ju?P7ra2%a7<9=gmg zq`}^`cqh0Q&rmgdv!Z$tC2h`T$FV6U(r?uK(_jn`J!JEcegxBLw_FCI%6-{Yibon& z1qN!3EpTVF@2u3dZ7sL254Ax&5R~*y`1)p$*zt>@Cd<~mka!tWOKf{bez-I(T*SSJ z3sV#9$my|)L&^q+CGYIC9dRIVHjwtHPtz*UMZ89yl@4E-KRdN-Cfgk-ZWz^G?k=} z|I3R<;z2|NY!`cH`=7C;f1I!GuOky41 zMvhUJ(Z_mat=2`H#(vJR(`!xF(^ZnO&hU+ z@$UQr`9dgExy@UBCLpYFCy<(Tg>kzSMXz9J2^!d{b=QMzhr(<81G%2Q)np?&YE{*z zq>F+xH6iV|RPupfA$q!oTn=nOfZSDYi^HL_1E`UQ?ny!@VQY_4M5}<=AI&zr(#FN>}O(n^R z4-~)vh8U`2Z2Z#3!||u%wSV0{M;MVrIOrqlLx5Z@I*V({E`j{~5M6$%Mti0EN_H&0 zO(zf_DWhIHEuuFv_Y2~9AOvKXS;W0>C?yFB8q(6k$9%cI!07_9GHNv)r-{X>DG2WV z2RB4q(^oTGJ|1ymU*f7Vno4YSK1c0t>=Hs{mGZQKZvz5g3F=QGrqp_&;7-GVcyj*< zN~pKQ_{t=VvU~*I4_mBO3mtb0T0q~B{g-y8eq!!}OowRxw+A3|tSv4kulW{J&&)W> zAkH0)n#Y#2X{Z*xK^dQ>pRAkfkpJvK^3~t>ibGktt%-3dzBX(YLv{rw@qj7t@(?N| zz6J#qen4c-Pu@a>P8WU}(%F?L+R9|wP8XyB+c>4K)@|?EH_oOEtQyj@$6HW9bV`Tu za{xPtHR(4aGYOaHCKc%klO)WwI}*)c1sq+T>Cnoq{v7UnhUQJ z4ecj+{q3Z(*&D!o05T!vcLrAvrH0#Sal(mAPE@5{qOENbPPsYsL@Ld(-NMx~d=GEW z{Vxhp$if7Eb6N*B%!U2{SFs5Y6rpAQi8lM5KZ zgsKGVZIeDlBRAwRPfMLN#tLy_Iop4<#ry@;_pyM*bEK%K<4cRt>-9zVV_=HHCnD3+ zA%^i@Cg^RI7EP1iT)Mz880>L+)a$a@i4WZp4WbKp%u}tHl2s z68IU*uYp<7LXGIh#B|cFO_GBaZxe=&f=M6@wvz_(t+IH(@Z~Bv0`waN%P}TSwcU8y zONyR1wx=txJuVK;Ine9+kk&f zQpH1`&4HBr{q4V0;HMbq4T zgd7tMJt7nT9lz(=7EyteLDyg=c36U*78!qMWGqH~kc{O&np^IW zh~X(PzXIwry;-2Tq1#FrS@1MAOb4Gu0^EyK!v9zRHZEi&BT!knjtE%A_$O*T7kX~* zy(X;S1DbZs>Kg37)QLFdBIz!ZmNX$WN)iBr<9-+>WKP3l#QiV&p$BZU9w_TqiU>Zh zBVtqA4^pQc8Sl~Y6H%*nw(*nW%z1f4t{`-=o^}dr%WVvBG=uG820cIGU(Rfoh?xiR zyiu$N)hRX6d>2JDg6jw4g&d$AUJh%Vt2}Sg8m0Au-poOn7{v+s%wDF=RB!K>C2yjC zKyf>th7N~pvFBG*z-8N5v*9kppj8lj#UrLcTDkxf+g{9Av-tnU$bt|HKtYHTZDMk| z*52+NOL;N{lWl~tqRy5`-}2Jaf#qS5<+&?O5Oq%N4~8<)MA;m z{3L_TB3QmHgKa`x0|-w#dU`P;^^Oh$p?-gI$}*z!&xY>AP}miFXerw=^gw`jGs%yM ziw%4{Kq{AJwnavbcYycH)O8{&G5Y(U_#7;c##k3Uqw%v#<5`knd?Sms4UA)R z%T>9~vS1h!yN0VYhTt%38fC3@=T0iS$EW+Nrr-JCQ$d6=$LQ`03q)C%;=ujk2MZokObarfk=FH*j~2b7vov&3XOZ#PwU zo_{nU>m1ar_qK;MuOF#r@HN1|qxgaM6N@An%hJFHwdwP6`wDjTAQat$b%RrL`)Su@ zvVN)*wbxbiu4xfp?MIl3)L$OMv+Eb^9nZU!I+gK5i=!(BAvuo@%3<&VrZjjNEB78*^~*pc~me~!}E&CxON&O&0TQ$QO< z90c0YXZWW3IN2s%GM z2l&29)@A_8OrWc*Olq7o4QZGa;_&OYsd~QlFI^8y+RlQYa!4wQzygbDM(Jk#WzaJfFC=*27*^OQS zAJ*shvRNjgFevTq4wAHx>K2E>b#{uMxQoZlYRty3)g2rrlLg|T_t0q`(IRx2`JVfP zUHH71&(pmDgd7wL)9V+D@3-0S_QI6LP59>eDVa^@!4u^IXqD~Df~J;UIt{S zPV0A-r|N?{e!&GLSzmlE6)N_0*>4Cl5Gm${)A;VG)wO%~Y)#e}bxoK0u^%=q)yjAE zW52mpxKA-V^J|R0{?^J>_bcjOn6_+oc6axf0)xSdjCaH1CN*Nfsx9TfY4+?q^waYb z3OHK2ZB>)wIoC!uK!<-o?-kSOpY(mioWy6d##;CSiGYVS=ZnRTv-j=xVuSFik6b=G zlF}=mm>fg9<^UilMN>fk8(qr>@uDmHc`Ym-O^R(Jb&;l%Vt0A_j`0+nm@IyXUPi4E z{R7>%2mM6^a(5y>eW;*CbiO0lQ_wEd68Rj0)SNWVtgNg{_sS`FNCO}Oy#i?66f&u~ zE&cJX)qUIq2x!2g{#*rcupaI4`x zn^6KJMWTiC!k*C;MiBWPHi2lw4Umcho*<#mXXx^i)CGeT4Y?QSHtt^`_3iZ!lB32p zc+S$FsUhe3;-P8eK6l2q4Uq3oAbN(GGXr3-+NrZCPRvC(?6t0L&=iF9Z(QvGp#!Wp z{20b|^D z`&e%Q^?e}fTOMS@nmrLPuNw!wOrUr#Lx%iPD?jhO^&mTfXq1(em0D$>0n_8-!9)f{ zu=?AW-djAS6rA5OFyRVaAq^Ny8~j2R?i-s~56oRpu5ae!{-~>by1F|iW{xmC@-uGs zJCt9hAc(B3kM^D%COTQ~O)H-Bpeq&q6=^q)gcp-kWC|RafR@N-n#wX0Jl*ex z$2T<8)B<{?4Aqojda(dg{0itN2O0^PyZdbhLeY0pWB=Pr1;-XzX}E1!P)P z#>nl|4D7%WfC4+<_k0ku@(psi6DRaS(}H$6|24Am2v8IK=y*(TOpQ>Hl23uX4)erN zdb_fDoq9i325OfUOeAdYv~u#NA0`_1fZyJUQz!=cpZ_3%X^Ml;-}Mutp*?w>3`noU zry+i`W|>W137b#W3Y-4f*bkO*y1)hy$Q_Rq`@sb~t*yb(dAoy-xE>2*G2aBeo%LLf#~2#mb@5bjfIt#LN5Pe+>D|^NXO_ z`V_rE;6X+nF+Z_aN`@oj(p30fOg_roohI(FO3ufOHsvvRRp0*b5o# z-yRnxB%r3e1q-Qmn*E1oS}XLV0tI>OqpkFZn?%v>9Tvir~+QUfg={AQQj z;`w-O+>m+7_GdO4-&H@VtgP-f>R0Vl3{k6{4|)-cIxcH>i+Ym{1GaPzY$9K3T@#10 zo&ar?t_cJT@xHdBL;Jt8?Ei0Q?C4LtGsS?)KKZj7u~5E z;|{F>+wgAHy~Nb8%gVkdJLRO#pf83=$_~3`aR6g_w$PY}R}8@qfdQF( z0QU;en5h+P$VF;has1jPYM)jbtqO|zzq|tJ`)(pu{E`(G1sP-v{*;LFDbTkuP>JRs zK@MS$4a)yUl;W3LYxWUr5Ug8#P{?haF1rB-tj(1WC^`h(GYG?7a1E2>QY6i&NH zqWYK6nd~s!2KPHlYw!M*r*L!{y9kxCK&_aM0<>^^)&Q5)Fj@`43Lq$o6EUU2^m523 zqyIK27OFQUD`wx7-k>T#&@1B6Vc@xH#d~}Vu3GT2O+i(0e5z$DIia7fDXr5#f-C)Mj}?c?bxWk{l#9GiB6V5<$%r#5EK z)-Hz{<~0mG&m?#Bt2=+MxVF%!e+Q;VxC2pH2%i10K?r_u8qq3vxWy4L`)_3EgHM3= zLZ+`|R0|?BAG0Br5Fp?IL!@eLR@qe5dQC-FiDb_ACvzAUxK1kSd)mS{Nm0Q#qkRc| zVt3T1F6%)+D`dk8zK{+`1Ahox@(`XtIQZ^~&|?baS~PghnY4b;;6zv}0-J*i zSn~yQS9oHv=#j}VLgjHBknnKV&;E?ti#1S?4U33~*eZvwZ*MYRuD9N@bLOiLOfc4hzISvk5)piWw;+a<%04I6wWU<_Uye=sDVGM#^POwu zCY(Cqmw{pWz4~ipxnuH5e?!I(RS~uEytYPl+P*z-KWXGjn2%5d!<*qXO!Ve-K{=i> z?EV8`~xQ_K~iSs`p!>auJEGPhA<~ut; z{ygX)Kp0jqL{yG6yogGctiqlMDGUWclAGIh2WfMP1cw)z8nCFEOiNAef4O87V?st4 zoM*uL63u-MB^4I-d=!d;N*FUY#(3SQjZhp8D6RgB2%rzPc47!dGw3ki5h+g!jp|x)=UOldHPtF2X#DN7L~yZ-UA7j^I*vnDlnY6}>B)sv;T0hUAxVGjx@DE3?Q2UA#N zL!v)G9UzEBNr05i7#s`+L8dp>!Z9!tr4NG*j+pHRp)yjZH`=a|lPp*x+%UR-EH>5- zqQ(oQUfWtC&_UYU7g1@%Z_5P(mkt>bq~2sa3gDSiSUv!LmA73Ae$ZZWQ(fm}lRuqY z19in?)xvA_FK&5~PUC|j$$5-7-K{gEaKX;=-&lQqr*F0sh$p0N$N><& zgORJsa4hz5`PGRDlmh5 zcmq$6UqBjs2{&EvyY983|I{WO+gAm~YZNhS`9dY_z^v{PXvO;>4bf5DhxlGvlKoVl z^9tu-wT%k@@exIL%gq@MAQ%oMK zvV!%UQcHx|2DuiD{$4E+k3jU3|H%N_|QU=KJHCfeA%FH6Ty#M;0ZS`Pq1>3d-4hkyAYuA}PfbNj|C{h@11 z1oXqQ08~S+2_-WD#AT|VOTT}MYY&w;92%{2K(^fvXhs1)v!-kNjba^z&LCJ!-ERZv z;e%WK;Jpn4hTe7MuxKHA(IjyQLt!xJLS#%YAW-OXHM{}yGz%w;iO94@nxWA z&$ybuUy!suaRWS;21zCgA}mWfpeB z5$AdI z3?9NCC&CU6%;aU`1(HIE$aMKrM4@;x-o0%>7I?b9`n03YP}r;t9XZHlQZK80UQd8^ z5uKMMa<-3#Ki7w80_Ta9_-7c}{b^hWUk&)~-XDpVL+*4e*9XY6dLlr)Xbu&IsUgtt zQr9R5BSW8YLrjo<<|DDj@$g4fI|PTCS1XPi z@EaJs)cH*~=}!;NA*d3mga+++?pp_XO+W<_L0xj{OMP=Ex;Pc$#NFEEd%!tQ z*KFG-_8Pd)*67>k_ZnJtHO zmX)6gK_Y^H@;epnxrn0FPu;49M3a{YeuyuA3L+-v9a;#j5~%s=+%&Wxact#g?Vpqi zDcjFssG_2xEf?yW_QA9upE)cvQN3XtH6PRHDa?%pZN1&)>q9A$e?spCAbfi=SkfAukoQ)Ed5#@BPI=mt!BBY1{cmjEJa;`FBS6pU@`|MA(;-$sMH*26Rue)en!t zbpExd7YR&2zyPl7VZjQGL@sP=APXLp?@&Zd4F_LM+0sF(qN|IqEL=kgt6>|M+r?-A zjvmg5Ys`a1)NJRg2hj<7jgmlywqv%duY+q$0U`5Ap(`)X@0-qRO%^gHFWc;PeD&)N0ZEp?o~Y7~cvvtNS0Wb{g~f zk0k$`%f1W9p$#J0|Bt4xV5_oe+oij^yFpUAyE~?eOGT{}Z$5IpK0|nxJm^+Gb%TUY@y&pH$#jW$L##4lb6J^O z0vb_p9*jB|M?c%ol>h?J_ygh8cNfsRno}5>H@J(4TwoO9F+`xu5sR6(M2K*NzJC>y zop4YccZin}DjN^Vz}VR05)m?;937#7YKzb^l?U)BCU=Ii3WNtc%Lf7C4obBJHCIb} zUZ*Kw^;OAxUZR36iN4r~-H?IL^sP=ZIEde9iZ}b4cbuk~;S2C|;pGJ~VgC$?kJ(W( zA~C^O6INIzTn>^Vr(H;e@rmXnq#btE6))o0=TTdYCJo1Zg3MUSt#QNmT#k@S2eGQG zKUa#cdc@Q5Dd8pI4^bC(px{^5lqrq7Yb;do@vG zXYMvMi>i3PfRWF_c~?Jo^4pT$UhG1D@z&M=UO}&sKfIhUp{4*Uzqe-X#~jAzu=Z(# z156p!E0Ke=x>_%kJSP3L+d|d9IsVuE>vRGo|8!3~*0(NC*7|4xnB-1zz4LlT=-lw2 zuGHb~ZX+-b#%l4F=pfgXn}~oA{_QGO`lqs49Y@ZO9BizDgvKzGoJRw6st2SWFrtu< zW2fvBOp;+W^4wz^U;)b?T+s}_w`V%u!LklnYU5Z(&ew~XoK%(CXRYqde2fEpf% z(H0=nh{SSDpArq9z&jIyq!~sD?NcaX2nEMM4h-1%b2P%_IQ@8v$t&HgLsABiWj9p^ zjEE3wxCtZ3t1W86G8A%#+lhxn0Xw{l+Obg)U}52`!R3BG&?V50{P>~`7<9WZ64?43 zET^MHhiABV2VvtmJA?qZGnCM%O>FuhT=u*5 z3!>m}7Q%~+&Ic+gjso^h*Lj_QTsj}XSO{TpvAMK+O6U|KvI-`#m+qn2Y1V~UcfBn( zuYG^RYVmKHU2PreKORW+hM>SBFS-}wLh%|7@V&a4k3uuy74;UdYO3nEKAyO8*70WR zhkd)uL}dyMk>MJskC&FD;Wc zM2Fk$A)(siV@S!mfOnTnt{ldKJT$N>j+gLHv|fSVTn0W@oRNeb`X+kP265jtOs&}8 z41GPhO(#zxPBNkYMnhBunipk;_dNF>%V2+s=tSrRS(+!Ckr_bM^|nTfs%xmS`86-l z>RWIa_mRa5p5h(&ISZxp3jrCjbO4{v=I)Qk#zM!)bc;wDu}XRcJOB1VA*NvpZ52of z=X4-6E6|Zsp9faLmcfbVpE{D*Jm!#riyw4i`?>Eb--HdyVHgbyf7adL2Xp(&Xc%os zUbjt|8v=ryikfSJzdno1u~#lQ2wxLJzN$=ZnnkF0n7iL#qthC^e-KHodGW?zL@$C} zBJkdgGnyDQS$tt{=xJ_h!X0izn1NI_r8u0_##BVb5{bI$(}plY63AAu!v-J-Bput^ z$75SJ<5M+mdpx#NBp2o<7?wc(631%)lxH=w5Aqinbn@--VK1ILH~D77bZvf9`Ie!U zeNeK|J$zxy_Djc?S}Y)2Mcv{@B#QN3u@4eP9Vu^@|11lM$j4fCqWDm3S#KQG9lL^u z8{~gs3)ysi#J|nCv(Op0ni^|2iktJK%lY9a9g(v1eua}}p;mi*RsDgSyxn_0vvU|4 zOJXGA7SS8Sb>K6&uf{v>v1CaeJ=LY1j-#jc?fotTZOCsSmsO!a&9}er+d+G2CbKel z#Qz%ync#Bm7@3l?{>8-SlCtE-T|0m6E-|2B_V4of{lT7eGkfYGLWnwaYF&7tnAdGn zN>1La34+K~n-hK!$PXugGMJAj_*F*t;v>m|C|*U@_6Yr)hUy0xQ+h}=BgS1*G#)uS z?m6k)WEQ7cT(+$_-u&0+UPR_nJc*|i`K22J5%A5IR%=9}h8D<#urw8PtqJoOg==G< zOFLH~l_Ir^?m^8yNaMl9%EC-VE|Hj%4wos|Xv7XsMkqw%RQ>>AP+Kpm%Ahy_Cq38G zJKY!DsUcJ8J^ZI=Ii!Qw50qlqt}pNrOi&nhft3P@ zOfB*ujgrbon0ymDW2&PKRByIpIe%|Q$X zWE)^Mg!_lj8CkSv=o4oe9N5&h|^(%O42J!gfkrmf!lLS z$bz0SdjX~K9Uf~_p{Q^5N5X0hrp)K+)K9;mK;pyk!hhhsyF*>+u3vUJC zIl4kiWRP;w=E<6Y&A&C!J7pvZwANJ@=GaRns=ZwH>6B#?LJ zzianpVhEjI&Y-ZaqSvV?|$tlM=ZNry&V@^+}Hm?o+Q|qEBsjGDdDYyeyE5hCtRb<*~Vwd zc7_(0MrG1z4bR1w!k>(EkN*R%S#VJ_{UbkDJG1jR%zg2&XC99|WY?~9bA@#=DaliF z5&dfb=}HS7KhA+{A=q;jhFrjI2 z4hy+C7JIu0FTKvi!pI;!9dU|ms@8J*q?%S zvZFat%==j#kuj=MEVsc^4wID8z{n`aUxmKJ*JWWG}Nn^H=2kq!vG zdplJKSV_ix;Hi>=iH#h#S(QE+OYeK=)zMSkhe7ZZGnIiQfZr)kJ4XBAYQfaipN^mN zKCB?y+}{DvHGzr@=a+!Je$GO~T?42Kp&0Fu!A)Cn?sp14nnA}Awg^o_cY zA*#cM)f!iODSJI(IzzmV-kgTrCY~%piYqrEUuoKwNs%su2gf<DyYEeI~O?zbUo25xCTc8&D#L^U4 zT2G_678=ntM~6vty6OmGS(X&W*V@Cwz-2mEG^`aQKSgY}9ZLR}&cJZV3h|LQm(LCh z5+(19jEFOJ(mcrtZtLa2Nc81f75+9Y1?gDzyqC&0@@xtyyG+kq+J4Z?zBYM6U!`$2 z;XeIxUbioUn&U^rHe*kUCEPD9

zf%ftv3vIC+Ow&fwcDNS)NtiuP1&4~mf0sQG316PQ zspKd_T+8@S$tx>n+*r@i>I_Md5)%`%hiKh#`vWxRJ=G$a-4DMVT*OFbM`vn1y#bfO zii!##7oiFy#~9<5k8J8&`dIP=b{j#Pi43QPUV~I>rcZ#PzGQn7fHy~z3+{EPp_-D= z@DCI+FeoGl>`hNG@lFV@&~V*^S2-(JEIo%dis2cuz97!CFF6QPx-^6jm}7GUL%a7q zZiKX_lG5-F5syH9c}N@4N$*9d88Q8kj!=x+`NZjwrKyFV{FWCk11U<&Hg5sC>O{OX z8m4lre7XnQln}Xk?mhX3M!ZS5(b$V?7|DQ68+UiqE!VfUuL;-MYAT`JOjD6kL)N#O z&FZ2E&7gp@WgspV9zOr~H(kw8W_&)YGK&l>bTl zic9xynyTD2zqw#lvBlM_)hs0Ad85XFeTFXKR(XDgnArUzkB$_YTLiE{Q=A%t16yToK%sR_K8%nm}JY#>Q zauSl>fRJRJ2yVgk_=_TXM7;EWsbSG?Hv)E*Qv`LBM35jUh=l328^&+0Mt>}R3o8E5 zJNg2VCGHvqf4Qd;|NX_O63-NyrIBq^NZJ9JFNNJ9J-Uk^(*8jIrtDWy1&5Fn?bRI* z6~SIxi{-N1A-h6f6fyCrbB#THM#ij$xBsf1^r<8s^}&|lAfq9y^+_;2DdAu9M5%$;A4u=A$ zO22M@37nqUuP&~3)}j7fTgkgSv5!nN!|O`RgHn##ZA`cO{n)q;LYJU^IzC2s$r1kZ z%{_#(Xi+O0Ke4uuqY+Q`C9wbz)G`jABGG`j6cdnAxq`UwFkJf{_5n$)`C*;w-NPg@ zl^;!1P+^?UV;XK9G(vJV$ot?mxU{sALk63$;asa4RR6zT2F%NYMMYjc>oE$d(rfEtG4H^JFJx1}Xjf^Zcmx4~z|UWgB7Os?krIArZJyX$UehDWz>5K) zWNJxs>4`10XcuQ@@*ivgD7`05~R;f#B2`N(A=_R>!WQOX)*p7#~ty=3>161 z7`pyB^RuuIw8-GX1VA`b0TYpyrwGG-ABfSox#hux;zo`lu_I+A z>Kv3uwqjX2->muA-;AapkX!sA$_wTd3Ke?$D|7l6@u;w^Dm7C!`dQ76e9rkQH5@|O z`nmj+f~xL{{X;k8rb#oqfW(27Dr`SFg>hQw`izc^cQP(jJLrWSX5I815?PpAlG@5J zu=3}6M%Dc3-6WQ1@VC{Py5aer417Y|_8i5F%w57#G zr0Rqgn~Q2+FlCs6wHxTX%1W&FndQlp6WA+sJfV2_s)Oz&ISDEwfu>&Qk`7lDvA(M)+c&-{eCC6?VaoUN&5jdRk6L05JnjKt(}x`O|`^S?jW#NV)LFv>me z1BWGqBB_Tjy!o!#d<$}bvC3_w&1w|O$7xKC1D;yDdo5|xGN&ZI%aWPCAfVr-BqtZ; z)#;!#-D8OWN~o!vRFn0N$0rY5L^8hruo6}Unn5-xk@a_I5f7z9#PY1e{c_(6Kg=3Z zML`texpH&U4)9D{N$^`EKldHicVlUcG5&iwN4=?Po|4R7-?yK72C`*P z$gEhX0p#DG^LNAA!~I-raK6Lb6csR#v_hXB4h=n5XsX*EVc2~JQJG_oBGU-1tLaFq ziGXoTI3A!R!U4xEo|{J7=VupheA_Zm&(+4MdBo7p{(P_*-G|?BUFx>l`DQ?u}c4I~vs=Xo$jGL@}vA2-LJGPLO7Dtz2v=8y);L!5xQf(O#UhJK-uA%AMPaD)Np(Cw;jF?Zjvp0cs#VgXyPWK(&TYl<6-4HVAVzUDz4k_Uy{JBSd?Z20Z+sm2UqB=2t z5iY6`QRI?O#KL1q+`z2V7!LM)Vk+Wo9@lN(6A%@x@QvrCkpWXm;giP*IvTqV|07#_ zx`3cy%|}8bq?Pc^`jnrV1wuSgB;#>+H8}tfbqA$bZYmh#rz;(vYlG;48eigokb;V{ zO9fmv3NunVIAD09?rpVQ=@K6r!Oro#{J?4@*Y{`s$4T@SQX8MpviB^W--wZDjC|{--Si8`dFCA78{@MA4pF!dpS_>5- z$ffCAJCl-d1~S8VVlIQjK6-owX%QSa(l9B{?$Q!yhR>vJWO>`&8jmbD9shqg6tE^f zRvgfd5NC0tYcs!@`7h8Q~5-HE`YDLwB(JLb_Pl9 zvD}YCJIUX#TJwr~!tmmk-Rbhkgxrd&V0=qhY>_evXLN{a(-A0{Yyj%?j7iDSDxcod zUhJN)oA-K=HyZ@C-VD8K$n_aK(B;fGHm2WlYlJtE;OZDrfaZ4OqJ%p%%n2D#M1!h44XCp4+hT zA0ZzI{~#$#oK+)ln;HYVlr_mJ5|hQ#Hw4-g4}>zVcnQhC4*jRK1%M0 z)&6o(K4i!%prU3;M5G;kL1sI+KplJ^`cd1^FdOx;%m`WS$S+wg)}4h{+VALNCBdyF zkoK*DEDq8k&S@wnv$~T)EICYD1}B2)+4`Rsx4mC(#lN(h{jNH$&d*%B)|`?t`KdoMV^8+E-R13Alvxxj3^TU_EvCgJoOtSG`-5gnA?+ z{Jib%wNWBA#ex3!tZx`>H56LL25*pLqbPJ!VUyN=6_@Vrd5^EkwF|-OMmEY?l)3qI z`>$!lW_xr81Xw3cSOOSH|waKU5XeGZc)RyJo&lfv`3Ur#<8*EZtK44y?wR*&) z&_?8~?G(HAJY zLWZw~I|*pRN?la*2^&{Z*(Lmc*>k3+_#pKCJ`>fB23vVWJ~sXW?W=SYqtml?4a0!! zmO6C1hS{%M&c|Lp#%5*)9Z;Fj(m`aV>p`4e)z~XZ=fN3|CC%77j`UY*3N|lcme=Ov z`|^HJ+@qWhGa6(Q>t*E?J8CwRAs(kXBvGKGoh&R(cC>jb$4fZ1w+=73)3LGl9IyoI z;LpLgNk5Z~Ftj)!F#q&XI_d0w{jo*(oL6fai+Aj_GT&CIIkou?bCAj@n?IaTzdY}N zhbm%XER|l+Wp&Ic%;2FnkYy@a3#NNMDJ8k4z6&jY9sKyK`ZWfZaX@?UdMiO2pBz)3 zmkWuV2LN7;juZ%)a7L{y(;})bhv4!_@_#C);^Et5=EV#HWtKRPu)|jd9#RDZi~H=) zPl(tHz#vFjp#oI}Ru)vq!UvKfSvk{iGb<>YUI@-C+VeTs({NCp=@kt-pN4U2I~EPh zYkf)L-9=YKRBKu7r0NuHh(%$J$W-g%r|(R}eI!z*6A?0k)4yFIWA%AhW4NtR8B~y2 zFIDII;db{g!7;8M!ZVBIR=JmWZ+l8QSC9)h8j$(bguaLFw>q-%-`?ZUdy+z-3*Z#)oO1evu^Aq3;n1MO^a4c zOB#i#!MYa1QNLE7)-3N*r~gAu%Wy&)CEq#t|C`Ii*hcXa@pTurLM*gk%=)=V!B`Q9 z#0jdLG06o&Twz=<`{A*t@&z^J{(>;5&tSHJ78H8`Ul0iaj`efuA0iIv@w0UVxcb7f zW~$V3y4`~yG$m4)M1+LyGBtHCx)K%5%*-kaeE>3Z0mavR8s-Wf(2rBWap2ZYs>XfR z3~=Qzo1>f9Vhiu$6k%|wbtI z3=hshj%GHC-8MS<;qNqA+Zny+XfG38-pk|&F~5sVzkO_nz@C;iCucSw8U|P-YWnHJ z^-rtm+&cPlclk(|9;|w!jaCoYYeRCAb^$qJdBQE7$+*O;Q9WCp48nXVt;}pGfh?nh zESXNskl37GDojm!S3gqabjJ}ge^HsA-?HkibiF8Fn zQ-9;fSMTPOalg&0bmA`f#-iapf5R!MC`yvAa(xMY%Mdw);Z5@0ugiPhls=m?NGjywTw{1JZj1!k##uSgT7hxb!j)L&$u{%ms~n*ZdjT9ZuOuF`n9% zX{ezWU|J)hqV6I?hf@zIxo3?l54Z4EVT`jP`;jE&RPWm}PRYD~)f42}avFoWkUpvx5;6`)VtNdQLz4fV=1+nMZ3+UXT z+Zj3An9OSQ-2b@(EaZkKLs&qXe+NMk$%8(Bm{NFbb6!^u#`aL?B*3LAE)vJnaS@l& z*MfhaZY83Fc#DCYZHu~v#l<8ten*hFL_?e!-doKrC>O|oxp)ygP~x78AVY)xOq8Iz zKt?b>cz@o=vP{u*E_HE^3tJ51$$~ob1glCA4=L63RMmbpHF)#!;58uOB6Dfp6Gv7AW-OD)%6S*?O#XUh{A>(}Z06v19v1G4XBXnhn0Y1$Lk$LJ{qnyc^2 z$+$E91O0AC^_Aaco0wm(MDZoOKRV`UTaYg&q7VEvpfFK96CKh*rLEU=ici~M{kb_V z^s=q3_Q%4wIdJ3f3D+~RtsvmpfyQ^Zt`Vz$)!O%Y*cYX!+=A9xD zw0cgJE$*M+n8;?&pLS#k`q+=B;yYDPn~L8QPn;D0=`q^vm$YWgf)~tx(o~QXb=eVA8CK{HGp0cxV+6dYY1#- zioUS&=t;NaYR1OSeRgzo)JxLiU{aVlIy}VXLd?9pdg}Q62NR*}pk)ry)GsOagoadC z!mAtjg4iZ=LAw@^;+9*TAE`Y!yADe1>EAr}xq&hJ-yYXH)FV~(??Y5ZaR=;D> zC*8ilIwfFpwW!`_VjPLa#(BIuZ^-Oc@W%tJ8i}#fM>anG4$)Vkw=UlWH`=!Ft9zoZ zq{G$4tB%HE7c2&2kmhF-b*rkEWYv@K3GcPiz#fSbT1HbGMy9Ot*^->F4tnLRPL-{1 z_cFRJ^(-EIBOSm$dW4|JI>;BI^mV1fHJX-q%Kh)-_s?-tI5ZLfN7?+&XRsu_J=M)iX6I+peBbI;chQaS0Xs_;bM+J z8*;hx@ek1x%DKf*tPzb-Il(@y#llskrcqxz>OQ19-}$%ki5nk^3426t*ejz@)D?Iy zf0DQXIkjfobTufHmS>0C1!14CSh77|#j^E+3;#EQi~7E#!XnGY+s*Hauay^tbfz*k zLU5{)j2e{{oM-W;u`QRQa7^Ky;zlrDh+FF+!iC)Em%jrV-p&_fLnwr@GDGwX3;)^e z#-tF$woVP9zM~DZISQr!6F%q3?6UdRNm5oAqLwRNL{(#ies1`YS2H}iAurF;c za5u)~QE+gG0m#@McA6G2+YwrbLbHfs3f12eeG%Sgfk*|{`p(yP!n;WR6CRBe^W0|sw-K)r40%`E~ zW)@UaZ_^@7Dhm|)9q@*xxlFKpU7_;zw3z42F1_wnN8IGpb zLvTABY-Jc3TA4@bLP~H=MvP)Ze}uZvxI9?EX-fDx-tm<7TH2VHeEd1-9#D^n29ZQYodzrK!c?a+rI`T}%(yg89;93A8M2%eZJbFrl!XDa{)9 zboon{NLZ@A zol3$*-9sl6+57MBZ@|F50@Qh+H(fij1?~UO0vP9FMR3j~6ZT*Tbfr^R1CWeHLp)j_ zOD-jNp|dFOcv=*;ygKD0C#rc@9?idHS_8~e3F}#(5B`9fm&1nDReStiJ)GAe{hu5F z0~GLd#(pbs6$nJn)Nsas`+h4(3dcIf-L9jeIRd>1CvMmfD<%O9uuo(30@C5TUBEq=EZt zTUrYDRc_g`ukr2lS@eyK$-0~sOmSsZzJLEdT9Mw#TTHXCnSfwx3Az|tJ4s`1;J)HU zy|VC!9KW=G!GlENJf|V?U`+tug1C4(D~l~}FKFa6poCsw>=!YJKpwuf0#=)FdpqfX zSU!AFEv^*oMXZ$2FLYG>0(EEWNj=dv6w1jMt`^EU5H< z7Jv{q*vkf&SFdun+5SJepB5&yuLFU9@Dnf0)reKDrYp!%i{1MqE24q00h3Mx{Wv)H z?HhF3O}**ezu;LzZgRK)1UUE>ZZ{aASvIvmH|~-!o9zUOi~(3ts?K|KSt~aTLO5TY z#6bRZgB%|KNVvx-=rQ5us&NPdO&(8fD6bJ+z5Y}^y8MceElKoBtJmRIP)dwJh3kIq zN316GHsa(F?EWck6SKD0h#mNcO|SnP8KO}RG5`y8pT$5J$f%2AP48FD38LnpMs-fl zqeFNZ0nkvgu2*^53obVbnRaB^8N?0>-a5}rVOn^|AO|>4^_mVpwndj-j$|)pKzo@W zHNk@$ll-9(olaZ{|9sUGA~P7C;S8D~+O)rHVk7ymaEt>aoE;rq96D~=fBxxM=^-kJrW!Ez7J2FqO_x&6 zfJJ8Vz*COk(wV2jWcq4#k;r2`hC{O5Z%HGgd}#{|Xhbb57=A}Pr&2jW0Fa-OB4yGw zWzS)B7cQAyShxYu~pyT9q0O~VxzDFvR>!T|KV%i*ztKFN&( z%hC@4b*6a`Hv(IK2HZx8?VOp+;C9Nv1w)tZK@~&^;RKDn39SSw1Cb|238j#hIzMNV zNlidQU_{=ZNs)g(KG%0Qt1ofk|3YG{)R4XgD=LM0(HHNXdv-OI{zVOqL9s~h?o?62 zrJ$!%K>VNF3d=-gq`fs9gk zsySQ17=RZSwILoxC-)!z=fDS#`ilru{7wqeo2dV1#Z(49Dj-NSt3-6R? zw)`*PUogU}`fFk*V6}{{h^gGUjO)-Bo0+*&&cq)G;pVg9c%s0z zf*u6-sD$@~+(u)g2$)cKto<>p5fe9!m>QOF9Mf$op>;DN6x)_hi~poj*sL4*l(2r5 zd@9;cbS|^ehldL{e6!pv58VRBDxCDAJz#K&Gcli*`0ae-J+Ff|b?~DtNc!aJ%7Us= z2Q$T7jNtA+9a!5Y$pujH`~wbLv)8Yw`>dY~2@N3k3JCr`py9BS?aEg?KvV!qm)Q&i zwhhCLpVd1z&x9KlkVzB4W)Iz|*s@{wF>W0B*Mt!tpAF+5+uITx;#NjK6~@ zb5j{(%P{S9j0y&j!*_J^4bsqaPbl0WHM|2bVR672!a8$Z4|5v=bucjZ86$$bAl8N&TF>;YHC zjfV__z;Ki89WTGS^@@e!$XttTv5#!`C6bZ|w3DgbRrtW4UEOS+Wz=N&~hFX#9aW{|)VzRN1a-78Ja z#}X&Wn`b^Z6u>t`E6B<-Cx;;fR{ZO1x&XFE{Pls6y}KmbTA00OB@{63EmOzaJdtHN zcdGs0vnQp4J9{|fLU7hJIx8xWH4u!RWg_Gk!nqV|c{c=lf%+q8!wfOLR5YWZd`L^f z(<089ZGx{y*>c5cCF1BJX+hM8PdCAd`@WifH)N8QCcl749Gs%^ru1yGi%Zij_9HtL z&Qe%dw?8m|CyC!K^+P^*)EXRb5653JeEa^rbP9kK6&i(TVgo@Vwr)h#rOpcVrhJ=WQ*NNlv%MlkK~Rjd*B<-AEr}0vXEq9V5VBNGAklj*t~b_-9xD z58veOY|IrSsTrebahR7DGBh}_fR?owgPW|GnR}SOIAX8pWw7O1y@m(rE|hYy<$rR& zg}|i>^I>9y=`kRD4TJeNY}pG`0a@Krg#ho7N}?;qCe|3-G0=fr>?4PNXm1w~S{#BM zK|dkxpe7muC6W)?&9%&(Zux&c)CCq zXq+l(T0|^Kat|VQ7IUFjn*Z>HX)lNwkU9kEb+T(;@&)5xBXo}HZ4dy7IC!@dLk{97 z-od2t2Bv~EdtJx6f{aV8(&y`35bo>#=fJ|snI<-!%a^PIE;0bLmb+eVN|q&bpDPz5U6N1 zpL-L)>kF6#zB1RLT{f~ZZyfB+CY%e@09GlNOFo2I<4so!>TpLf7GfoIJy_v^tMFD5 z#jI)j+eM#OJN8V3`r>AZ5W%iAX-L|5#e?!lPZ zlm_Ubt<_JSz~p=ZxjraOX4*;BEyc^E1((DNI;o5tqI2VlW9OHLg+8tkOM&9rklf(U zN|G`({3szbzQX=SuidYVj0Ap4qwBgdEUp|ccU8<;dL|d~HWrVO@cFx)^dDo95m+Zd z8*FQ4=jLd!FkxY!4CBJFQgY2=kkEpNL?m?-IT@H5t2pXHKcW`88-?%xErFmv<)5GD z?{F>`pDur{0={31s-sreuQii@E(^8?HSbIPfthTWre15HlXk6)ax;LubrD@1h!vCO z-Go<8N%-R{8w9Tbk?3jM$&beQIyP5*?mtc!Y3@f*LpuLteeOa&>sS z5HYF_Sz@XsBM~JdO3m*spWDM;#eV32&cXv{DL*?9B!hs}J{p@kc-4LMIW{oMd?*St zyqD4?bj=0%4nAEvqBQul?K>zH_ykAUtGF zQB|)-tY31mjJOVtc{sCpa2JJRtUU5!jrP&BGZT+WP2Z+x`|l(J*N!*pS5XTmoj5wg z0)oHvH{0LX?O8I8Ae=O)1@-@2^3rgAF?HY<-dP#L*q_b-ES9N6raHfaW)`}ocBW+z zHto^TjRGwk+uvUg{+}o`6NSU1_urjny_IZ$+axgIZVH+{wQ6e}Cym z3G*P>p;PYjk!^S@&E5f!2ksuda9vB}ZB^-h(svJ*%0v3wGOkwTH9Nvt-w1tk6_R$d zd9^nUAX?LJzD!!H)CM%56xVlZsCkeoXk1XBFeUtyf;o)b0guF1ZVo#l8CF=&E@Bwk zW}HQMCQH5jLbX1qo$+Glq3$L+S5FGF75-+_bpqdX zOdThH0|7Lm0NjFyXI8N-rNhShCUjga`&ZW~IZfp1eLv%Bp?Kk}Z89kK)Udtl9ZPkB zBm5l%{|rXQ>*eE*EA+bsg7_<6I|p4@WpA?lA>QZU8JtlpxGJ%Tx& zuJ2_#*f%}UL&p-b&u5feXk|+o5w>M5KrBEH>{2wNBMA9d{@*iWEM43?xv+ZH_+#x~ z;LiY%_F{P-BfN2bX8!5JL(cdg=oHCbW5!ZZ@9&Z~M2nKeotyrJulzycNDM4d1-g#~ zH(OkZbZGUZ*LiFSL?rGg&;U{l&EQ%3`aye4Lfi~42XRkCRw;hySp|BAKM)$}ta=++ z)#*PgjSPyk<8x!E+d=RgPdib4Fi=<66?zl3Tf{M1rDt=RO|1PbjRamSIr-So{%2X^ z=6UK}FnEFic7Mt6zwxUK50=_Hb;6vly20k3+1>VQNhJ0~SGVPbyFvkLHM(^_UdISl z!x0+ivI%0M0o{5OZzYsn5jf7u?v{lpO~sbBx0;IcMM>>{%#?0B0~p_ti1!vr=(6{$ zb(!^w*HdM;jPALKQo00m;3Fa>))u)hM(j)%+Q%eA2MafYq?7n2iaX^wHK-HjBC{E~DPgFlU2B9Zj6K}P15HY6oH6-hqBh#}%Yq>*CQy3E zUcIYn`E_@5d~_@H!y9pq+p%wgH5GxKCwV1n?mW_fdj1gE14bj}4E1%GoBTZ(iI7b( zibCrmXu6MJbFUniHv9EK9fSj% z*EIB8U5}8E7ndE|O#YagSdnbhpXZtP{M)J9IO#iD*R`tRG=Tjwk{(Hf53abtota71 zJ?h*fgX69}$rv5!99|4y&3i9Tbj(`Nx-2x>IS157$H! zVo$eyz7IUARt}Lz|09i&;e6~gvlrHEJbhPI3k`^^wR8odR~*mXy8?KY2X+;T&Xm@- zXm;L3oXbZypZp<@>VV;f9UC3pKah5!T;ntf+Jc8wBbn~)b+4;AkB|Ox@`KclOE3c~v=yk}(=%cW6&9KGR!}Xf$!|Ms;uPnZCRHgUkK{>9Vw(8(^mQMMSL0{U*BVUKICrh>N#@|$&%FRqb^k+Xe!JbL$>-pU59PW~n zhd$l)tdEE=Lm#1=0e8%M&IC^-j;J6Ui39tlKT{ezj z(>AqU4Q-b6#{r(Ms=PeXH*l2oKx;BGj&M#=KQ(U5v`%R)a)WKr;+u_Ihv_2<<+?#VKSYL-+VYs+(-G zpAAJoR#4@(^$_mqyRo?2Y5ml{C$!r#50sSIyKiSWg*Vdcd0%nvG>TCAWP@`0NKMI9 z`thf&pPf;Y=4Qm$j1`TB?3~H*ctc5i4*F6OJ)UwS-IlevmFh$K{yiT2-*c>a7NH&g>ILu!Wg$N(#ZWpH&3T0w#)z$m|6z1`xT}kAcP>AC2Tj*dd{&GVvoS&+~l%SEJjA z>ef%&`-`preW5HkA)1oVVmKSbe*yO)ZE&#*aaDShC~Azj#%^DLg{p9kbG&sjQwTc< zO`Ii{1_8t0tZ7-x)S5+rTy-i6ucfI6YNQQedwE!wM726P(< z(pNO3seBnyiyPq=yLn~CIN{NeI=l-akq4S?1u;etS~MFeAH&irIl0kT$kqj~?FEQY z!kbK>5Z2lHierfT5xsWlYq{#MMG5zjOc_rjgzg=a0HJmt$c5iJ+#P3rA3=tTj{L%H zn9%T9bFRg8pg-|HFxUo6IE+ZeTzw8ii(!^9v|)e${;LxpB$@8pXW>b=&O`}u+G13f zR{%OJ9E6LjxdmHAwbE%KcGHW2l}cx?y)Z(oPEO=oavzW-+r45^d#Y|=s;*S|O^FRR zq+8ol8MfpNAra{{W*W8fFRanIWeKt=oYd8>+lCr*lf`~lXqomNZq3Eu92&|p;n8JU z!AbeeY_3YD3sto5yty$y+S(_;I%a+X3dQ+5Q%mlyw1`g}QJTZ;0`EOl11SMiLq@-5OP0}*oT`TZ!^bJ%a2FMHE0v4`x(+%<2XGhn^@AmiT_swYJ9`eG@nhXe z-|monlzOnTZa%4nsUTQr&U5Dayc%#G7(queKUH6QqrRqNn{Iv1$T?c$%$GRKtj|Ti*5%qn;qQLWZ7%OuRxmP$xS%W}>;-d3`5T^$})`@Kq3F?_Lid%lL2c zdL`CF>R0`8xcF?j`j7{_w2Nw>T#Ei>p7~X1H?8XDO*_}#SlwnseW0?d%$Z!4yLK0c z`jIu&WQ~z|(Lfn8iaZg%5xb{*=%-egpMwy5k2ns*#tk+ZTV>dZ3$~BMILg{+6-GMT z{&82sy*93PQyDpR^T~xTKE^n`CMlvgi^awLp%bg4|K@PZbEMYK4*#40V;f)abFZ)B zG3j-Qkt0E`k=tl&j<&@HMF}|{8$gb)Dh*HsPBwdoD`z!v~u=bj3&M`;0+Aq4XyK<&46QCL_%z=(7k_>sNR z&Mh4&e%^tWjM;YaZ@BYFH%x|-O}SB#IhpBcTIlAC{T*DDKlXfhRFQj1FJ4{ zk^{dh!bzUSf(JgJ%)E(@LdlCHixtp-lldwbwbi>F3Q0EV^S33ISKH7L>w$j4evvJ7 z%<=OtMWX3v$*d1spafHN=@`lZP|}|h)}P3|$#9v9(0-%Ct)i!J;(LLSN`_zAIR`+*#* z!cHaYoge|31OWPLy^bZB6aI$5hW-3ntr@Pt zUj%P(L(r(Rc5*we1~f=Go?l~-aCazw=%K?v*Y(#M1RNwos(m#OMfBjqh>C|8mimE$ zFBLvR8xPB{YBZ^P-cN-<(wgse+pP-wQJ#^(mGxDw+sD88(B@{0O$)^diAWbid&KRy zKce5X$3(m>M~<-z2t2gtu8vYsr!g!r5NtDB`ZE5f#s!=2mFvsjEa!htNo&U&o!QBK z9bBK@ldHml5OIIMjSIXz17j}WFBgbC!vCwKB^8C%tmw843cVH*vOgx&k8~=E8v=cp z1ROv*nD&{(1iGjx1DcC4Rhlc?Q7+ zo&}8h#l{!!Huq~l-?rp&B>fP5%;-_IxWdT4Q?cVpJ5Q8Ve5qq>w<=^*1LS&)UP#)q z!d$;A)toAWb_!n#&qAd-v<$3D76ginZZrQK$RwzF7z#B+zQS^N9}b~LT$aQ*DO^NS z9uVg?yO>g2B7`QJy%O7ABQ1+k=0_T4b8(={1X1pOANF#vW8lw))>< zQyf?;Uj@WMz32;g&F^q@Hkd8B_y|k*YDI) zcX6!@-+eh-SqixfGw$PQM8p zv@CYk5gsU$XJXX>0ab*PC^7yYHh^L}KKo_`4L|1g6|F%?$tw&OdX|E1sG)|<2XAeK-8`f#g@4N-CO z6(EvyTn^I#p?Ut~ZZch>sIwz$YikzK$$M=i6Qrb6Xy@9g@F9YIpl(`4BGNcxSObB3 zAftl>+2is0K;s$x-L*AWxXa45iM;J6feAu)J;hNOKR!K0w{(Lm*S}3|I|UtNb$KI( znp`Dz3&RvT)t_nSCA3WY`ihI4rPYUZzJD2LrjdS;W6{QT3fv}$pAS4cRSLd1bi++!q%vM*nKIOae4%WY10s!4M7@$QQ z#$Jj99)34IyeD*e$NzuP6k@ahS zd^^^K@lxr(l{;&v%14!=2EsxEK0@V}QL7!d3uI#=xMWYPXX)DH_>PEpJAuJs9trCr zpnUXc&nI8QgcfuA#?=#7*NJ$2PS(58)YLOOm$Olhy^OlQY6=!63OFocV$h_QdV)E` zyk=Uy+C={!(?eUAFr&(({sveV2&c=xBr{*3UD)W?%lD(^oADhhY8U16dRd8>4dNWG zwpn6nJqZRA0lR~#f)VE^L41$~24+SHpV+kZKg@-m8~C>5U5?eZSvWNfhq5;{H%YoR zOpH^M0lH7CC?C~Di|s|j^hK$CyvRjfP_q>>clH#yupm=iTcb$pE*Fcbeva1nw)Z_# zNR5iD0nJphec6oa$kOo*ZDAj8DW%jX>(D4CU2PK_@+Z5E4qY{x2+1R;h@(}<2~2jC zE)UzwzkfJ=!$ZNcd@%x*8Z}0{qp2D}O0qw3A;taB95BEs=rgTTo4TiN?zIvl@fBr2 zu@pL4Z#_$<>S!jTW)qZ7M<7Inn5+LgQUUDIHzL4tx_AqWWA-WlE996> zt`VPA+r<`a#2q{XrzOmH!qoo6+Z$<>u{%>A;HpAL>U$e3(+?;a2pS5%x}pgOF(zK^yg36V)07a{D-Ieq={E2_oZA#u&L`?throu05H}^t`?IfM zK(=-7_t`$Vun2~8txAu|edkhb+q^zD;HjH-c;l0=g- zwsER|Hz6=V#*mgy754H1Op$lKSwNeUuq6+Vj4V`W52C=azvc|t&4IhXMfQ*~!}F2KW2OW)LoVk{*> zYuKz=lXA+8zC<1`D=7KZa_y8vAHRsO;7uh08zVdSPpO)IN!44-Y4Y&$-&DT5Q09$B z`vc6qh44pVSXjH8ec{A$HHpfhuKBnS#d|^mqM2d0?xT@L`K`mgFo^;qaGcDKn95p} zh25n*;33HesNtiEBILk3oZHM_)FJ&>ejSE5G&! zRq(Ys5C$beXh+#&yDvPfk(|+f{M!A#3T$43+Mm8s^9X^vQAGI3Ok-+-%i$27#PVt z7FX_Go@4JAoehDT3tNZsk!bnb;dzYm;O*ZPi@YU7ewkG$Pk1+8=%hKk=+Bdb0+UQ6 zi`b;_7b^loC})u8+V>~ei^KL0Fpq+q+U~b^nh!Rz))SqR; zR-=vjV*B+5ku)_!ZZyqM8c3}= zXcLbm8nYCpCaI+0_`**93+VT@r(1KUTYKV{dsrJ_eNyyw5I!Mx9^uPgJ;K9Xf0c)q zlZBOwM(H_AyeFYpjo_0GIk@6-pyYLDJPr4Y8cyPh*2Km5kci`9Reb3{K)HLsq-ez8 z9HXO6)3f?J(@=?(a{e@Yj+@+?0zJVL?L#a(u!#U1iWoF&gDOk8&F~V0JjS{9{{H>@ z@#DuZ56*~!{CqI9l!RPA<^LUzA=s@`?{2K0anIXc4hVtJN4DW2Wka?TxH%2%eBH^E z?n(@k!baT$H(Kk?XCV#V+47TKU3{-xf(r4gy+nY&uzw;XOZYZNjN7QC+n}Y%IH~T# z@3ZcPJRt4ZEPjPA#)%Ms>s)zoWq}J>Mh@gpRm2#y)sA{G)kG+T%jFrOjN!BXJCx%| zMDM-7(1Z-FCf;~8erP*!;+AB+9j*}IeO`` z{AmsY#NAcr@bK^fQOUkf2p1dP-rnq;q!xPo=KAL-IZU%#S4cD%+5$JrP#+ETZ-pJ) z+fc3buB&+=Bu9X_xI-&Y}W?*iXR+3!!8+V-_$Cw%L+X+5A(q_Z-%L*fh2{;1@QgkO@L_ARr zzhiU7WHWd%9P$Tr<;pEOT*m&d$FA_K4u4xkD7-QKjAbl&jXSd6U&nTRb*u-%lkl7& zB`7o6&w0qmKxoG_lp#>Lh2b3=8Xo}W3f3M|&HT*1fp=(K$_E(a*@d8^|Gl1H!8#Gk zHK&A^2{rN)os34;cvXPur`|3;&fELr2Px}2zPec-V~m`zdQ;-8|CAv za3qyoJdb3LZP`t+OqZeVAI{a%h9_1gHU^oxu;Ih_a0qsZKVtbIYF7vs7c7O(egMS= zp(((D6yf4ou|iC~GBQgQ1&ibApwgyzIpy}v`On%HTRRsNle|2;k$dStysLO2? zj*w7MQg~P<6ySUOGnztS*_HMHCl%!pK2<_q38hy*&~H+MI5Ubcn;9t^SJeC8Ijx~` zx?fV%22R#(Sz1~Gx`n0{h-Pw1ST^cnOeT#TGm5^EMvWsu(}gN$1JsSFa7-1WJIW%<0( zUinIsqV+f?=Twm`1KecP_^2Vg9>u?i{zRO%E+EUKPX|?(oS9isx$lRBB8re&esWOM zPy{d#{IdJEw6r7>4(Fv|0LFpj5E49^nUUQs_ewM9@AC2HH-9Mn2O~zusp5UH8lkP9 zLT!~HN6l2CcmAsH%di^iWe@^`l10-XL9as~3>-JyBn({Cmg>K?L%qpErODOl*;z#L zA+nH-Gy-F!8`-eRkPMO6?v5;?tVyAcnt_nQwBgp;ZL7ajtgGZ$LCNdvZ4>9?A#?Y% zz*l_{67qheCr_HwO>_{`PHT)z=y|>s@6S#d4UtR~3*GxWAL5BvYnTD&3`2&BMM%NVXjOJJM)cLTA<+4f75Mo4*x~G@Q$m>areBwT2k6L&AFb*Dz2N3j}=lN_Y>0*;{E{p+nTC=hsKQqMBO8N9ZC0&vv zu5@@vwz6`MGhAv{(j2 zmQ?oM`;b83A+DJ4xJZs*=!k0lIG8CS-=I)5nF50^Ff=iB){yi^2SROB^GOE9s60gEXk3-BvMqsF<1 zlde@pa|dY3>x=v*U_eT0JX$U`mCuGi0Y6&X@zg9Rsqf+v*w-iZe$4L*SE{uNMH1H^ zl>JLzlKhZ;2;0~RwByTPfzT04WV2N5lyXUYCEQS!AGRt9*@)7gW9ntP4O7t!z^h=$ zD}l5%FbVURH4*NI9%SgF%pFr%ynE4j?}oqc5mZ575&s2?s;_Nw)M z5E0+_R~Ho*HUqagkvygjW1MH+ZDn#1@|E_@13}IIZU(8K0B&3R7>aFC!<23GoSD`H zr%<@*37rEfZ|m=1&x;qJC%NkeT1M&`BW-meaX$&!dr_(ImI}a>5yDtX<}N+l`oA}A zG8m$V8emkhP*H{IMa9HqeX-RtAQ6yOR=FNFA3lu9Djgl3%fBh*{;BPLZDJ~`o3IYO zs}~l1E-wo!C2cdd6TERyAuMT<;`Db&r*}05__gW91PA<=zC<+{GSzrUC>d37_9&J& zHX}_wewY5yVCjj*sW_%*bR9CBaV`UCzBit!!pFwuG?^n*AHrBtEaU7n{2sZoP^mjI zGNP=c!EJa zG{V*jXWt} z5a|kSkhB(@=(4!l6v=-nFQ;F|I@N&=AV?Dp@3sNdH|*p8Yt`(6ftj&z?Nl>1nt`VH z{%NAIs-OqMG1*p4P+P4Lz3t z_|ZSTD_iH=WYd9}E#{vZp|vxpjMt^~&_IsMWQX|kawhoRlS&lIZ#x3^h9|va1n|oW zOtu$I(KiVr_7MrGQ`d;AqQ6aR#AO5q5I+yJI7Oqz7j3o9lI{#$P@pp0QQ`vN~i8Iltt8$E`HAW3D$BZU}4Qy`{VAeN;1uYqVW?(W*6 z*qW9{S2Y6#R8DY{R@N{lKAzrdtIoRI*49XGq0!WAyD7Sq7TxYU`l{_v6;fzt`5T*? zR~uUbB0GUFA=How(R|>CW?w&*y@Q7{l5D6W?JY6WhGYHQhvTk`%V{a{jUg7#Ma3X} z^`=C?WmMt$beaY%guIi-NtupF1(eXr5WlA6`swb~{eb>QWpsdop?dBZ_nhbg3iab;AYQlnPE%X$GSQCRi&a?_-2Uu#s~)=bxkmlzd1yFpe3r z4*P5JFgTGxQ_MNyteW|!%EBfNdH+uuH4`+r(VqtB-$MVSkp7#`&{ZDrzxY1BWM7;# zz~o|FZW2588B`en5g%HiQS&a$cM^t#gan2vc{#blBu0{CmDz0S;!1l9WaM*XxJxAX zb2|&0%1T?>Dl6(T8|sR3CdLXn#wsT2$}v7&$I{|YJXNLPedb>x1pTtrC+a^d=&w!G z>g#ehh;v@=ZQ_di8$*eA{X;#!_#xb9{Jn$1sBLcV@Ze-`>)_v1t|#BzG>O2l%?%_D z^S%VSRWVO;N|AjW8+JYh#^tX(U#O^uviLmX_9Msh9rwoTi+>zw z#ebM`?F+TOCiUyT4<+_#2Fw|wqM`sWebTm$Yri-2Xblpwuy3?wWGdY7u7mkxZpC-n zCf>;NE^jcIm-Q_zh2j#&Fvifjap`5@o7MQ>gy$tvV9~k9W3eI4C~rd@b!9pcmy1`AMc^> z?_uuUo{Y9O!{b7RkTf;50`op3nckN$FjYdsKnK=ZghGEZJuFDMU5)OM9<|N;1mZ62 zlkt9Q4((8s8Z8d+-0Z7!Vg*;zG`d}EPfsgxpWWZz!(n_13JRK(+DmdJpk1ndy50zt zawTH?!%%xU|5=#CtT6QE2y3d!Q#890Z7o6Mf?~5x<6;PSAiK0+@8dAxZI+)CApgpW zB%OBi@IvSKrr>BuXU;D~7pq5-Y$ID^cViFLnR%ml*<^A}^ zDXv0xhoh!(Oh16f;gAD`BCn{2+Os=Gu>rt zN%)HYyHk0v;Lxwxa?v-koG=DN6>`L5Hv}K3cuup!oOKk!>m*i~tgF*$W-Awco{*szjbKfUvIu1@Zf0UK_V?UAm&-Y!y5-`DoV2QpE z(Scym{?LzE^xAhvdhl??eTE4hR#t%1d;!|(l5}~g6gNeracm-6L37P0tOY5FXY*9+ z08k2`&^SG=sg0H=S;32F_`u5ujfmB0HBy3#BWC>uTiL|>Ig&7xcuXj5Ov58JX zioA0@Nq6hUe2KL6nAWee5b=89IAH2I}1v17q)I39wr~t;z`@{lF zc{u)))D?rLY4EHx%o!h02{o-R!f_gV%p8>?Kiwo3*F_91@>Zm&jQ~NZ9{II#O zu(G|oSrh^na?h(4ump-6F2kEhT%g1K6N(VC%9W?B z(ww=fvu_MTAd?g|iB2eQ@4HOSJ~#c>Kx#ArEO%X;kTrckGDr3lcVn4{N5gzbxog=P znF4KYf}EF#GaoAeqzFXevYJ39m?q+|#Fqa1((=OT0DlV@m) zK1D810N>rcemi42EH zAP4A}vJfA;(wQBM%6tHX@hsPwqhxBx$ROT-Ued!+br9#GQ@_M1+=)fLJNik0_i^*& zXa|#E69fNXgNBis0aBp51g_hsLr*2u6u48>@F4bvXu774&y8Hf9XcKBS>ZMQ?K8ch zH{nFnbjwi`+SX0j>leejrD>m(2h|oxD)3}%txJ7mGue2(HdB^YO}yn_vUSI%C1t)? zCqa+zQ0@wS4{s=*mM$-lT8_Cwl>2=4N|H7NV3HQveT#wtH9)wmE{Q77|K|k|tLB23 zAz4*>Obr$^1l(S#1fZ);{-E>DcKf4j!FNmI;!OXls{)A92Af^}?}h__-7pe$y6XWD z7qVDu8d=T|HU~(Z)z$up0nG*)aCp<&QEUcx?d&fFN1bIAb}tsajb|{ij2^qct;eDn z%nsbxPEc$Gz9N|-9*Rc39~`i0L-mhyu$3yGmXRtyJ*LVpRDKgoFqYUSs2B~bs4d6R zB(nE3oNlUm)l<|8{B(W+4}WoYaWxQIRmBmZ$FJAn!!P+5MqqjVC>+$gpZ}TDvwI9d zYy_s!c5Z88mp<8cInY4li^O$VYH(OuSS}BYTz(?X-sRi_vTLtYKA7W+bsqcx;<>Z9 z;0>(7ZFVQl1Ns9jxg6HJD>yIV~#cuwhu8j8H^k-T=Z!$Q2vQXAOj@$xHMy z*EAg?qUef9e${rZ&-otPX6B5PKjY#y_x3_p4V+xa=EI5;gTIU3Gmf=osm3qf|r;Egt`UE1vwfbMF1}E=IMSjFp!|yr@!cGQ~ITNK74`X9t z;dtkh?6#?{H%J4mH>Rr7@RTg0+;krU$!FK0r+mT!XDTop{5OQzQcI z)QuS|PP8pbY$)UVM{Jmw9dr|@138>E)#eIMc z->^R$$`I93CQCz@r^i|Q-OuFYi7dXA*~Z7~chB09byB8|`)wdHuS7l@SUfC<125sx z>V}ZAbAnS*7V}KdMIoCD3dUIHFok|M@+u^hWr26c<7kelvY93WX)hK;IG_r0gU7P0s;DP_lz zi#FP4uQ%=SJ$a;dhp^mg%il4HKEIzi1CXE}pH_M5cvdM*C;i++xGS3_E2tb(W8C{Q zL!}VU4SRM&){2NdefNH&WRhDU!ZM?AXWe%DBaKB7&61bOC!gyb7?xaglMxxOAEfof zYxP;GoQ9d@xc*BnPS!9fCZuM55pldGk1Nu*9^YwHm#&i#DS)Z4?97dL0~Rgp&~oL& zMbxRX;oY#Hhs9T6_=B=o}QlWKp1jU z?80zZe^~WJAfzu;CUsY8pA*8~{tS>aJ_C6UA1u`s6aZF`|I5?e*-8@%TAitn|9jSz z+az$GTl3JAt>v=$U*^>Hr_?0B4|w4~1(~{v04HCz_6^lQ!ey6eJ+-W+dB1KnLr-3hOkV`1P76kjvH6-Z2C?n zCi#ezjIDH_ffz|1kKQ5OGlYp1B3KfkA>hVZ-Yba8qE@ zuUVbEo`c=!9^T7Ca(AQ0G1t0C(F~hiaZ=Tdm2j!O+*D8~qha;tZKBMj!*~Y=e7t?X z{4x4d2q^EZH|ASeZj_8>rDcNsG3Ztr!R)TntejKv+7T4;#^W7`IQ}s?eR1}qeuX3Y z9)NC@%?rm2-nGU&%Y7Fx?Qt3^KcLazhG1f@;`?FC`DR6^AG6eGZ*joQK+jJcNKewq+1YxR zlVyNTF^$~Y(}T(!E{~`n11uj@0)Sn~j?@FS+_J(*eY3G7t_Nl);O*d0q-0_BS}2L9NW@$vU(FNIMT8qn@h@4Fgi-cX6vi#P(-Q8{3X35I zn+Gdh{a9fnMVX@%P8jeM?Nx=|jH7zjOuPg6csEN|zV!Tjgr9pn@$m3)cYE?=n`>B4 z8?Y){C!xc!F5wlca0{WB%4PUFIjP`=X9;-ejbag|+G5DatEpjStlMM?a`W({BP#(r zNgIaVBk6f4-dFr}KdDKe#+`pm_*m*y# zIbANcYjt?JEB;W!+nk-9{kAhe8XK1G2U^}d>epQ4?lf`wZia0u55?i{S9HJ&+r@Bv zo6JGXrCDM!1kXnzO-DKY)!1cXsv6x~u_w(n$l~99 z+}V2}M!7pAxIKGYH_H+J3O}}7 zJ=lgDS#|!0h1(BW69e0&{97~nG5k)p^2GL@*_e4zx*F9d9D}HF3TGqTh$=_JP(RR* zMpmGy!R;Sh_Mx%`kthp$y27;pB3+Y2+?afEXsGl?`r)s>M*EGJLHy>ZDF|i-pubX=&1xR6G@S)NAuzU`3)ggB025Wm<6)Tt%xpetfIbt69hq4Xs_T^QdSkTOT(`P?*)zjieLX zc1^)vR_fTv?#XdA)Y6S^a%&qnt;Lx+yrIOXo3;=I0VA9 zdK583gVufDcyV*FoZT%gtVV3F(Z9iC+SvSoW98Ovk~_-fw2z2`zakkW5clG9T1H0s zV5znW`On}KDrF-OyeoE;l2OQQ{3;=DRwpZ&p9uP5$*(`XpCjKhMF_d;cN$|@#QZAP(=w%Q{$Ff;# z+Y3cGv$ha{SXb=q;J13M-FbV}8mai@`TYnPnqWNc1L7}a_Md3yaV}GediAG?C0;mD zV5rB%Y!s2sq&allaDybmBIAE}Ndg1+p>R^=1#7Et*mLa{!hM(7R&W4> z^iCWOQ_D=)#53oHDa7BI_^$qB%@ONt<~shf1Ug57%3=5WHNx6rF#md%y1eA?r_0kn z-)#5p+S_?I9!~{TZ2?A$5>Z>L`5;%IBG30)(7Kre)QV@h&E79`H0+wZ+G5BfEZjqw zZQF4MZ?>dp*)i9SS}|hc!l@E_n~v@9&fV2`_Z7;uppqC6y}kgKu6Q_Qf1{n|W(^jr zl|^h3OpCFjmSgE8thsm+`*&bo=sY{ws98s5H|-N(l6so0mGw}+Gma|KPq`*2v}0nH z-^gkF^`)4}!6+#)V}g}){gXX~Z5|rhbPTZtRYsjq8nrEEdUAE`6OaG`bO?m^LAa-g zr&5HNsC-b}xmCYUxtndB+e+J@Clpn1r$Cm9MLN2=(WG0!_X!I+jz|P8PG%3&OY?#S zHWcsDNSUz|AVN*SXn!AY{x(xK8ZzwwD9X%QQ72oW#8_g$TCzz@@aU??R|FE!-<8Sjxh_@cm+gkk7Be~@G!$n7J4X}Fq8OjG_(2uAa5$-1 zUc)Hu$@;0s`^I&vmyM4+dvZQ0^n&&10zoip$(wVPlzh_)R-uUTs;y5nL`)C^-EIuV zsWm~8Zy<3a5NMDAHHp|&GosOZ&;k6F7CQ&~gtvHb)1 zr7aoFwe~9eC&wbS9F@`><`7pA13YwM8P`T0}5UN zm$ZNM;oC)nAE2P>?XXA%a7~Z5bEA0w#Nwx&@4CX6^!+khBo*QZ+SmaJs6O#WiO{D( zv4=qk=q`i3K7(MiPY2f(WXTvz%rZ-~UyyLn${+~2*$CQVMqEmSH~Vg}0rV%b^qJTn zW1>R^hjS_~O~J@NUcTtWA>SWk3W1>iSSI{rscsLD-TO)ZTypHgdzh)KQp^+g1~kdg zwYIpY!nY=-8k#Pc&E9~Z4yRvLUH4{Mnu)YISEf5Z_c)eN&*&3-D9dHc%qLDosmM=% z!hTCG3EgLFjxbE*8v-3^&KK}8VY#O5RnwH)X0g+oHuhkFWGK5F5&z4)cjxR}J)ea* zRgn9WQhQmTKy@^O(24QZu` z$2piYF#}(R{Uz?1+AZxr>Z(D0HdQq{Ls7I&Ha&nj>M*LH2ORig{K;|`>w9pXqX<7D zhj~x6=n{k0U6W;ye>oQbCzp}GqcsBS)7!mW`n)dQRm6Hkq&vNct}jELJV{rEuUxnzuI@E$9s0-i|lb(ILc%0l+OIg zRP=4}l;&5=cCXc88nrVvk1;?t=zs|Td*zBDW>Hi z<^Oz?iY=Vy?6R#QsSxnL)uMZgZByvznEt(he%crHW9x?*z$5;7ZdgAf@Op1N6h|r% zYvtXn2=(Ez&HV~BY03}8h`Yut_*e<}0AO_+Z!S=}z#*>8x~t|x&gevkGk-^fR%)Toq9J?LM*`tSLGK9BDi&mT(l>2b8@7wdp)TLoz3DjEgO8YB$h_xFIn;4k@N-j|o|D{7-N+%T?7?d06f?63Lh zNlBD8g#`t0OKV_U%H6ErU8gQHm}3jg7%8vq6k>$c=;WIQ;JCFHAhXdPFyzF6aWRiu zCVVw)96Dw6P^@#XGjobn`NIw=!oZoXE;DAlThoFMs`6^DYLvS)zP-A5G`XGhG&jRp z(@lbG@UZqT9}q-iTa0wQ9g(D@hnf=a>ks6LCq@ameifXE;vyWNlbnQ{* zFprRe4ZD_%v`TpKvhCzD3%iTQVn-H%Zt3fjUehzm;y+2$2%Nu7#_8w<+eVDfaP;w$ ze^cRRzE{x&kO_G8$@TShSh=uY+oqen7)PQett=ln@XX@ANT>`vopt&?T>cx4YuV;h?$%mp<6M}>&s(qq0 zTlz{z;3&n*HTie3gu~r&zS`#Gab&E=7my4Xw<7bMl#Y#{_`K~B*H_+6&cf9}PvLp9 z@Llc#*nTi!8F_i+HR-^OU5H=J7|TvZYC7b=j586qnydEvKdIwylYzaQOMJG=_5L4V zxF>jRSd=tV`jmqsjJlUhsBIF__WcB%ZFlU`FD-9IT<_93bxzkLF|YsNWtHrxqG}nB zhx1fr&u^7V27Y_?(e;d9PGupZVb&T}i`nYNJzBvY&*Kh(YuRS0Fg9dHdzJS(ze|#@ ztg1|E78K##dUVzwaZ0$xHNCc?e z^0qdDqJZ-NukAiK-jAd&i@?mm=$NYo>^mQCJ`H;1l30jO7s(S-*osN)Lxnd_BDlcT z+{(zv5HK5o2fhFzVEPF(s$IZCI3_Z|x0!T+9mF*(H#yCP7bjF2UgmIqd3T2`me=zh zBa@)iC1o)%FaRtg)IQ3hcf7rNmc9Y$6_aEmQGPt+IWHeK$0ZldPH_X{tJ1w88`>?G zx}n}IUmOJXdQR(o&IU4QYprFNQYn(LEX7isVVIaV6VlK;&+un9G@bWOm}I&4dh8BT zFJ=G~>896MCLksWz_J9XK(ke4g-X^9<;tDLrm8Kow9R}4MiT6-R@5gIVzD%J!BBz6 zq*-QE^Oie*f6QbH{LavekVE|aqMxuYxv!e)wLeKJipO z0=MmO{l9?m(zVV-w%m?>2NFNuRc~%Dk`hc@>S+tMg|XdXnN@A z%)!FCStzMMFMTAyBvJf=pm;sKyFV%|O-Mrzjdw|25%LI2l5e zUpje?v(4aGP4(2Zgf0LO32vPUNIh6$O{}dJ$OH6fU7oubfsU#ZO)N;vrgBcU-Af-V zU=C=+Kv32kTI2s{kLB*9t&x9t&G}4|Q6AqY z?i6N@gOqELuli)_aVw=Pk&JPoHT`y<^J+7G360JLBLK68E~`$-rks8M}Z%|C^IC;6*U9&_&bXvDi}V#Rl=y02`Y zC{ut$jZ~4XTz<5$1>?&xKN3nck>xKmQY|hEQ*eB_BpNks37?m6L|O_uaS%kliqO!| zal?@$K8Bjw9E5uHzQfu$y!NdWhNvT6n2_;_KOL*gP4v|Q^0razP>|7XAwtKxiLRlC zqbWmuv+BtwXhuuA2$0FgRjfP*phTF8l zLcWZ$PVheN=kfCw+Oqc+90TJ6@J)z~CE&`f3Fi!D*%6OCZ}Hv#71~7vC!2y1wZLvF=iHBIDiR?ar)lbs-JVMJaHOH53{ zZ$0i+c^1dGe|N8Ol7WWF%-xQLfn=>Bx9bP?<#quONEu-?3o4eTcnY9^6A;zoqm=nr z9KXUJgJQYCUNz`=t?t(+6oyeQ1!{UfJg?1@NFdH*76+@kn=0$lS)74mbv3DSI?$e! z)CIowObVj)R43{breqVb;V5^4wGIm8`}T4Nn2*vBV-XPWdOtcT7|A@qcFiQzcffA` zn3=S=o)N4!^GB=Z0-@-xD6jk~Zjfk`#;zF21lSpdP2~`LKNFY$bN0_U04*F<+MwFR z3ny&|$Y2$-a(w$nlY@0Qh!kF=UJ|7cTCY(|rAUl^&#-`u{8bz3-m}x?%`epaCO1jS z1Q!Nt-+q~~C7zLfs)V#?)qsj(XaU_iVj0iDr3u^B$RcBWpK@MhB^P=hT%NV8T|V}y zNve9SR98rRrQ0vy_*rC-9yK8 zOz#m!Di1&{DG&pM0vr;8Pgl!h-PKFi-d^oz9;Q+TVNN7vt+{ruW!B@Fi{yU1Zl)&; zLtH8*ThztLIQO5GGr8!GGt=MM07s;#UfaeJr?`;WTDJ7JabZO~EI;0zq-jKv4a%&3o?>YA1;r~WvWJ&OR zIUi-$U=^k(*VeDj>>8=+kO4pKgOLMK+lL0}`cJ3TN1v>~f6Lc;MV6pe_&WiYJB{-z zS=`~x!OUS73WEr%edZVP+hf3fOU#b-u+7Cz#$?(lB7I(8A|5AcEjxS32%_fvtCWu5 zm*91E;WO}IEX6kr>0dofs$U(>*&Ixl`uZMkWbL!nC&P*Ru%W+xm|4F$h0MS(UUp6Y zB-VDh4p4@Zo>_b+%E8xecC=E4^Hi9u$IQrthh^Czg(~}HTGoy71HY78X`4c<^UpST zuhMftPzr`e#zf^PY>62?kh;4|T-A-3N$c462yu|hrSn-J9F&>YvNv@9+)~3gHSL7L z)pws)R#x!m)VK(acZilSsr1J%nTU_=G-MDaf$_wa zk2Vck??$guFzI54L+dS6DwaK7gc_Z7#?pNaeO{m!uo}TZxESeVK7^k&KfePeVj)Gz z(?r$ieP4KOXa4Z?{@DfcDTa1$Ly_{;V2yloI@+YDh~D>1P~$g@s?QW}atJ)e>(3># zs^-u&_Q{6sog`y8sm@o6eKbN6m<$Kx7Uh`^?|zNW=O+v`74Q;7h0B?ZUU#6kyKAQ( zSm@v4^mwE1eo4n%0%RMZLGqt9Dc_}Y+%t`di;@<$$-r&S2umYK!olGTxEl__@M~-! zOpxiUv?MN;#}?P&4?k;6a>=Wfx641Z;p6n-bXslJj|iA?%DK+hW+G?IC{a^ccuDNH#Cs>ufPKf7iZ0EQ zkQKZpKRxld+ggbaf{rzi>^wYH*9aoZc*2@8Vq~8!?JR`P?IeBXP*!H^(it6|nwpzK zsWiB~{BwSDb>4ULladHU@K$Ax{rZ&X{IAkp-zRl8r0N?gT0nqz=2j{$vXWMpsLRWV zMAgbOXHWc(Gmua|R^*vxmf;fmlT}%&r7U%~d|o;n?uVxQr;o-Y*sZ!B^O`HcurA)^KQMZm=~84AgS`s~oyrC;w)2!9;YD*`2YYh2y+ zwMHt%e(Q@VF%}4J9l{u@dJk~t$j|n=D+T1=phO<+FO7E4iWU(5Y!>@WVbWz_YHmZc zc0I`>#bQPmtnSZ|t#4z*@a+DT^Hf5wj}D0Fy1gP3sJ_<7{SL?+-LM?b4ZN5Sna}ul zzU?FSNI&tJtHFc^A6Wx`M{1_u0XZY#Qfn?FCH;s$%V!+rv{K?G+{!x(a7L}9;Mkp5 z{U}dcT0X+72(*L%Sn%S)ZpRm&TjPfbS`e~HGYECj|7SZT!|^-6dB53j=!THy&-3*j z;qw6H$};pGk!fU zh8dm6@@$HRzU?^(v%l2zeCaoAnL{dV`o!+(Y<+hu-0}HJwWW*oW#fp_ub12G&l=7Zz~mn4*yNJnl9D z{S8tg22ue8(qNoC4pT2-bOu7dZj|5^+o;zJ5yYhUtWzSWXz+nKu5rCrzwZKugna-1 zCGiTzLxYTsn~I71qNk?^Fv9nxlqJ|!w2D}96ITeav)a-yd=Tf!f4FU!47Y7&&t+&e zoG6W)M`udnB|IE1+Q#q&}EliCxisy zmF7;rQ<@eY;Qeq+I_{S0(Nudf+^c^3I|J9_-}V@oU!ahtP8bcP<+U9daVHuj_RFdc znU`z6Ik8|Qz_!Ezt{>sU(`ixf8nG(8%sO@4?@QXcx<4-t6^BJ7dqNt^090UC&&abn zdv<2aS!!V&Irg()#~BUdVRtN(_Gq02S@4bMgdL33XLI;N8PLrQ&nBwD(wZ3wAX@7I zvQd`28c=|jtN##D$R@eJDthe;D)`HAhPIOLxovLC3*ajk5c)9>GhRGZO@wD93PppZ zety7~31KSa2s!$@6sAsRb!fY9LWKj3qYG-qxxd4Ze;r)>#cI5?69nMi^;HOoY>r5% zO1fC+MhNLkIWRLHi4i6rup8)x^N*0N_3BXjIK6s(N*!-Q7~uhd@ojsT+4m+&OJ0Ay z+SDTy#Q$7@K8wQ~-a)w+*t5u7Q|A3)n5ay@4-8CKvDu;@a199F@c$UosjP8 zMtATqyJ-pRFf7dW>nZARNl>56kTDiGvwCGUx1IuOi7g5cTFC}Cot)+^5I_7Ic%S~RI=AyX`~lRowAsL2*aGvjJ3kKG3MPp*7l#^&yCRyoX^C^nW06oiGVu|_ zq3O`WsXtdpXJ;4Jrq)}e8V5tX{#aMkJawx|JhpiTi1{ncH=eZyAEghVLD2l0l5!=# zIR!7TwyNigkk9ijByY#B?UrolxhNPW?m$4phZjQG<6|@6bSOEFDBmC*Y~an%etQS7 zAuR`oD-c#(I=&&zy4>o{p>+jJ(?6J_q9DE^M1Mog+8;?^qL%%g8P+-kNDZRee?ug9 zkGBG2Lep|H2ETW3__}Ha6pCsfmg;la=55(9L<6qDOL+7X73ut`!|jl!tVosxqCmV#eoeb21f4bMmo`5emMNKT-c{)Z<6Ox z@WH`B68)DjpZZNqb|Zi!Ew#EkD|Gwm!S5$=C!*DFmH|-~x)0p!bZll(g!tXpnNXbe zc}+!nUPgx7f7=yP%{Rx!RGg#~WLw#WqTExtsS~x31B*Wslb3hBez@VGXNb)|{;j7n zU>jS_d!~Jp;c3VEpvXn3!>yhki|w@VlKQr^#9FQO=X$-&UyHi8Nh-f>=cpM#ttoo;mcyNfFLYju&ZwF?#q_StYgkj`$Vv00onY`yA<#;}TAlIDU2F-GT+ z9+Cg_rK)+Zt?+^8kNrGPZe&?-TiY!S*h()mtXIT-1Dmi}r`ZbRdULfZo zro`bk><+N0G0TllA zDFHd|_r<$ikXe6D-gHRiQ-hy^u~4n8WKZ?!g8FytY?3?;>%gB)g~3}v?%E2(vGT=? zr={Ho@^^lCWN7o(zpQWn&Rn_|4D!wxhR!xQAvYe@SW8sQyT#y zjn5v)S_>$F!Ngf=oaAph!EC(A;kSN6?k-KsPyl|!_hj14RVz{5|qh#)hOX2?Ki)1*+-yTt3XR8@n- z-vTTP%4emcm_R0Eeadp9D-a4*tjii05HCnGsac!8-`OHJ zQpl?*byCa5kcWd+*myj%%}Y>Ikf@mOWi#!^wPZ~3{&Rll{sqv20`-vmVOw;X%Cdc7 z2nUK1QZg1UZf-tuu;BB{EhnTVYW@X1L7SRGd5dHiH&E=~PWX}A@N$aJ_7+^m5k37{ zBQu(tj+OWvRbR1{Z22N6Twhln<)<7y(?U~7)UOWcH)D&`A}p{V(B0BRsgYaaoaGL2xa(rHC${|cMkf`8ZPh@d%E$p&w+T3b)XEO&c}s9OQ+ZC;=G^Jo>-cir}P zX=PK_|IX$wlG50m)teD+)YY4t`iAdkNo1(2fx$jW>^w*}@so0K6GQI>RW?9|NkrgY zt@-vdJK1Mka2NLM-;GjJcKg@S!cG=7eretrd!Do>Bq#g7?zZ{L#K%XJj)UwhEkcX! zGuFjGp^jlO3pEqf>zNY2Jt$=?N6>fk&C^izn2NK zOng9zk6ae+B+r-A7m_pwuZ^X$4O+Q5-6twBCeJq1Tdh-9uXk}ctX90mw7yx4Z#=!( zKmFGS2M1Wbl$<}n;l9iy?0oh@uV)N)6pB5Tkb>Z;gV~ZRh+J&8r)ki_gUMMfI^&BK zDc7rkKaB=C&!{j`ofjlyA{BlC6$@95HJXmai&Zv+`D-M4i6G$*ope}7C?Cv%`=CD2 ztpG?)Ah(2loS{{O_oZv2Oe~Plp#z~gMNUKsC+R64ieWVCzZ(p03^CiNzj43b3Mi>7 zx-Jq)y^U}FL3u8xyBRiO`X?3-zl-B*L!7C(`?`N7)*fEu*U1No)*b|; z%p<2orC;EoyT?1OEALm*adF>wiK|Yt_K8ZCA$j^&+k47Xh-?KSEEt)L_|T?2ri9%D z^iDB|xN!X}NyWS@YV1)yf*SX0>4)6FP>2Z!>Geh?JGM4ZK@q+oAt_ZnjwSF4s>_BB zqNXvegHeKrFb0~El2V|h0MKA3Eko2*7lD?RU_V(que**A(H!V&I*ib(hH=`5a|$iV zATbSBWfjA1s~S4AFR>UGSt+QGinzAi(NwOG%6_F`Lz7G&)K#fq5-%p6l8S6`b3kqAwr*ub0k7?8sCfMDa8Y(IUp8AMpKNrv#g_5pUm;{ zdpG1B)shk07wky@hl|mWW3Kl`9VPT_k4dYqBtu16pt~)n?}@m`bC}^x>6xk?DI#U> z2WR1^ze$^0E8`Ja`eCxLmEm{A9F!;9eEx!`uqz4 z3K`PwycfA(LKWg?F_;w0xKjstZKO7P8;Y6a8D3t+-r7@2dr*yq>1kM{+9JvGzZx$7fIHOp+Nx5XPrc-=KIwH<5o?N*SfU*tQEIdSO3t9*-w@@GFvvm?R>thBs9&Qn z$clyo`ZCG4w(rBS(FWe|;!k!6V72u?8VF#M>=;jil70W`)81qvdU3U|e9n&2@sTr+ zZU7*j#FzZ|CJ{=fDAZ{7jZmd*bq%@Fh7x$Yj$oSql!OsJp^#fdNkqy+nWCOrS$B1g zWZYffj!=E}$R@wOkg}+^Kop^t((Hb&C>a4q$$gVK*!m2>OF&2hUfnXftvUfjn3LWr z4ny@M(X{2fqY^VwzZQ6gF;h?6BNbM(DrB zr8^ou*R{Wo>jxDt^GE}};fFdGU(Y5o;3qM9tJhT_tud1}x5&$g_YcVPFa7##A@lxp z>>!qP`yCbSJpvN1MB|bhk4>jfWz^jfwm~w;Au1%_G`T%35<~SxZVR|GD)7)ES0?DJmjM-=i08u6_w=VHpgb2f5ZNYRHVmQC zQ0OQnH~+xI6pNiW@CIgoI82gGKJ)M8o{5PRB?5ixm7?2B6`eR;$xHYce%kI)hc7Q_ z!GBiJsQ9H~XRb`DwIXVlLjFY4xPwGTA71Mt&V1rV06lFX!v7WhlN+ znxw~J_(ZA6$^9iTUu|DC+lqgb+0k!!TiGZ2l8}p<_g$`-o-9Lt5*jW1%iD*$yOKtf zXi~%;6|70_UI|&DAcCe26-n+OL@81xOLjKOGtA2?QujZR2Qrfp?%Thy=AF*ssH<=4 z>8`~vC3+VbG_IZiFGA#={!7z5)jlaUsmHf>fDuMO2sm4R%Y|20q5E#cyH)%2U|@mc;K2z>^M;CONs1Xuakuf%`YmMmvH&q7dOs*a4?4GB|11Jcf| zHPZ@q3VHeMBBP}>{T20DqkQXg8pJ|tjBRL2G=GcHGHc|HWK z&hfRjA+-Sx7cFlnZn^!yiB&`aBoem@ZVP0!8)f>>(K_RAP+;_cg4UhF?%ysvR%+`ZQ$z zF?_9bgURUZ%RO`~%YA3}Eh0v>?KIRAR`@~2%BH>hp=a z4(9>-99FeapcVM#krGOUuTZ?UuFO6e!N3CRB)C3t=(hH!PZj^q*sp$C@(;DnZZ5`d z^BqL7sb9z*JU(#8a5Iu$)c@)8x)`4L$%Cx4>6g{S#WF(VCFSHRSCKhA%MqIU5|Pux zMEac^=jtTAs#Jb$`+Fb7Sdw`jN7qnw+qh|cTeJ6=cjNlGdho9c;L{_sywQIHT}PyT z31~NQYU~92?gns~cbtGf@a0xCKeFeUJwwZx9~J)FC}MtD$GrS}vx)b3uS{66QZ97k zsHqhjm@^bso1GaD@7R%CRhvRtQ;iO z?V61Dt2h}8$qD?mVom!81(CG)z}n()k*fNIw~g`Ul6B&Gs=R7Fa7dAhVS$&er4<%y z?I{-zefQBN<`D`kSI6^yZvV8Ho8%+|S)*BaNk)Vzv$^Ug&omLLQD!h1v7`ft#ZB1r`J z!Xr#CK#hqHAvxc8di=vrIPtcxs+ZB_Ojp6MQv>4SE^!~ET$kio*9}n%5%>dKdelq< z(#w!x1VaPizv*g9L&3h-Hg$|2YVBFPSOue|vIEbZj!t<%rp@i?B7Mi>6rll z&ac5bNCyjQust>LED%^;MtxXv%AwcGY%-N!fKv3wKetS5WF)YZ2#C0YZ%qm(cshln zD6cVms0~+!f&%9*{q@Sc*FrVjvlq z3#sGzGPbI7HvEZTmVW+=l$x+Jtk2#ML@mrmGU~%Y7J|ANxAM5*MjKVWBJDY*6&f9)&KJX(1vtmJA&X$)*!j>+O1-d_&eHE^Iz+FBu4y)oCsl^ zp9g6tfdVS`j}le*Ej^Za;@tuFlJ=pcA8qq&(t(^=I1vfU!Au38a{@@ow6!(v`&4V` zPWpg&MeGOaGB{~>MO9*VFyr5fIy1vuZ5TxJ235^3)!P&&0|{i7L@#NLi zAVQTuaRr$PnbHOJ$X7IgS7|{0lm$d&Z4sl{UT86}okZ2z%|B7F1!#V?Hje`&ey=ndxt_1Hg`_=-3R zGw(shl&D6UmY%c&&9wB7tw&o2CJvQR5$c=A$M4Y5bM$yjca8J?*~@)y-IeuLnjCeb zO(O#@N|lQFZr9=T;MMB^``Sr?RU(F$f1IV1``8Ed9`NvhIKt@T?cf_CV9)^g8KTDW zMN`$cAVP^wyCr2dnwUQe8*LaD!IaVE+woevP7xP~68b>yw$R;fkMAS;N4M;6M;+hS%qyv?Il`5H{(bO6&F2?@#P4@e~c6e*u0wr)}ftg;IV-fNV~BandcAsU$g&GcMx z&_}~N`mdncYJpTGr(CY`{2ic%V(;JhV*Rlmu{O6vOA^=NYg_g2bIND?&+}yvQZgdt z&v*MRl_-B}`fruRMWpQ_0;{dQq-5CCm_OnP1b+JA(+T8bgWMsREjX6J6%@)@&l$;M zz08?0^3$5ZQic-tDms0LJF)Ru2#pJaf>B}-bAx;&8j43)BdMw;yA9nXhf0{6l~>nu zBz2}s&@Z}cF-y{Ma;Bj6d0?=<9Uz!^1d47E+jgFl2I1)xN@Z15GAmrG@OhsB9Z?JE zIHNL4872;nKLEMC1^oHX-?bw>H11HzL~ejPPZT1*C$i+h!~;k{h65@yJT9Z5gu!@9 za%jqK&J2(YMg~jY>gs)nP>Yo;_x<26w+h1TM4T}bSPQtt`ER_R{&?G}rn8v5f)$;V zk~D<>EFv5s7|MJI9@J-B#xcis)W{@irm(TRUmR0p+bIQA1X=jW^IVduHrM*vv(N7S zpq>@$2~t~WP(fv%<{(6o6jn1uJG+_^z0M-YxQztOQmqpE*z@BX zE?^M9{bOg(AbVXxG5R2ICH(!msoA6*L zQ{W&poXmi8{jAyYNT-wjaR*4_gn-C39}yA)fmW>I(BM5#)WAAd$qM0X3HZK!&duwB(~~KNeoK) z<&U28*vwjXKk@omc<977#ztKcceBr5nYoYSWN~+kl%Qi{;ty=7l(<~aeaNg z9s@M1#@Yh>xT*Z!e5UMf&FdIO+F{JLj~R&@aPKZl3dXA)G1hQ5q_u5Lv|Svnho zvR5_d6xiNpd}MKKv5ZU`noKj&v6)iqI!<{yNW<}NTE!2l(1qJlzqwXD)4Tqu*yJ)F zD7-YsPyrk1yc8babR|(GBxmV|VJie*g%^hCmJ#2j$3d_Y(OF7M3Ey`o34XrrVCMNU0XDPMC^S#?9+Rs8u>)`ygAvV4LD z;9X;OTZwTq{Z!N^nwBb8s6g5}ZhKMt4vNt3%BaR-Jc52M3s$69E<4I6AU8L+$cutR znXM(qv3zV1OmB;|R3xu6MM8mvzS)*AUu1+BeM*Zi z4}r1P6sn7r_Y$LJwwWkZBycqRwopO)+8daf#ra8kqM_JH>NM^I->+q@nz)#Fa%-KA zLB@k!X=pn|{wbpiA%={Of6%O3PbK>8lqfxF`R>|4|7JRZJpsz}3I&B_G2ksO3=)hI zzfVCD9TO1Wa=M(Y1B1d|Hb%YmZp&6tvL*vT5`m|NQo1+)S*we6gh5c1W{ z`<9=aV!kIxRgFEPsPFVCny+JgfKU|=LYVR##eOl&fMUU^>;@9AJMm~~h63QBXN=7U z-^yadrRO_g2}hD#Ew(vUU4-W+C_9)RDmwy5=WrT0(!R>*U|Gy~gE;MEZ8tL@)9ND; z^V3>vb-VT(UIAu(fX1*4a1^yN2GHFw!cvd|pH&IlQjNw+)w~|ql^H42HhKQG`{J?t zZ3$v`M{_kTb?v;Jsx@iY1Wn5&X*i=^6fMrwn@BVn;*U+YJ1;p(*k7hiP*?dW zk>qqa=%}l!zu{&ytSjm&Fai$_n&Mh~EAa zTR}TJJD4J>aWRJ|thh2Xb$Z=FvE-i~K{YV+c^rfvpMstIJLK69WFSLi3}(gXDm&idp1VB?O_y3+|p=3u7`x7}~9+-Ew-5;1If;gL~LeivBQ;z`Q2Dx^9czp?|aO({iqg6yCTTYd|JXv5k-dsNAF z3LK6=u8>gA6AW?CEkFAmvaJk!1vl;8sJKy?Q`d9Z%LcI2TyEnh$YmeKF;LX%9 z?Ls>~8FMOE2WsC3#opG3FN@Mo2_0q)g1Oh}A? z&l^}@cyU;yT#xtLC@_5D5HrzeKR3>0s@`dp@=Zo6Xc1z>3A@~cz+Y(eNqgi(#27<=L=Cd?g>;e%ffYf9i60fh2d zl+Te-i(I!a5R?*3>~ZFMi5*46i(hFRvOf^i1}ytP?%QCP5c+@bwhM8w8eUy~qp*bv zYgKVfXRjjSkizoiuj$f7Tv`i5l>8QA)Uix>0#W`oeFBOcRo8dlbO*h?#pZ9EI)A)h zdv%`c8SJ6nX3JSOZ#=3;ypHE4SXh{UBmz2| zAFqv1Xlv1`l`t~o`JLrz0+xl}DLH3-iljGQ!QfFy!)R%~xVWfnyE9M6g2ywCeC-af zGZ5Tv{R8m>^6QUh9q*i%VWQAZ9iJZd_@A!7dz+a-9l)#m3Wy2F>wDS#DRovh6j0RH zX{!#8^=l~2H`(2N^{c>nZhl-SoIcrtmVhCN$}Uv2U$nvFP5Qeoyc6Qr6_zDTR#yVV zW9Id|ZVL>LPDXad8LpR|TlZb=5wq?btK>gL2JQrX6!q__hoDLFK?v{2_CBDrpTs?? zQ)X#c{(y0$k?;8JCsVwO{NpOfhu9nMH<~&BPef9WwucL;D*efa7%o%~HEGoBFEer` z-%rhATSv8(XX|IWxP5&DIzD0K*z7jl4oy&(=A&5B@f#pFMUA^8{p3|0ChdF6tB3GK zuQ3|4TN*w093ZM7KQsBAOZ36q_caiQWZkfV@R`)lze1b<91Ezg8=Fs>hE-O=yq;H_ z|9@*@|2DJ-HX5_6%zUx!f~q;0#MjzGS5`=pwaj;Xd0rAMi`*&yuWP(?+};_NoQBQ9 zmIrbp%bc9`9QVf-hglVJbu`L=PeEj9WM$IFST-jdeU-?9Bro7w&a_Wumw&tAZWVy8 z-JW&Anc*Pm6OJV;zAtdZtixmAzem8VU&)7%B=&w&Df{;ATY&;O8Cgd#X5pH}xlrCFs3~{6 zlwH0X%#CtV@^e^jR{tC+{!5nAn>}f@zsT*6TWBV8e$QqcuS{qrpRLy@kKGF+>8CrL zF+z^y*OB6Sz7eKjK8Nz!f{J2Co0^m&eF65!c~t1*EEv1nl2(9h(H~8m%>0^svI`V! zytd6;L}QB~;&wq5njQy-hZxpmbaZsw+}t&LSVTmX)x;M6+zYc5^~VsS{tUeVLEJFD zJ`7|&Hq!trPD)CW?At93gujRF7dmgo%-n5zx)K%kf@MgFyRO*&|>u zu6EwZ(9WZ){}~5ITLP}Z8l^s9mn{#$B z508!(Yc|oFVIXiWz3<``qCN6wj7-qV&mI?|h>K>6{0^+y7(c&9giV^$lUtTw01 z#)qv`UYf293$cytFu#WP=rI^)ed(`;*b{_wRP2UdR7F z=cY3#n1I5#4^1Kl33hm&`)-L^SkS8S+>-Fh85oeO>f8#5CHw_~(SH}o?S!nRG1GFc zjT!a|E}`npKk~G}#bV0^3*2~U>F5%gdh3_tpi+uTN?-WG_Q&<$xw*HGb!m8(b4{tx zpATAP^qfIhzqb!5lH_~z*DcCCbK$0==rP`GZq$BM%z-c73UKNf1t;R~M*Alc36p~U zzP|lmMSl<$9MXS>ASDJ^*7z3(g|3=XJSgvN z8nO-6Y4+yVXybOGl-r)#W;rfK+hTtr!F%q+3-667*C@nr9R;^HC%g?LK|lKpPngrm zNj2GaZ<|O&{|w&nKb}Vm(k-yjU!9+CEB4c0<~)y%R+^p3haLd!r+|bg0TWAG|7Mf= z>LvKV`=5mn3{iaIR_A5ax}AQjt?oRtiKaUg@FgaI$IhCuuL>3lVhc}&vio38*3o%2 zc|{EsJ1tHgsb;l|;jnwP?utMgv=v$<{_9Xg$|v;sWD_7+=YkiZXZodgJR1x604~b9 z3i__u!|FYLXo8S`l!EUt-eRZY4(i&JurV*}boIvJyP*_3LXF3E4AhU%>A@-97O#DG zzJ($J5kU^&*^X0sYs25V5vsX*-;T&vTwBZ2cahDv(xm&FRsmP#|E@a{l9rx_Z6;HT#MYiJGT0DI3v0`jALnnH!?EZIAg5HS z(!-J^-`Tl>XH*)`RbEU(2ojKxh^{bss*WukUEv7aCc6ZMDGaOg(3gE*bUFIHK0G+m zUfL$6*8Dd{M6F-U(}(GKhX?C`5mnmhABHLF#jb9~4Tpg0^P-rEn};E&w7?jmE(e(} z_-RG6Z^qt*{f?xA%5^Y_TB!(?=%X5<6B3pSJa?OWZk#!Wr*Avm5G)K2hUu~Cf>w*0 z%wyQ%>;b7n{t4l=fQL(7rYFSFTg*pn5$hCtTlRizj)9kV1G*c!Uc?ZqpwEaBrLUln zC2RMcfir;Z`S1|vz=ZX~{1FiLdiG~rN9cy{8_ut%MN?KEE+*Pv^2-;DN&b@kXg^*H zr}=qezl}gshzz?%0dulxi^FaAhsl;1_jpaVbfGAzrf^PUZtwhblIc?>4X4J<*i*_a zW9g;L6K~bkr+8CkHw*tTHyrZy`?7h^0f~xt|KTzpn5+4+x>kB$^Zj1fJ&=F@SENfn7 zu&QlB*Vi3o5gh@6fOf@?2*8gJzW3_Nq1Q;^f8`x43|McDUji2P1nE*D4li6oJ(~|W z(_Nl0@NWCV&?kRjsa4laMr!Nt$!cC;N<|vyH>-3|TyGq|v(8V&hskOk@iT9=;Z%l&MpqRLg7#^*f^ya|?&Fz!N#nc=X?x8tpEt7VZyJT&GyD@Q z&Nuq(toBY0(H!Q$HDc4agH5;z*ZV9Z0GQ-!LQclLW;wu@>9A?Eaj3u1($GM@peOCT zQqfXY773P;kpUki3OqcNA`1qGYx9+xG*KaAR~i)@eQB|oT%(e>o>?4Zpy&PDH1ETuCF%UjzV zLXg;Ox#_91SS~TU1*(zkC|Hss^ef`K40h=F-a7=zz9Ge`5QNUzxOhK#Kh{XlWb-QD zO`t4UyF0XbsH@!F{pco{90B6o?onFNNVUaOemJ#ryF?I1A}rte@bK{X@BUuNG&};e zmnqQC50?A<*{AVMjX;MJ4WxR9Gz)VSV!2TBQUMFVT4y@U|Ur<%hGn5vJzQyY~*!zCM_;~;? zDJucPLYu*y6JD!LI>+0T6&{(RaxQ$A71soFlPn6CsVn=I(b|v7@6sSK)0i?wJlVV&4h{@D|7EYC>PPy%A%EqnPWfvteW7#4 zu+87UKN2HS4KgVU-J{+KYSXgQ-v$Y8-PPowmy?bwuL&_krc6d-t85Fq{#7Zw-bH4q zB(&BZoMD|I_}tcpbw%Juk1yosht`Q8%=k!vZw%>dm;bH9NTeYQseI|{)jdUkhsCFB zNP+Vv;c#I^^kuZD+_o8B3Xjv^+n-k?4i7JVr;2yVgHuzdoKYt$Up2Z2+93Du7 z3vYWs@&!UmE0D~bhEemLUaNtTeb(N_=rN#xa!<$~s<;r(9#Vbf-*Ns;SSQ1EZGQFR z&p*qq3sU}8#3}Oge0&CrDl#13KVIr-7JFFMR-M#Bq>Fv1t5B}w-xc;Rhlc64Xob^v zDzy;Pq}aSNPs&Z9g>2+P7Mze5ltqrwJX~H>29Cyh`G5g?|i$>zI^b= zLX0UDX&rZ+O4V*CVZUrs%j)}iWpQ|z`<=;_kocGb?;o-IV!NG}3pjkFANne+{od|1 z_uC=<5I5Pj#w(7tpl7dApkN?uIm1Q?mPmzt+xAycR;T|!&{RhKW6IkP$RzcTd!LBY z`sZs)EVa2@Jl2T$+eixQ3E?`m`Xkv4Qw6b!tqI4Unu?yEn)cLhBOz{~NRrYoOFCLb z+RW+vb@wVuc4S2=bjW>P2m%<#Nax27lV8|t?0jFlOF?bp+2x{FV1YqZ&U0D667A%* z2MbG7R*`S?^~vJ+oxa)AVK8O1`^Az@bx=iSMWod=lU|l)esykOjxc;njMT_(wa~}Q zP2T=o6R7yQaS(wW7Y7GNKE8y?(&A#k_ZB>%JfY{p$pJpVyE^+LjN^=qCB^xmg7l4n z-YEs)70c*rOF^-Ak?{CY{FJVPVJY*JBcY9DGprr4`>XfRz8lXH82V%k;)}q0{-@EM z?^|ob?b-_qg5+--JXrrYxjaf6l_|)!2h%y&j!ZHe+8Z1`R+x;k^^Xyuza`Mqma~XD zqH;)iEzD1Olkm~=9x-7sKeJi0XlZ(vFZLjRiX~;-!NyWplZfJ=D6Gs{GzSdGTUs*E zV&llXxqe8J!gIswela-8*`#rbcctzW0x|DMx{rX zz=2(ooR#!QF`V7qoQYaU#*H0eJ5uMdo5{lsfs8{#ty_9}unyMqsl3=meBq#dG@{(k zSjvCx#tUJADSE~!Y(Hy^lClKq>iHg@oSqxY1UTE#hgFD0J%xoWezUUbw!UQfw{jwQ zq~swf{IU21HT|@VXvDvh4KY5Jce2Q3kFD-cNi2$#%^VqvHwze)JXiXc2F+pf`(FnY zk|Rz=!w$M)ZICfW#XwCcWwGl{TV;;!qHtO<5tSA5`PS!+zrs;_Nr^_=;pLMI@vsyaJes>Ev(gge0m zZ(1cn!!w(1x-$i-bx2XOGQ-wVxSvK9^bpCYS{E2($ax3NMS|bo;OBtN8}KwTBW$gx zp<5`)=kDdn)y4YDLp~XL9uiXXAL1oX*3nKu^F1u?7m555@KjOORkm#SHGf=^tLqtc zN}r@b?z|Wvg{W~@3RqxHrR7y=gJTd9(YD8c^^4zi>5ap`H@F z#&Tf`p{LkX)*qQ{Y}a=zhzupPA!SXXB#dT^Zaf;AJ03(O-@n(##77^XaG_(!A6cux z3ow>q>tQ6e0()bSB>q{|c&IWhA)!{c6IQVGemq{#8(MlKtb|_FgzP&IW4fqf7-A9S z-bG6_vi>w|h@2V2My3m?b0qs@@JaUDZ(qzQe>4rf_s*lqBeUGRl-Gc0$n#;_FgvgD zzhye31jPk7>VH($D5Obvgjvj@a`*3me%&PaH`RE-OaE@Na=yWw@Odq*O=yyL!PU?H zS*?NZ`YRf56z^T=W&eega%Dem5g7L+y+!;Y8%kGahHrEmmH6eTsBRY6Ch6O_(66Ac=-}?T zf~yx#@T zj=y$+_=FFd?C`X!zl8mTt)7M&Op)^l)`SG^|B4sy8cj)+C)+yKAnNw!Df5qGMVGRh-s(_xmHut{Xd${IV#ik z{rc6^WLuMM+jdQpCc7rvwr8?!+qPYkZQFRSdA`5*@7Aid?(XZn&SM{YfA-$8NCCxT z1}i{WBJW2Y9a%JZ{`#pPqxcrq40 z_Kwxy)V>>paqw|Ui0QVX;S=;wGLf>>m0Th~G(*=~pYu6xmPGpO0f;K)8hI=b1eo}* zB907@9@qOOv~4l0(3MAHEU1lb2%rNO!3EY3WG2w)N=?Ao54d`zIRisNbnOPvnV3MY z`Og%ZGOYm(D(isqAQ##1_m*NQG<5_Lz>@laW7)!_x=~JTOB0fd~oqXI+QjYO5{u7b0h!m5D;6`OAT}-9p~N zkh1kt)Q`OH!O56<=}=a0uMe0b#ZTIKr`=J$mZ3Mp6a_xeo`z%KuanbTIr3{H!eRPnXpT z?~_$X1hq4#X3c)-Y^w=n|Cuss<`-xVQRblNNwg{wO@Bgk)do&!dLus8@tiqG;(c(9pjvk^yE=L|Vx5G?Ea zb=5R!7H0Y6M~=j9sn@bHa$h<0`m}8DssN{35* z5Dv+|5-Ga}g|EM832(5_{}6dTM~aUSd}iJkzi>S#Gh*j+9g0z+2Egcb^ZudA{PLgp zlI`!i1D+V3*_>|*j&mA0&f5=dRNDmu*_2_doR;f1J52WH+VTLzkk6sFZOYP;ZL}Q3 zze}#mV5wJguu8YnW^5>g)3~JBX&?ubgoRGW-i<6)-Y@NWDvP5gQ^3=DmEa>Th*zb2 zP(P=3)AEK`MyfEE=^vK z9evF_qr`@9DcdTQ$Y{4ro1dhzqGqVRJ&b~qDIG7i@TZzuQoNDJmm$OEP{02vtbdWG z>xoXCXo5gb0B$KQwRp{I`Np(F)wiWY28|6Hvs4TNa#J&$#Kl=>$B`6iNRtkmTk|LF z8es3|{rpy|H0PkCtg1e7!ll2N$kOEO*cuqWW0vsBk}vaM)qDA7sR-&K)?_pw};G~`CjviwoOoW*V4 zLzw1Z3L{2A-`GIO>k-Rhc<7^xTop@I1{JKBl0ScBJ>aI{W}Fqu{b0_T=7)rV47SM` z{4EpSd1T)|b1DI{&@|aG0w|z)eck-b6l0I0<_aF)M+`Wc=0L7~matUr;W(r#ZzKS9 zO|AUdP+Bn&FYB__Y$pb1d(ODJhu)8-I+l<|hPMVOE?ow{WCe z7$}QSSPi5E)PE|0ps?UZI(q06Jy@vdP-ILff?=&L%sv_0_?*RPF44~eEM)Y-WELc` zGuE2K#_8j;vzMa*-qQA`MQ9X);L+P>RT3ulc`O>4Q*)7~(JQjnYqh!~B!aFdwyj*Y z=n>O#%9_3LX42Dt1XA40X15j?0`UpXhRZb;7f(rZZTE%3_VYTDM~0`r>vKAuugCCK zbhWry1HsMrkX`K8C5p+m$AS^RFlb<-Z*oYg+8w0LlGlr1g!}fo!!RJ3tMYNXxBA*^ z73Mdn=lmYN8zd`feP>O>{Dw#l89%*3?V|)a-(O?JXS2}`l)PtgI{|u+YnT#iprx=N zxI9{nKRbALpdX@z8RL6492TP<&>**x3PYDcob9?gQxerniwhMv!)emtZYPEtHL}kb zV8CYq)%d!f;`Eh)iCl#7Ixy2~(aNt=b_sptrVecNPbZgMrR|Cm7W4bF{wIi;tEH8O*C)U(*oMEeu`w5! zW&LfYN8$51N{mevT7iL5Mr==5W=vWy$r1(-*A+A7JFn;H3B)Z}N8_iN1D85_U9!W( z`{oxSCkhRp6k+EuF8?@7ej z$6RN}^o5`VbFI+;aQ*`km<7*8MMVKFMFLfz;Sn(kY1}=^%R@!z>IV+U2z?1~DbBRS z!nwuFlL0fi+V<@!Ny*w1LA5?4Na*_9>r0lWdIdhaTX}V-AM2*N%+W9TFGp)^srZD%^U{L%+qVYiD2xd~a}fLT9O4Qh(X zjNRNfm@*~gE#imgvd!;7r`}uv1-{hWs`3m<*gZSmcS8^euE;a;c)xAjjC5#6terev zMjjYqxTX;;W`AtjZ_uvnEpdHG2BWBFZPHh)oHb#(jL1XatUq7(41Q=g&0FA%ie1^Z zfl21iBp|my=0vJ|8$p9iFKG4?mP8V}h|QIB4sIq4hhcNU_<58ho4>Bhd_8ir7z`6} zHi_-pb(xB@Y|KLJ-{1MzX@1c_$i}v?0|H3PP%_;#Ag0c zQ&R(kj$oi`R?T^Ax985sk99c`oGhvt$Km{@^@3b5)mW9Aej?*i+w2OLbj*q4L6zYX zDGDX;fZ$=SC>7*11M zl$%415v9^Nb>#(BY$Fj1L#*q*7J6Q0n!igJ^%uF$i^--cdD`Du#b`h5RCVg1z8wWs zQRuKkq2ZU+$Oz7h(w}i<)@(0!^ivAaz{j)DdQC6!haEFzGhQ>06QPJ2er(S+Wvz5G z|8R10wt9Y=cIrwuPqND1Ebf%^X$Cr&E2#s9?sKdb_Vakc<U z^_)OQD-(CW6$#T7Lo_m8M0r%N2 z7BPQ)wRZ9&XhA%zUhbxr7M?K@`!F|nRHo|xj-_cbu<*aC+CM2HYomN?lyoQpAKRCf ztq%flB*BB;9kCD$e8r*axe@>cozsT8BWr1&>|tTG&HPa9(-LRBn~vAIN5-=IXoFh* zM?D9}h~c3Yv(>TU0ba18pRSL$(Z+oqKJLZ8TYTS4oqb9co(r^?L+as4mOL&KUC7+o zoIuNt);XZ4>fQ4!rdKBcOIAfZO=ZL*$d9x6k6X)TKzwA@&;}WKJjh!7p0WHl5)Q%H zwk;UwyI*1cgupd&(FqwUc;F#aE}R2Zn{O5!@HVy*3xK6!f-EFq}{!vXeASasz;!H5Y$LB)FehGTe9EavOLMe-`FKhuoW9N2++x)K_GzFYzU^~3w#tur(0wl96Xe8$ z9nlDugjGwcDLAO~7&ygyt_B0x@c?h|bDZ5Pt2I{XHkPp43hPvBvDe3_a5EGez; z+-dhRO=|8AK+*mMZ~KJF48d7e@DSDnEKPi#9<35E(Q=xUnfH;v(`((4zfN~8nxX7` zFCZ%D@ek;@Em)V;QtCT9T;G-45*@E^?6r!(@Nk~lG9|p$XN0EL0-_bvEUN<8Y4hQ2o4xU?nkY-B5V1Cx%{$P|7na#To#EM#4?dEgji@$&f zm4?Q{fS`%hKQZ!%2%7qI`iBp5Nq*-RqFa|M?WHNAb&J)&h)a5Us?dm^9bC%8WS($d zpCp`k9;$}_PA@vcoA@?a;X6CHuZd{#aYdhUd~z%;G)Uk&zgVJ+qJWOUD3{Cq&5fLC z4XWnPpZ}B|8fg}>|Ea>@#9$lC+VGs+R-Bj1qs#Tg)7J#bW@4skrjrmZ`OqZ-W&fy3t~>Tz_*FFjC-g|2X%J=CDFH z2_YquZl?!dBgf*1j=`Uq#N&`}+5{h;H5mhgmnb+v!MKCt7dDr&_90`({q>yT+LXoI z^&P%Zvo3n0$r|B8bgiL60xW7ey)_4!m>6rk(cIxy&wIbWu>1Cwl>MmYWJ!WQOz$3V zE7;vBg^}Yi@+WrRZed9{=qQ;tGNN$}I&g1rP=NG!`r*hasYzV(a&o}&O)bzpE>cQT z1&Nm$!#;^V(Q$~|lz_90NkdH0JbEN`KMmM?{)(;x{UXZ_2OaDuw-(;s;$0+P%U)!$b-#|SUZS`hh;iVC?C ze50j6Xw)_4*rRz5sOd*sYL6*m0fLs&=bc**0vl_!_QNX9djx+P*Bq264vphDTCrE(26+(KVGl=B0M;<63g-U>I8Ccmo4n9 zW0J6N0OZBui$<3xK}Y@GLs&i3^BzAe&ERk{<0MhA#eNMjn9O9SJ1H(gAo1FYx>BB^ z=MC|KXu8M>MTe*{{hYdb;DRWa7i8gVaA<~P1p9s@o?8Rle(;J32F@P~SpT|q^~{g# zYZ&TiWs`xXO!Xlq|Jj12e#t_^q;5O!>`56H4?U0q!Yp06+v!UW+Sf!K<2b{uVV?iDiUx62zyiQTLpLyc7s2|im>YtCWb%M({qf9AcYKCi2vROFR;EiA|2U2x4i z#jE3ufF8&KXJQa{I9r27INA;)SZP9fB& zB#m9a7sEp~?bjJt3L9m8jFg+nExjD;C$>eO_--qwATO{cML-RN-u+}+u@56MqCAxj z(lz3y$CQ>=o91t66KBwf%iBdKH4urKNiC!}C5H`>^8y8Cgtv zjmC|B$NRlI*RW#>TLZPE+1=kX?s$ABWP=-pyw*WjivNB5N65hEe|%lJWD!?0gC<2z zD~w#xyWxFTu4`Lgeqitz?Br^61gsDcl3{R2^0G!sj=CG)NO)jWxR)C)jLK>n@t}qm-w#qK=n+Qc94Mi*YbUjQAN|UtdLWTCY~zDKEG;WkVIQ`NM$2o1L0DCk~rkc5rc+vDm`pyD=(T!ia5`VQmLk zfs#Y;=pWvN*WfMJ-u#W7P>uqix{S7FwfjxTPf99H>Lz2B@-%^Y{cz3__j)2g zfO?P1;*_<*ImO?ZC|J>eI4RkA4NNF*ALaIUQnJ;cjLzNhS0DUTQbSa<+`jIx7h#~A z>t>gj^ncTyDBymT=Jl+eU!ECBm*l*}BS?=@iF>r-BGDGXVDi8>MvAtXX!FQ?+qQ44 zi@9>I;=M^&=yAVaX?X!}gF!J^RIvvaF8Mf`BrX($h+57uLv0#WPJ+{a$INIpn+OX( zR@5IDb7Mu=zM^`sg)CBnuwdR7=vJNnp{|8`6@RsCkRW&O%!7E3{ku0+B%7*A-Al${ zwZ!XC!w#5FWE&~B5KppV%5&2xRU*P27_|v9`)YG>7SWR=q88F%iE?f*8zM$XZ+mDL z{_SNJjz{0D$~WkHln}-$g)C_t;<0k=og6t`X;(ZM^JX{!-w9BE>$zNOED{VS^ygSM zl{IYSKOZz2)Do`@O?y9@>$BT70IcNlSVSWtZTiwPe23$?PL2X)vYhZF|H+t9D{ZaNE7|?(O}KXq^F^#e9@HkAYREM@6|WE9Gq)g%;NPZo`1`1 z!dd0!X``)Wn}DaIcu1@!kHdtIjyyo*y0{G6fodpTx+-*^d!gnhOJ$o6@NKsc>Jie; zDExa0coPopGR1hNGD?;j9!NV_?cEXRN{8p;Mh;~3EWiKoiZV|ad&5`Z2JDL+q(Q+P z`RS;0yfsCEGlRu=oP`{1MoQ|}-@heUA#7NpAD)sLL*6V&!Mju@xT(&=rTjLwbG(&) zQS5O-bl85o8c%C(JZPVb$4d7275fTCye!sOvkzJaUxRAi?xcF@3zPw6oh{Xf{8HDZ z^N1%WC6!HK9`HjDL-hlmA3cXT7EwlG&}%}ySb(_12LL))HASVh+FhC2`@xKF3^Kt$ zA4!n#(B9s2T(mi!B%p4cHVe}!IfI%tqy-(IR(~DW zDh}JPh$jTpF-M}(TpHk+>PAGez4H2tXmY`!oGrA_>i#^B8+qWN=$2FY^uq-_CiJKp zdG4j8zHjpN_{*V?Ij{TrDx&uFAmo%)!*EDWNR7i+^}Rk@XgHYrXl9D-ZYjJ`8a)#u zcxhvMPy3i#{<51=Uo4lT$VBXHAp%5eFnTaYDLwo}`^qn9ef*?|&LO;N)Iv0~LOvNBhL z+N#z4#TxrebO?dNn1Ua0SD5Xggz%vKTfG5SUmrq3_5;rk{_i*9kOIxtJ*XvJ`QAg5 z7cq(+Ygo1?VEU@A?Ra6Sz|!2>+H4<9UFnAKkK*@hWv)(5XXJ=b7<{8d_mibb1H(LC zz>oB!+H986Zsg?#B|s%$=#i`8GTmq+B>)o(hZ;=lpN(pOO3@&=tsh-e5{LbSX|P0U zAX)TzSb&mAQG&W@us!6Ah?yX)ta?rBaJVU`oY_UaH9SH^TV<}xdrD%y{eEUF`kdN? zFEIF4fv_!~xH|zJK}S~qCYNXhC~Z-GsR>3ByhF%{x4LMNbkd?E@y(APR5*!~**Mq| zbmns4;tVb{3C&oVB@UUkBO-JDSCj(uW}u_LefgKAv8a`$G#3Yf{07)HpdZ_UU@?i= zLl2yVm13YAm)9l%|M9oWvr$@sBD^mp&B3*8ChfZ;IMzn!neXMf)#%y59u%8)Ox`l;I6UBg`ER+Il=BcN%wYIys4r=V)SUn;Xt z#vB*Iuk1myvt))R#({=q!(c$6s;XN1GauEkHcr^UUuk<{DwnotjlkEo**)B$4xa2aD32{LUC8?iqh8;EM70&oeGJH8Rcv z5SePol`qHjU2D&}g&;Ov5>;Lv!-1W7CVT#L0e~OnkyP3FdvV2&GertxN`!On#g=s_ zZuZDvRdaK5F|l=BhFJs9`06UXA;;+pHG@iQA{|()}w`p z)}4PX(Et$UU;hHgU@6VSq{A&V4;r+mUlgk9V z0pIcLFcR8MwTl|-<;wn(RNfI11leL~+=TVz8Ua&j8xj;Etcf2U$KATD%;b20_{|_aTkiOg)s4O zynQ&^SIV3AIoYM}Z5;EJlk}nz^UMscLQz>9AhJta&>C8<+!*hO>OE7mY5AaW?vn!F z!~K>h0|rOwRlo0_G`T3J7isfbeyYZy;-ckRa_QA%@{#wGiGd<1%FTvi-q0*i)!biR z7C}i?Y!&CvY|V`>MSc-CF6D?MYU$4ooE>hn7<~f3t zLayhGL`|5y<1-mghQ*{$=lP4T;Rp~VfF!UymO;*O6vsxWgWErXx~1h=UJU@SV!UrfAQk4y25mWNe-j!@lcn~3LdvD@uKa24=`N~PrBjkqi-`mn+_|?geS81Csve8FLb|t%0x*VgHP2f zQg1qeZz=n`!Bf}S$^~qwwD`iW(nJXr6V$V(OFEZq_cN5oS69l-ixa4rY|9ouYUf|K zHE24^H&&w5L_|cY+HXcrPJW%W`Zw4QNy>D-Hs_hnPzd{^3sl*DL5B|U{3tO~i3r5Y zU$eY_9tnr0MCJtaTY!k1-@3J>ccm}+So{N-?BBJL4hl+rPA_)b%TvfO3I@4MPZQIA;i=+noalJgTo0W z)nna^^GFe6h^f~%>WCb)=K_mNRi(6X`{`V5C`AC9jhvn=6+^`+HH?m(2&GbndbAlW ztMn*EX1`!VwH0Pcpua3oA?F8gi`u~+Fwrda+civ)QDIEs+q_)~Is_1}3N2>O|64mo zefvgsi7>B92?ouK9|2|{=yli2?ruI}g=((U7AbKp;iKg%7*C@!X<^@_zb$3gj_Xj8&whpjCr`9aVK%f}%44n07_! zYY`Az^_uo*Gkqho28f>;Ou+vtG7?S|4Y2A8e$m;!r$Q<$&*H-I-{%80ZSUXd+jqh+ z`FjNHH}G-#fL9>}Weq(_q`c_n!jy6mq)e}{k#u=b|AzARsug2);xYkM&KaGD_f=3XmtEyX7Iumt;s}PH! z#u0T(nBERSYRH*2>t8hFDdt;BYs$1CXw>xocusdxDfy{hdViUQU{+@?4c2>Y$A%FB zH5W1*cQ%`S-PqS(U_`CuK%dEy@zpqE39TEQXn!?&fr3ds(5vKeqmi6%MxK#wwb29&g;cSU5Jq&kV_eyXbYU1 z(di#M1#CqMfV-%1D*EiFOY8wf-7<92_sK$jWivuQRFYi0{Ql;@)n6bGIU9UKs7OrVQ#bP>&)3pNJKZtd)iKm4MYXXIRB;eS?JM|)Vy$jp?@3s2&_5ks~W%lmj;o;@Q zowoDMKGop+|B@>7z&*(XQ;S})vcht$;{xqrje_AD3bvegFaD+G^?^|)#OQT2-$rd- z-$|O8*7vJ{;gi|_BjT^#ey z)uHdSPpnA^S>~(>1rP_`@`DW znns<;a!@yrI4a?PnC7}k&?&e9NJ#I1#!#K=1mL!Sp93;axj2-Lh#=p!Y;j>9whoI9 z+!-a>ur(GR36&x~Mquv*tY5BeNtGmdfDEq}*a_bO%Q=I#Iu=)a=_ z0{>X;>!FCwY(V?UM=*-wczCkmtjY7Wrf=xr}=eyk{f1MHzey1w1b{UHPY++e%BX!}e zG3%elOTxlPd%}+aiUt#~x#rbP^HXwB=8Pc8k-p&a^9sT@-vu*$pAp0hrk-3dK5%@c zI6gs50$Scn=Evl4iBVS95pw>mj3V0L9jJ z#V~L`GpY#l-4<*mb4gj)V{7eWsX)dC?>0-oCN_NgPfpUOD@q$Fv{qlt=jEv`Z|oaR=wBDlhbbFMp(P)q!9B5nmdp&Q9jR{sP2eq#yC?g8K@Mtnd3Fuq$Dc)n<@ z>~>0^DG5d7fN1ecAdyJ$bZ)rkRrc9sSuQ!f+c&?;M)3xrk%!{c)aCYA-kqSf^NF=+X zqn?)L)G+Wtm7hXJM!vqjzC)qFjS>$-j61RWR#0DGZ?oA+8T@r@h}B$&sS=WIV5!>G zu#U5iye;L?$I;)CI}w5hEeff3C4M)q4sV>vbDp%@aGC1z3BiY367w8 z-(%ZFg0dn3g1rr&u7TEnb5u6Lzd35g?#|PoA*J! zYBW+iLYT5)1jRUozW5s&lN23R*EkXb{awn|#cYH963MHJil)*-#@3cuVuH6n>2v2Hpz)cBK_OM17Pkg-cIYiuwg`&3HR^s0Y0 z=o}G-ZS0R30*s|K@Ep0b1R)-x&VoUtq!pf`=%SzBzKrqF5D*N#)-1L4$z}{}cvjaI z6c_{5j3EdqP{$zz-dKCn06^r9HvvEdeMt+L?*-OabGaBT)z!aCwSkVXZ-ogM#+-p( z0Hxv#rI!wfQvF5`+L8nRAz}ytEj^z0I7nwm61h4URamEpr8gLf4GoRqt-j9Oc=W>* zN-^eL@AJi&ftuRi0|SdnFj}prxR_G(WuR)~>3Ua0WZ$x37T)jX<^J?~48hv<X>(7EgCNsM4Q?j-20BuFKkOPiA3twwzk!1 zOyA;@lgg3$VEzl5dl3P<;Fyh=(pqh;KTS9)pOg&Hbc-2Lnk*WJJR#58Hj z*)Yl&@I3-0CWkAiv71xF=3MmYn8xruip0^xEWXHz-{DbWq`+pCy`Bf@3%}}b+>>K6 z4aalwG<@Qz%!T10m#EutENB+?7t-R$a?#;T{dN$q=d5D8Jj=Ofsr;eYr#!KSjGdjA zk0Ywcdn32~Bm?;!g6^h%EQDDaZY&D0z{BCK7Ih9f%A)i6BEm*gzeI7ohi^X>F;Anr z$bP(bWHCeJ)4a}2d}=t31#Y~@fuQ+g_maWtE4ftg1O+;rOXuRiJiZy5UjiGq7DQ-A z0>6BUCY!H#n8WDjr!r<~L{|VyfrVeTwHfeCWGEW|w=C`q2_qxYSdSSTI%a=oDwE#fQDoau7|1vk{t?%Z1mxda?IJl3V@s8SY_J3P7=UxMtN>Bt$fx zlu>ea{~AogkruGpyCMSLO9CNaUU8Ab=Wp07dAGMG=|5V1+6J}E4nS`^DVjUGkNjh6 z_UlN8O^U!Zx47Kdz25WSQ;&^QlY$;^PdLxqnv~iwbkKdkK7xtTMj&cGB+|j&WG!&a zXp%fH>nz0E(v+#!kl5MarWjRy`BDpu-0- zhOf;0*gpsM@*2EOnYbY+Xf6w;Sv5ld6;+fB=H2bn)(&?rxi^r`=ox#hg1Bov>Y8$aZg)W>HaPe z&(F_VN4-3k?JRT?wWvkmC9{P@%14`B0&yyVe|0?0fwA8JW+@uzJ;v2gg4z(vE~}85 z0IB6GEhMjeh5{SD^FB*H7KAhCoXF%`m4L%EX@vkK;gUzg-;U3VZS}J4TWNP=F^-+T zKUS$WkV&LHo-0DE_>qJR_UBqZo%{pbHsRxlq_lcZc98Y<=H@E`9u@{UB)d`470K|k z<}OMxe_=N?rG8bivwa8C=aj{)T;A#)zmB*Mo+vo`A=;X_v~%R0U%c^% zO!1&~OTqIH;j0n@Q^t1#cOlf{eo|(*7E-(UFY<=&HL^=Y|HX3K1AU*q-BDh#RAM3c zAX`g5ZI*l3Y+hD=JhnbQB&L`8CczbD>sXe?m86E6!Jd-cAGCIa$4f$X(fhiEnsJyE z7DmZOIpka;uEq=XMM+mm{$%rdfBw^fYg`MNN89d(*Ac_jH@iID>=mQ^IXPw8_0~@} zrq|MIJN9p>=&~0P4~v~;$ZCs%B|>eb@Dbh^sLgQyFaqJIdRBy4y?|`a_6sI znLJKmBSAB%2x?jJ$gfuxe`B1Fzl_6gUl12m;T84A`*92y#I#v(3h?Xq2L2;-0B#}z zVZs$B=S$$O+icr|HjBDWEHwh~Kz)F^Qah2O($Egc$xHwt8c;U#eeVIjAy8+n%jc89 z`xL>s`%&CZuy6{E9rk1#|9h8AHt--_6wvmhWc}?gK z>8XBLOl*(&P_V&xDduBRDrDJlg1;#0=Y*t%{p}RzuwzI7Hm)?z#l6`nv{3K#67)q{ zwid@T`PmMp0Xod$f8&t?^42l7Kt`cXVbJ^a^JbH0CTvMe;-}M?AxHadod!dP?dPE> z!iZ-2$s))6XwG)7LGMC>*AaCnrBR1}59$HptbC5n$%OJy;AGsk!&tlm?^%0lJBJa01n`(2NL3#0vUyE6^epo(r&rE*B0yTCW zLX7|hAfY^|I1GfB-J3Kj!_u0Z%6Uq%!Vj$CWVuV3rc`+~7-|;V%Yw}hpz|SX=z4c( zdobUQH&D_YfTX7|Blr^Vdp_CtyrxYe3T5#WK`}<`K9ERIbGovVIOVixTu&rs(r3w6 zFCh_?R<@o{i|2zD0KJ(5C$)T(U)d)6E6wNAVh@YN5deOHb6(GsJBM&j~ zkW?0v8x?BBwe!WsL+g_YHx&cK~wG|BrNaKHi?6CI`W%l1y;8ZJe(5=!nh zfwkD5Q8%+o+uoi{`kwVvU4l*>`;64|8L4!GV~MyaGEvt_la3N$cHJk&>tmEmOKKV# zBN|iyk?o)E1%k|o9}eA};$boR_s#RGL7Ug>f}O=z-;kxQeYlSvxkE_AiG~!Bh+2Fl zyTUcKMefH0_x22%lbk=@4$X^}qiRa-aCwf@+INCuUe_xK^bGTKG2^?|Fgq&5<6GfL z<%81^a`9@8l^GF(8#giWN)t=qZr8G>TrC5|gg}{UJ=A2(K|L-X3uX;jiNBoNK`k{MT`G)TIB1H z5u-Nn)|P-^t(nS7OG=(!IZ@W@o++A%dVLohUC&X8OaMjyqLAE;WH*c=b9iKAW_G%b zd(9Ic_BOQWkGN0oh4~w}sJMv{jMQaOzGlM3qpy|N`F`=i|Ho}tFtO?%A0H=p+k!m8<|W9D znZ;MIkh^jSLv&$d{~-@@K>94Y%oaI2zlcPTISgL}T&lq+8XY+&8D|1Cgf4g!8%_vf z(D0uz>S#EVT`u}J$_QMkhJ$iO;^xO@oi@Bs0C$5R}Ko8k3VbfH_`^DC{{=8@K)0}=TP)c&ksB$ZU zO^*%mLEgdx9zHm%gyUYSZn{WrM7DX#*bqDL@erTQL3qAf50c=Y(ozio=SJ_Uaf-IQ z9>~uLo!h=QSG!u8&II|NU;!XB=f$@ zxOB*v>M}1E18P|fSSm###7Mv5*5qz3_Z0wXuthCPkdYO2Q&A-OW|l%zGGFg8{0j+h z3WQocj6WzXvxVx5l?t^8QH#!uS(8{6U`}fRzR9Pj>6jW}9yqlVV^> z1%YE{ZQ|e(3LAmNFl^h6Pu5oCEZ4HTi0luM;?v^v%4YqvJ@8ffUQ<$eGJkQea(Me1 zmAv9JP75gx9r1fc@V0u`43axXj+JyejJMSg{o{P?IkoW>zHB=UMCz<|sA-Ebc#q9?tjj)7y{Y~*-p z=Rlv*>L~f6yzRk#<8zbF;{pT&4eFc3pIDn$`Z@kZ1Xq)VqG{RzrZt1B|25s7`R!rHtErR7#~oE zb}O;i*L^L($O8BVeKeCyaYwf4c$QFu?*jsr8=v7zFa~kC-wexVL5YU_*uB?{08l1S zI{ht;*tthOi=PkZFHtq5C-lKWiK%fH)p>dB`m}P`jXd^H+e*}r&iKA3tX86Iz|i@$ zLsQk>YZ6s42wbo>$&ZKcR03ybX8{B|*3fg!a=7Kf(%so=(`6_!Nwp~qCac9v-tql(RMR|O%!y!eb&Qp zurm;G?a;lTNh{rtmAVzQnd?7Ba}8^pNin{kSB*eLwix8KAHAp;5JsWLjT1x}3j!yX zo>NOKVvGXCgvExVCl$59My)yPRA1Rpl4-HBvbHocqvJ|>slJf}5z=*hayAKNYqV;r z_HlE$+(&LV${v9{6D~reHDlu75H#n(p`uHvckhILn1ZJWme)^RstNXMXOW`p4flFJ zDbvZrQX87x%G?>6fk{)bM@jalpdB)gWdrKp|FhE&1L^_8=HKfi1aPq$o3UlUR(8cn zMOR)3dZdR3h3JHkS1HZUdPoqzG~mzx+33V0ODOag*yU?`gaG!We0=hJYWXF}koyf##ykaL`?Q5R&h!Q;d8`S#Ik zWpTE{p#B;37;2N*p@HDdWK#Fyr8us+dE&EYX`1m`+Y}+85a;C(gji7-S4LW00oi^c zHkjswmoboLeD9TU>P<;Yt6Vv+9OZ;;0QI!Z$kVDpK|yYAZhBjc)7mcU_j_>)sUgL= zFT#n)W|gtV5#No%2Yx9Xi$DRW`p5x>sF;{6cB@oGYzA2;0x+j2t3g%eaE5lq{MJbs zxFXrk_Xo{Md%VPuDn@xm+xx}vPWzqy)OYsNJQ2f^=$gD`ed%$ee5l){W#iV0dY`CT zX4_n38rq>mESwOB?{vh$0`+#5ucb~lA0tcMRXLMcE0-WZN~drutR?r$U_g3ah3#|< z#uo{B1!hng4Yx}LBcSiKPCKcPhDy9DH90jk+zCb&gejOn;tkDx0gtKq zzq9Cy87%tJ#(mk=2fMSe*6!Tnm3s28&T9mAOvmf{=jzQ|Tc(b1UO16e?2DE;dpVXB zSMEH|-OBMgvUXo1Wq!bUV8(g z;5bpRGLjgAAAR00w4~|eY@~r;!oON*_c4On+UtPhgKjx2iOd$|`x5uNCOxeq2beMI zF9T24|3}j~M(5deTeyvy#%k2qY#Q6PZ99!^+i9#Pwr$&L)EJFzoICF~&fkvFKiSW{ z_gZtUdCgE%QCl{}`_t7Bt@wHddiu-Og`i9nfEeX$NWz91$BaRyZc}GJYZQF{1=sP`^i~}I99k|+@Z@Pa~{JJX{D>VM^8;{af+?b zR(iAEbR=~!`wsq2b4w}hY3q7VaL)00I`cUPC&DKpi0zVBGLgH(Xb@w_4}!X6BY9=> zS70{)kf0;6p}(}P;-{aJV6YhpEGkmlK+?k4RF#LCLdK?8_t)b*NJnR6eK*g{0)$4_ z>QYV>{2?@(W*>9~PkGKDD-5vV#KD_PP;pz=l9aC1nI`s4WVh5EJRuDYoQK0~3HQkM zipHB1efn1-?djMsz!nMM0~y*%eLf2zYX=bS=H1;;IXd6ohC>TGMh(paEL^0H*sBQN zNw+84^S>QH&_v%p&v!B550E~PfOL0KH&uEVDv1K7EghcHghRtGA5KgI&?V=2!7eU< zr$^AE&3p)E+|k{=^=$$j-5ttryOxYa&ICr5wp#KIrlO((Sg9?j*lcXGT4s20oRuJS z&@mAEwEvTAbV4tr?Vk;%ekerx!a^NQ@VQ2_4T8wLYSQBGWCB68?+QNO)4y9%kHVsj z5y3Jd!hm71cyCR3L9y5NG6zyk7T5{H_LZn)u6HGM{FV&wpu@^r>HS4#0vHAKgN>60 z12G{dy*aIu!diZ17BUnwCL7Vw5B&RL+Ui(Z5&b!Tj5ObQa%9BLq7YQ`ze~gpqF<(F z$%bGSm!1bsqhBh`*|P!2mZ<)ZsA?n6xMG9_bHR9J~Crn zpLeNA(n%BQX3Z^UF^kZw`}vAVwq9_}Nq?36%NvqROK+Zz4I~UJ^=&-bHcP5E zzcWbdNG20C#DGZg(MaL_pHYdc00($8dx9MXG98*piIov|4V!G0TFlj=?MFkx&i*$y_Z1#M?@5c^a;CedD1JXLni+%iLP#1|3VhvdwkO)zrmk`&$ zDm(5pjEoI$H*4OWmbz*|hG6j_ekOCnA>x7r<$G1$w`Jo}b8%opgYcm$AFaI^fA+(j zVztk^_sgT0Lw8~1^<-Knd`PuU7~h+l8+*d4Ch~$-iJ9(Kc@8XC>V^z9JJ4p|I6o7_ z_s#f$l%IL1iI@}o5q`xXzaN{Am@f{)4;xG66$CYEA1;J$$!uCzmS?=}4_aqm`e>tW zostg9CNb(8{`6oEk`y`(EoOVWY1Quh0t-fhRPOtBn(6xHXI(FDWp5(jj$ZKFGaYJ zv9(PivfPkc<*wYf>bl^twfo+C9WTdQ0Qc4M1^h-(Lj|lC69Ie9^kLrn!ea-m9&IZ! z2s3yd-tM%`qk=iZd!SmF*O4AFXhu|OqJ{-jd=CdklZ_J`;UsUSvLsTG8zCwX?FNOH z92FlI$N%h4{f(9Z*m|D$SWloP+TI37rLiJ8h_Bmi* z(2slrRhFyAB2W)VtJ5)<3GYIV;0~2oC;F5;k;&;Iu^$u|sO7wD?46w<-gGaJ9sDhW zbq4PzT~iaz?wYt|3tPv`%uE0jynU^#k2QiQy+{~+kKc%W97+pY_?u#-_#$&Rn&* zz34O>Rm8V^Dax8ziLt7U%Ji!9N+qojzcG(^N_sEXuq_hb?Y?i{mbi3%13K%2LF6|<=|={)*3*h%nIvp!iytyFLeUVgSgq_T6<2S5G@F}2M!Tpq3@bL@ zX3>|1uqEzxu#%93(Q2qqYC0H|xxSGg_zbk*QFyMvXxl>q&|n%dSMv<}Q0ENeXlb~q zdmhdFLZu$^cz?LQbx!5a+fX5CyYHl=<7MQ52!1^N0K4s%q#=_}&TsQayjB_cz=5a!k6BYYuZEk{HH2_rIoiAH(NugYhalLqnA9qUK|c7 zLO`|d$dsi#XdevQaS=&YEdpv)(pGup7n@)%ylVZ{pwmbGTnr zrHbw~Gh3>-$}{bPi?PS*8r!3S{p!GF-xtLAg>&Vbc%4013W{W&AF8;5V3f=9f<>$5 zaJ8zI>eRf`>que>k9`>BH6_th`*Gosf0k{i989jC($MDMCeyyZj4;OkR9e;#qV>U< zCV(D1sPe44>+sr#5EN26^rF)NxSwxt8@sqnYAkkdIX70!?^&%9!qdTG_=w)G3z}{D z&-CxlhE6GMV-8c{nZ$&{ByY>hVhK;c_JIp;-EM=Zs-mgTO6?Ts2(PQzU!?m;nJ*}{ zsz_$$HhIVlhTFKh-fdIfU3&fQ=3zTG3JB`YR*1OSq&sTy=i_fpo7_Z9{{&x2!G7UF z0ti@WCRMfKlM)ydKU9yLitJucHGp$)f&-Ty}c%Pc=@kpn|LLL1jPGnvEgI z7AG2~f;;txdK1TDslQAOl#^N4_~p&{WxifG$Z%O@>qGcj8U z0asyZSeh=mEe3`^FbJ)N?d5;|DK79A(oR&$c*z-XxypEbxyoeME;QGw;X+PKnF|d^ z_%LVSe?$UgHM>dQ(ysDwwjWJs&u{p{!@XBO>oi+*50A6H*H@O-uZl`M1qNbOcDRVh zj$FN`AEEty-IC|o|G{VKq_?`ft+>ufmIDPqxBPWbYB7*gT$giz(d@=+cGQJ%o{4W@ z+sPpP&c60Gxam;wxzhLZv(P=D+leUBY(__B@EI{` zB7Z`f6fZxt&uwje0xr><%+0ADw`z8FbV)LjTSma2FvPLj-j7KN0K02|8ap>HFTm*o zF7%dWS*b4^5(Lcq14O(6n?5@U?X(JGGdADM;IK3S>2;$?)a0^RDDK`_~-RQXPq;0Ar-B^TW_4A+O2;F<5W{Ye9c&r1q z!$$LpyNDKi`6#K6dV4NB=1)FN&i^cD&=4<3z-8NVS!lrOHZ=&y0+~FGb(oKRv~8WPb0h%H6@Fl7IuJ~; zWNMIo-wn~}s5}&U1YAYOrD*`a1TK4)j#AKd*|L8sWFfX9Rs+96l8(Oh?9j@E^H}7w zUGBJ@-qzMuy@Q;W%bK02Wf{)iJ~{7WSUMLiFp=`u@Vc+iXpk^S+TPwqxIg|)C81%O(pcLyX}Y!Hx1B^56mf6suTg*txszDfl@|s zqb8FXSg6Dvpu-Js{ajNdGcyau#uRjk2kDTZV9CKCOS)5XA|fz;NAsvyN-%lCtBpd* zj{ZXe=P_hLhMM`=Tvy75Ho6dOlG{mPhHAsru0##uZUUUrS%;8<+wUkSqrAnrTlP#r za^zs&HR{o9OzX3#XC+zoA_mAyCUeBE&1bZ9-WL-#`{ZJDk20xs&sps?+$ZH6m^Ug$ zq@uYz3(@a%i1?EOQ;S=!L7)(vUG@O&MZ0oR~yy!aUdYFrh(WqDU%{|6Ilqxq2+vrG^+NPIb9?m~7G$QWZ4nZDTzQpx?^>`+jbba+Ds5wN_DzTYnXyWERbTu-^@xF zg%01ab&*r=0C5}|9*^j|x?rl9fMX2XmhtCUD6$+7=@@u{ z!ecjJ%?C3AU;+aUmi$CaN3%7_2x+j^+HX2n7KzSsLiT(+JLw4{i4Ja zRIJIv7}z9cX`8>aF}u-O>HxTg*u`~n*qq9`_&^0ZcStGCtgD~i7D3TwaIiJlLeZTi z5-&40p4los97|Z#1s(VCH&r4A-ZiTP%|Ly(9q z3rZFL3qaZFx;fmEmfh6%fXg68OH8p&2@D1*VWdwVm9Q}@mbgo|)#_5 z@gF265XI6XHT`%<=%Fe`syWK!y3tByvwVApK9&_zsgh@;8qy?|f zz)dOl_2|~+$ToD*q)p6Eayeu(fW9z5GHmK}3ob4yT4WXZrh;2*U5auIimj)RhloA^ zvR`v6dO}Fa+p_TZU@DEre$S}+SWN@*9I`1tw}81bHhu4Mabseml!SzV;2&yWea!3= zU;a6WN9|(n3AoXfaavBWk(Y;ydHm^TLBh*i9;q|Mn<=!7Fl(bW5>mIQxxY1(8w#2a zaUo*aE`Wfx**`gtrc+s`xSajPt)jq*z1c`fJI-vS>vTMLiHF!8npsvD1_2==G+bOtasuxJe>sWbaekICArYZxzg8r-$DXeXLG-@upZ&5Q zL3s1h>(F>FZ+e}AoPi0C5lea*HGz_0bcEeknQrClK9uYxFF)d;{84==KJw(&=(ySpSzPi7C|zJKhvt7^R_aEtwU2rn*dcy z=JXt)9ih|q(i+usz)HV}ulpR?tUS)8GlIP>9i}w&eSIKVL~IPLsg-#U=q;Df))$sOWS$kt4I5WnfheGGIlW zWy;J>(za%D#Q_LGegV0aCgIZPzRhq#lWyG#n0i}GoBP!P<+!VhgHefu(*x58OG zc+#5er;eH|>9Pdt*_iioa!&LU=sIp)W-cpvOF=A^WmSMB(NI?BtGt=9z?F@C(Nk3Q z>|2|~0%!5!bf+Z~aWdh2G~5P(7JsM6;0oKLKJ?e~lb`Gt>>r9|o#DYK>tVS&B93%K z2AofAZ{LP((#7u`3(t;}qa4D4 z_IzRlgd~Bn-JuzEpT8Sk)X_sde{THBqG#o*2R_K6XV^^=2T3F*0zsN6Kgq5&y_ey< z;ghB)D}8=;ax#8$c4AZUxOO`6Dv56+JFZ&;u)8_o(C3mwU?&EcMD~zu`;3yO~JuiJf52K>V#)_%o%R}?_cw4 z>(69)-P=l~){pz0&n6Hj@pwwIRjspLtgFkvV#x2 zv_U_?zIFf`3th`ei;~4b7l6k71WyqorLDKK>7JD0%4NZ;tS?n)KC7TGzCkAe&@Q&| z-ycLdcrY1U+h?$;uK*b|nlLaJFzBlfbMykAK9Dv2c<%H541({yhfRgV`uxhKO_|Z5 z05!g4-25Bn2R@+`GV{z9RGpi?P)=c|bYxa$E?zoPQZB|Kt*7DTS{Ekv(rNJOM4M0R zZLNon)R>YiH}=tSzDP+J71lo-iOANcmL0AAPkCATehhh^qf%1xI~U~CMZZE9Eo67v z8y&beiu z#C$rRbRELcQWX}r7PdQ`>0`Ft^=DPP>>Q1MO?vXyQ(Eel=O&xN;;~ztF4sEG8lHYB z(%cyAs$X)t&vF}O|J-ie*dXrnfP0UTJULm`ZuHm0b!7`htABruYsB(^oDk0lgrv{{$X{Oi1GJuD|| zX%)A+y2}4oPFb-?<`oE6dz=8 z2a_nI1oDA~zc8s|UBVWSfZ6+#)%J2VCM>UexZcKU&BwiK#yy4$U0;%)hrt(L*REur zq=@{d-K}o;C^TPh=}RtFIpn=PT@ZFi3{`Hdt; zC)y$dvx?~4etfc)g)wy`FMGZXh*xRcsk%gAw1qYqXva|XyaD~pYrWZAnR>5t?y;P! zY_*)Pj}YoWDn7shBPYr-Rlf9wxbCluI?R0JepUn*q9g1Uwpt*6M;C?`Bl#VdhtcbP z-&$qvF)TKymODwgMyW20o`Pem<{z_^Ahd+;3Ge&rQE=bUn<@f6pG(J~cKv?}A$v zn^%^Y`ResDy>xtMD?Mm74ubaP0VVy|7QWHH{0eG3vEh-9ik+21pyh$t}6CX zst{`x?ulxiFp35``VI!h%E}7>2nB6ybC$zlUy3Xs(=|K8NYN|di1fEUJ}KF&Ikeee zrSk$w0IuZyFUCK!sS_yujkO6Ua|~*QG2UsrvtYtRgyOe$Qc_CBRqiaFw?Fp!=2>j+ zRjXbpn{r&bwyu`*NaA^|c9PG%UzT)RR_19VcIzW^QB9+GpIb93xs|PjR<73#aBfMz z*$oGZM#Qfv=_ ziAf{?${cm#AHYin=dv9PWB_+V3w;Np2QIberQW3_8?DBw#@XQHtRLL9vKiAZ{gkgF z(r4L8MR*KXx78;bI(I%zU6S12y9?GYj#GGG-{ zx>t8|S+^jQvDp}IO8QcVsiy%@4N*M{v(?Mf>x3k4mir^FPUbj^*K6l|fn=4R0z56= zN@MVLjATbh^!aQZuQe*Jy}O2jjfuUJ*O#tPErS{Q63n!q(ZJ=V-g-oyIbN;1)Jwc1Io~J5rmh1*CbJwH|5DQGq8H{{BIL+7bhfhP?8L<2 zu-o@Tr`M$sgKYt31~JhtAn8zuo|t&2W(cnhxQ&IQi1Z$fqEYgmcci8F?{UpGg+^F# zJTh3UvB7wIxrJMeKol?9iJb=-4$*d`Ktg&^R0TwMzB@?KW^PqFS~gm#k(1-s?{oDE ztri7{EkEA96naC?rakINK5}6GTq>zzl2(umA6{~^P58}RQnn@MP$&$g?a6P6ghB7# zWn=vPxJqcF5xoPSerCKzz;o?#(-60%q~e4|)2N3Dx@CUij7?(292-)hnuVE{m^4IT+4y>)aJFl$d^4{N*MBwLu(7@eDF z1ah5~mldQHQ#zlg70MYDe2aS(Zrq7hdwg1@_wME(n%wj?HS+*;2=}j5QQ+JC09+IrE5eY9iaG6k%al@j-{%+}cUSRTiksS!-Bc%v2J)_mRi2$Z}m%`9RA zCstq@0PL056$sxt-dLIBfB4%#SOOB*Q+p~pI-RaH`$$a)QRKm)+C8#A=d`0ts zF~WMQQ+V#M620LdoMvM+vEIHFh#BJOJ2WYJeRtUB*W6#`^El1?VjN+JeUZmh5=__5 zI=z@tZf~$h)Y(*z=ig4y8~+$Ypu95{bh&bTZA$xo+(`2nT6)ZCF#9Ld0$O^I&C+H@d_6t?6AwmzDt$C zSPVU-6^j1yyuQdnU=2ksLO*>vvz@z?S^>)D&bPme0UR9ErVyB)9iW@PlA@b#Q1uPR zRPzTEbcZcJer}FeQc>vyg#7S41$lYocArC?V1Dou3lYkiT)`0k;_Ff@h$&g`D^y!U zy7miy?SHjqAR0J#0K?*n@cJQ0POxs|---}%&)x}~Emow*N_&J6Uc3TAS0Em=oX5?f zyhgwfTrL>~t;Wr)B%QjQvU;OcsvM`=)owmX9-R!JS!F@v7n$)PQ}V`Xi&Gf!6KvYd ztp`fLY?jeF)*?wjT)2LO>~0_6W~CW4ktUj4sKtfy(TZ9_6i z?4y_%%TuJJJHl1GEFq810v(jUZ)}#5{!pU!X?BO}`@(%!TKuA0j?r=LV|@fsk?Dbl z3KjD+%MVWXYU0YY2PwAuXMt!Qe&Dn1fy=-g3=+9nXK)fBX)o0niRXm?%u!8l4k6@+ z00G#}EM~6r2|Tij5iF7qjY!YYlsv5vAtc}Ux@opvQ`=)74s)hsD%J)G#(fX%ZlaDm zbYs;=o$I|I2~8x{n%CzES&Sr zfIKGq3nG_%-$!xA_T{ttwz`#L8Y7+9GjeURTJop634WTd5>U|wY(!rS#@9}0?)-DUL)+HE*4G%g;<0l@9^rh#CpVeg=i?BXozqoX7LM5IZF za_F*|Ta*adt?5yju54Y;9+{?;QwKOOCjekN(KtZ)%IMc3A^f_`y0kP6 zwXDs2fMGcrGw$&;`FqfP#pF*Sdp)KdLllMB-i1tHs|(~m>Dj@r3fSY8yMo5$(i`ov zUvRl!70{A9@3pMmE;qlLBBX9!7gOA#fWHO{=?apKbG?Rhc3UwoD%1JA|4Q$C?)$2aqT+cYs}WGuontp=E}b|6>6V%6LS9j^ zr|qt;V3b?;BAvG(0BaGj1ejrE_@)fgCLh_8r21-AbNg+z5XrSZs#I`*oi##~w?|mDM%i-Q~7fA+XisZ@_=-BjK@{KFqp692-5onP%l~O=K$? zjMFh#5IydC)Jr(PVRV=~dl(C{O}cLHX9gbgO$dm?mDL5C)o?K#3-uHW(h<_&>_lHr zH%eGY)O-+R9@rTbWO=Ls%3q)N*9#MXRefIk*X6IA)t)|9sVfe8=CpxW2f zQN&a9C)5N*k*VgBzOI*c$8&V0GqsjaZ#sQm(`8J&%f|QZv8vNw@Jzx>Z_3yHExpvX zyG=zThX=m)9zzk6*uJ{PfTAr&Kz~-sC1sgvo39mOvHfw`pCpxrGIC38wEFeg!g8w2aJNH;t5^a9-k^*#=4NwS&^!4HGUR4|&)=i6gh zKnAWqie`uVEpZGNk#N21?SkrgbKcHHRT3hDJ*6d~@W{WS>@($ba#E-+jw;$$mHqww z*#j8Qq>Ud6;N1;|A!I32z~r#1{)6Cy>~J+J$%&xl;SGQaP&dQI%|em3-4-mP94#ZC zQ(pmY@Lj1Kh_|CLY(k=`GFc7BBaHo_ru)$Vsk;~Qi>I19N4B&51-wI+IsC*CzW+Fr zleXcE!le|Idp@YsUJkaN-$aKM&86b?h!;_-<8Wb!golQ>={S{jO>|YXP^vKrch`!) zoB@$qUZ8~c8Yb$7Bp`mDbBTtipcz$`y{Pphwl{?G){@6#;naSHMWE0ROL2}762FkC zd+b|QUxrPGkVl}bR?~$v#N*oQIx9#4`fHfDIAvy~JV*g~Q-^F}_uE~P1*rVb9vkW6 znf(&()H#x|L*&Z8z%xl}7=fa+FFfVHHYU%Re>*vHn^|P7h5hd(7bF1QOr#A8TRk_( zOw(o)E&Bbtp($`eqhxp{7a8jU?Bul{ujsc-%=MnPXHc@FtlU2>yP>6#P^MV4`ab$- zVPE&Kmer1`sVEK1z}ru1t);ab`h3p)3I_ACl2W3`cpfM8Cw2tZe*i5r06K)}hyeR# zkIu*KW=6E&$LDVa`Nld9Hb6pmZgaDmLL0!UD;d;7=11rW4;v&y*US2=dVz!r1N28g z{x2*m!&mBp&y7OJx^}>V72xqJKLiouu-Woy4Mh23WKtYKAMP<*5VcwXA&f>)z#B~%rb7(Cd zis}b_+|1hcO3u}#(YOPLrvaR)imgyS(GLV+5H_!m`uqCMITxL>8Sd9<}S zPV47l=U_P}K~TLwK>71_1l??!uh9ss#XJSwzcmaRwat>bhJ++XGZAEnn)POJ z&HesRpS2|-JNlW_*h{KiFAcVi!-TwU%w6JBts?S}i>>84`fE?~`ukRjYVvbFSS0<q!wuKZX4XV_hC(TCC~Upd2MLcF%Yg$IC(ZY?$;9A*M4NtZa0!@5QfD-ft?)3MrSm^n@>?*co3Y$(Bvj z2U&wl{+C4Q zF+4gHs)AM;luDA}Fm_I!`7Wrje8~8l*!o+Ky>qYx(xOMkVS}{+&l&d2`DdbGP^yIudoj$tk*QIufbU1F0Q?l>3T~(u}h4!vnpCX3<0seCy^!!qB+1?G!^?@Mw zB9sXH^sgo#O-gIIX>y`~RswXQ%pjte@2qEl#@=Gup#ZJ|$CRYjmxD6&^rK}LWr{?z zlPT04n+;D%(Z05oIH&%z`TX?e>lBQFv-MiDd@;ihIf-$=>pL}UC1$+q;>Z@*Q*jC` zq!px&Ps7r0II7hE-zn@wQc_aa+ijKbOxXn> zpoVyH6^*5}iuTq&Wj6jS$2+G)8BMPHsfdF&$SuJnCJ)z|DoS3kqq9{vI?wCH>`Mx6jd3dskD zealXa;D8?!C>QymU47PFV*RYbc_E4s(N`7|S$CbC&<~WRIq#3!ik{QI=zgdMLxi7( z6!jI!MmTAyCcd6pmm)^7!%I|UZs6vwKO=+<@7@86oOyM=k=A>_q)W%g0qaalZva>_ zX)zu{FW{UtAiT%)$H}rErHmKI+y>g<0cD!-K$^h&zaFx~NJzz^NEsJFPs>x@cN_1c z>_5#ssu&9TrGWkF#hf!U+ZdgWNGQ_I{WQx>YN#e!YPAf;ZlYH>$sprA)2nwtCO6;%`E=gMF@~9FK1w@f{Ki7=iu`=rt5tEH?z@* zU1mv=hG#%hh7F3g9UACPbhs8SG?Qj=f|pqExc!leNz6T9uJUbze(w`DKBCbo%mf~p zt8Oq`tPGHG*kjB=hpHl&<&3NF!IZ@NazL##cPQ_HxLTTm(_oG)7oG#{j?vo}_a~Ig z3TnK2c=7Y|0vxC~tGU^QU;VA#@2*d5xKUA1G}Ez<%En415PsvYINfX_tiZBwDa_R! zm2qt7+m@VPgnePDl3VE(cqoqIzJ^&59@ZO>Nnx|xQ9Y+(*6Rgkf#C1CDJdD-&JA-E z(ce2g4}f7HpAORu_jce7lapq7343H>3OGXf7+Ul-7DI^Uq1iPOC$cE*{mF8``3Vr% zj!ch7ogDi7R@?KR)Sn{Q{n^KH0&B7(nmAUlydaX>wM%zKrR=2`Jz@_Os&Tj}7o#NLtNi`L(UB z9I@QcD2Gi|W(31{^R6P&5W2UMoado~NF<{N5p#M0nKUjSsOngCL7b(@bJSH;=(7PloNnaY32``Pb`vsVnSCF+FJ4e6Pk_v z6COZtSqP<04RS#Hg<~fPQw+17$DFZ~{#zHMa&IhRwn2GUnXh^|%uY}CBng)%hcMq@ z5wigI-S}42>D)^4CHm9+!><)JRZ46>1(aGMG4?(=t?Nfih3}aLdvP77))s}?d-yM2 zJrRhWcQ3y>UH4{w@p^uaHb%jRQZ}4y_xzLS5G3OoDc$iB{Q$9mYjLUR^L9b!!m_Xw z%A&;fxOQG-yg!XC40SE~_*1Eu)aKlsjvkTgnWKe_y8$(IU**=XW?AoDM(=HH*otMi zjN{Zr#bmhMc}v3I_lB7Go48;|=&(|Sn!hp}XE^(AVKvsr2ml)*1qBv_27 zQcZ(@+KnWCLZpp#L!k~njPRA&Zq508vjD&(#FSrw#W-AE?-zhF>jp@Q{>Va$O~}L| zYfekrOwc6z55VTRyLOY$qEE-VoKfGMjrf2_d&pU#6vAXC&jD6 zm&!F&7qjL)MX!j*fRHlF>|r+HOQqOj7aPKPPXV zZ@cwlrRE~~WAV5o9YY4~FHlkeFlOfAmi0ClKv+tdwTc%gI2_@@KDa=GXM#*Ktrx5c zkVpble8K#FzyT1qNbFDKk3Wk&oWj5mEAH))&icz6NQlDsx{N-%ajxl4IRlrD~X^To0iKSMjGXPb#L?XHwOQDfY*56iSzmQ25DS(n1YK& zV8BX0J8QPXSRc{_Ehg`CS{bmK`^fv+b@m#Pw+tLU)j#&yu>zlpU~if^b1-u^19Y6n&S%LxLU ze1^v7aw`a@|rEE^~1LYD)iAm&}#yxjM0lCKP31E=9x*Dlr^rXD3i$dJXR zzgjyIbTMF3&J51ANNdev0IJ0nHPn+W;CBa+zT5%T!}z$=MKnM%YWDcR1Z*3sFSkP|(83>(9j)T(^PC4kWI*36c z0B6dW8OrxB#`Wn&Sw66EO}Kkrlim@et*7%I(^HIQN8*{>j@C7%U95G37!YB87=l>Q%?mTKy^60GAe~ zlV`80Mm(%}^l57Sx`>dr@5zI9P z_N{6K{fk~5>0pevy~yGt78Vfh;<`}pB-=&DO>nadKu4WsaW}p%Ty-@3CmzZRGWdMm zg%dS5;E)4Y%ZU35_kQFk)X!T3;UA*}aBKZxs7|*Q0@2h#=goFI!SLS;(Q;9v74>Y| z-I?{PaL$a2fTL_!(xGmJ{p`2`Octrbk@Q$*i)OI97;gRQYH>H}Ol7MLpdm}D4KDUt zflUt}G_Mv$$C&qVL{`Uj3$hA6QG$kY!*wU>qg!v}@BE<0peA?$&jnW%74yQvf^CbS z02^D)qXlZx?b#iAregi&$api`VPgO+hD|1$_~xy-OKgi(_zrS$rR6sk=aJLMbrOqS zQaKxNmVDDaX1oJLw1iDWru!NE@#eQILexpPcewEt&jcz!kx7}@N;s%Im1%ZM6ptzz<-jXVX zaoQ8=qwCiD@AS7|7s}AZDRG(Ea}}n}OIe3Mun(a-f+IVg-c*x2pO^YL7r))%v%DU) zIbl;LUsxh`!oNRSW3|9TkS@-HI$u|~aDiIEn~gF3^s-XsDOybU+^bndn9ms&c4a3Y z!Cbi)23iy@NiklGJQ$+J7Pqc6@foNAfkA^S!~;(F&aXIL@ET+(^_tp%%rBiUw>!uG z6_AI7a*DZj$s?191Zmm%_lL;R+h^?p%q8*jvtr1r)Ei!Tx&4C~EYo75MGbzc=xXTt z-+I5!`UZmj=6u?qVIyC6oRbE52@3W-9%Lh8i_E*i6lFT66$?QRQCBu^562M~e?&gK zUuVCEN+R(sOcQDJGQ%gLROB=Cewqal1-O04H$ulfm4qmUd_UZCUWKMviWyEx3sYtQ zAR)jHCFcGEJTZPZVjKrV{5k$d0YytmsyfRJmZ}`E!+@OW{je1R;B(9RkodsGMu7!T zEpisJUKyf?{Cuvbh>A4b?{1wVzrE>=thE}0KXnd7MPpW(toD=n0? z^k?jlF8(dlfJ`LMdJmW})uQTwcgdd0dY>?*ThsL(9^2q7p~sjYg{jgYThhW=>h?6XDAvM!6 zK;D87aW!)g3vNz+P=F=uhZ5?sRSVrx%4R^uvA$^yjqo?WLIb)(U*uRMy(?WX5~2w1 zh%4dt{`gm5a;M2HkO z0!K~s(}77HgM(-=$CQaT5J%{xJ_OGlS_t`&wG@ACiZoeEz>=UZ#j>)cuu|sw=Nhoi zH!?D!Ao;o-nNI)ov;;dpN4 z-zoaSAqQ7q6sXiax8NF_x?Y0lm#j7r$9>at$oXQVo7xvHlHvb;;rkh5fN`9S;sUSF zu+ezglPkPPtC(HSNb76UO%R`j{ek}F{$h2@?WVdDfT+IXw7l~;fIZM#w4_Dc7i(>8 zFcE_GRSO9xzzHQV@Nz4FMb`aLXGFS@0byr9bX9LA6z{doO4C71-e3Dk20hLzUh|1>U&E09UDCt}LT`v3 z7|THITov)Ye$~H!1I&M_GrpT4n;x-Lj~~RPqDc^lsM)7SR6?ti`wm%H_+kCr`+%8; z@UZCvatzplg&@Rs?|UhrUqhh%cprKY`A)?okiwAP)D%cbAqyls!|P$2DKu@bnSaZ0 zv;7QUN-08l0Ij>6I9zP@09z$Jx=1)AY%IIx&%o#dD|RZQ=t`{I?wAAxJZ4zOAiAZ* z6`{?k19kMMKxk zb(MGPjXN+X0smMpoNnhMyd&Q|fq-FZXlS~c!u<=kuo3$Ea;f3U&LfxUA5k-v43LQX93&N;laZBQxKVuV;}9D4n+8UNut`lx0^~N zyL)k(^HdW$o856ZxYFtaBh;J$#K6?FVKr+giZrAJS zFG)#Be%-AkNo+{86(E0-Z(Qsa#0LC5KXeq(Atk}oqT3KpR-@<0CPl6}6arlKbmZQl{0fs!aBWG3q?8DWm2sRf96G?y zBC~S7=#~%UQ%^dgJ;kA;XB98_S{;-wfB)83^>W+w{(MF3vFLT`hN|Lq#h_@Q0HTpi z1S`#b`*v5Y-m_dTa?<1Q>v<=>DcjuAS|n0hhyl(lZSBujXkZO)qGBtrzg%J1`IC5; zlk*{LC&Fa~y1>QIJQhEg9MzE{+&!t)M#N9TKZU9wgTPe^ylmvqpAbko-hbQOBw`;) zC4cLs@0Hh0_EH*6nSX4F0`z6oqsxUp8wmhjz@2UJmPXmzJNMNaQ}Bq)w&51JKQbF_;tKs5-;hAWAD zK9d$3a+(pwAj}|OP`W){lFc#FZr%$1{xPMmXS(fwWt`$-v|OZNa}yhlTY~vz80t^4 zKs^9}^Sa)ij?rI#Z*l}TN6hAW2=js{-EmcmP$=7C58y8G0QZ96&Syj?w5x&(;^~#t z^wBob6ViR$WVxkYc%>2MP(M586hy}0Cn%vESKD2xlEcXKl{`s}(aUaQ{p_;MZVp;P zk2Kufp_q5uL8tfQ)c1dzjSDJTbG2&Cj?vO@?1`&|%5Trv1sUfALr9%`Dkd`p+_WgY>e*qlM z+53sLzKgf-=WyMR2>&mKWFg(t{yM7kJe9sq_3xF#j})E>-_>GV&mIM>@-;JQ8Khh? zVqnE>11;j6YDvW3KZAv6a69e#PruRzc*vuiRgv;}7!L)%CjR&Y@=tgCsUQpi5b_{> z`F;a^dj@-OqLB*L#E9$7{GsG){&z8<5j-=Vf+A2*7Wc2OMUDoZ!2|K2$V%GvZw-ES zKj3meYq}SLE;}j7n(KSo)*G@1`8DnpEej-kzjgya+)-WQpxNe4DF`lE2RofybZG<@ z1>^8gsQW{J_L=&z2cPA;GqBmIY@<%a{0HX;1J71ku|1%oP>GcjkSAxg-x+0fO@^wa zqkj`Es1%&bT@$B6jsTqhTdC8qvlI(8D@649ONVtr4+;@zmPuz@d!R?(&0*0_dN9K; zD=TFV5fvRCQZljKw#&wc-|Mv|>tJKbWqv~?JHCrSSjy>x2G?#=lh+rmW5O&SPh0&| zCc`@V%_AccTntXsaaGwR!SK73B=R4TPhb~Q27R&@B-L3oj-`G?m1TxEc(XFhAB#&CX(``{Uv2nt9>C{-#n)Md?aFf;q4? z5^Qxy`+c>Rf1R3fxEzr++V@eOP6~*&F#J1l)S+tARlVrWL4kWh$n6~t!_QYg{J_X& zZw|K*`GFaua$PZDmW?0DMEQ=lf|Tgmbf@QbHwi$Z|1S6aVc}$;MzD3XSDBZ5UY#{#kCIz$I6^j35hn$5(ptzsBBf>1^Dx@K0Djw z`%Py!bz$L2SjLbikp=!8lsM-lkx-mYDZ(|C*28liay>P+2>GHHsjL2xTxjp&GUDD| zzOPgb$4K~M;q}&E|1VoabwcUlY_;Sy0jnDhOK3{1HVqsQSKQ7tM~FdMC|m@cFDKVV zgL^tEEBDf~>(&@+;7(L(L7^T$&VfqIgIEx2M*(TnLO%XvqnixNmHX&53D$B7zwBv= ze9Xngmjb5i>%v-FGN1gq z-i>_^)jzmU4-=_Be^>gR(V#SRbhMS5TqEr|7U`qFH=PJt#t*)(Q z#C-?SpDfDqmCKdU)=j^unTS8W-V;=#cm$VCnq;q@?u&)a_p2C>r@O+^>%oO;@Ror>6#^ zkvgP!0rCvoOs{Ew4Ua46+F@dTdASP$yR5oHBx3eI=eQj!L~;mpr(?Gk(JF)4UOW&wxDSFZo*uOCwm!R^@eGW?0X|CXj^uqu&?H!c z=-=?48!u)PcK0W{9&!lOGET9A9h5c2%L>CT#>=4cD~eoZsS=RYC%OcDzPcJe4aSWa zl#rOa5(3lgOo3w;duLnvi7*qWOE%HKtD0$G;Pm$_u(VJIQ<2-Gg{E9OCV54 z&%<*o4Ldc~uE*l5VXX?O{lZxeo&C}ENp@XFp#-q) zxwtfI5#MdJwNn-%lNc0{td)d2Fh}3n_JH&X* z+V!aCqYDiCln@2dMeN$a#`*CG^8s?aNPr?04E;Awfr6*yKY|tAE_44azv;cR>CaEq zIHr9;Y48u|-OS7*Gwio2Tzp>`on$GkG!I_ce` zW|wOv!nrO1Q#9Wg#iGTgFvz(HAqsNv;k!!23Qy5GL3!D220`?vq5&7S?l_mik!Yc+ z6mxGsLeCID6X5aNB_sdFQLXhFR{q@Bff{)o3&B~9Y?7CspAz^j`>B$gdkDMe!s24E z2s(Te|4my<3otX&VZUA$wWN3g0Sc6wvv{3g4>9eFyF4GhW(`Froc}h?8Od@MZlRwU zu9Zw@kX^r4M^;_WSM$Dm_>tqdzZQ0C(aZp(&P%E@BF`-3h~Oz+-nSC_ZDen` zQikaD@C>FW^PdlE(b$V$6AgK=)g-P7%P~<622;vuqZYEJb2qhl1~6^6J)Z%i@e;Dl8P6tQcT~^`YpO7!v2<-57<<)7@ip?qOyQQV}0wt<`xzi+W$Zo zqGaU{p}=>FaJKc-$~Lt*|*5@%_+xUXb%D*-rRIhv?5N z)Y2D-*-J&~HR^+As%W^#0=^3cov90D8j9dLDLfU%2=G=WEMz4?RZccn-jBSRO(i|S zaJKZIHUk}@06v!&v8L{c{n&AVavd+ri0nCQGigO3z7{8@j#&QRHndSSv+oC=%7?$x z!Pv^igp-r?)h5&)@utLFi)>+G5IrKzsEjs8V|+UGot|Z=6rn)`Tf$etF*CicZ-e5n5R=NdKiHEBgVi5qy)v)ulQE+ z-`_tU%?qS`S*EwNsfsUfjZ93q_Q1^E>NX^PhLKj{4Sr4S4{6c-92(-S1Yke`CeNOp zb^0))%14ibE}Y&@(L^2mn>d<@J)Q+aDD;PsFrldi;mUF?`f~3xMtNdX17#Qfq#KAZ zuUINKh!1E%0O&t*@DWZ{(<#9%%^~LeBD}=C~5oL;@AL;J#9fH!nc?%sM6Z+{nlXI>Hb7 zRW%zb5QOX$W>;@f`uk(jw%w9Z3;MsKSQ~=-qXC}?IDaz?ND?(wV&f@OMqLAB4Ph#_ zNw=bvm6aOijt;Cq#~@ossLjtsQ(87$@!K6yGyBMo* zN=N_=0~up}-~XwkDjZFWjT2!30UhaP31*OWp7s!5Ck-vULVD{V6MxVSPav6o#Gw>s zPl#zg%2g`)Q0u!TAtXcWX3!;5nie=-G}VTD&|Ll^VE-pOC&=x1^96~w(qaE=;E(0@ zpCz#fJyV?&j7+WfjQ3>HvpW?sE?jT;g|7(}i$2Sx=&!m3-m;)h)qb(oPmmKVMdU>* z!P_s^bnuI)uX6?{wmd%bXodR8K#?HoEC!xmzkFF(@H=~Vh9$oe31V;_xo{iT#Y7^i z)RYTT!#H}Nvp?x#FK`{7Ba~YITamWHEjtq!!1Xw zt_eR1;U7?L{8PGnMr#sUJus1FIM*7lCGNXGkrVKp<~&wlqgx=V?uA#@w@ZSxE?Xfrc2oes{% zFf`=*4+J7^HQM>2>bdszN&&>|n-1w7&K0DGKXH6*tDDt&Gu*|P@I4?CxJL8#v7{UV zF3$$t!{2#&CXCnsqYt^uWUhdLqiw7au?az}`4~5X8ztnkh`~x4zx0f9czEwvJucRn zGHx1;wCfe)>|B+~FqX?q_8oTw+WTqX@qGUa{%1L+IO?tpeb(=R+~es00=J@du2Tz5iY^TdS)+J+e-b&To!(UZtE2h zv&&wYH$>EZg@4Wdcee*(61<*+a_xKs*ACQ^1k<>UrvswN z*AEIv`3#`7t}yX$sor~t^CT^jERdxZ^PoQ27Y^R~5T2>7tgLLHjUahVnDox#>xQj{ ze0f~?O<}LaWIMP4x78q=nhOX0{7ogg4J1M=o%|fBWh7He54*qZK*KnT>XdMI`OPN$ zdeO{`x)~wa;JrPRrRbW-t5lYg#Yo;;bGX^t4URi)VDG;6KJiHwBuNy;{aqSOAc(;h zE#_(L%h8-p0Y1NCEv~dj5O=v?z{c9M-6)d;1K=R~=9t6BIh5BD#B2mRQM@M z+tW$!<#DEWjYbVh9BL8zxQ`MJRuzHVs?qB5Wjf__3kME}gpzoJI?SoEKT+`)YJq9+wznNiz9+4SFh;RzZ-gxar-4i`Z?}D{MzT>ri`zfO1TE& zaX-hm0tLu%3Ey}Ag){skH28R&kxONvsu-bbM(GcD3fm59xOQ1qnOY5lt7^)nuiCk6U};l z1zThKaeL6ALElmNaWqd3vgg_%wB;Y)xFED&-~_OuT&2ieaNub{b3dP>s@umbAi;8M*yM=RE3qVO7J6B( zW7W}Q_Kf%CCo-P0{*A&kByH(Wv=E*8AvWv3-?y2m%Wh2+PtGISB_5l}J^QQ^t z5j*y87U^^zp1daBgg2BSLhf`K90F?${;>)!WUB@6-W(??p@f#(5l@1YEY_7*A zf{8^pI8x+SV_H(ekMvj9UL{KAj1WM{j<5nhDrmxfpz0;aGjBQf=2CVWgLC*8oC2Xb-t-GO+@z zWA0vg!Gh4w3Lz=Xwnp)KD7uytmqsHxIu7l-bT=kn^KA)a`T{orMaLld=%;g3)s14W&Q>Yl<#u=S zQ`zrSxb-zOr9c!hf?ZF5>$@TBoTA_v??M{7k8(n>2Sj#%zN+*CvVf3vx-)-baZu(f zjaoH}kO?52EHHq*g)}lDsRk&vd}su zf>N2gKskvNu3zysMPrBX9z*Dd+Lti(&twKf(Ym~RVVy$%nxh%o zW!6>YI`c#P&y;c?Z&(JfH4VOyyUU;y2x{0@g3T4*-56I>PhU&(ef_SjTrvhx zPGMl<0MTXP?0jED1Vbx+H}nAT(VPTXNRL!evvSGjnh8$g;<%M~Q7{I^=^V-E&4TkF z7(6MmfuH3fYu9MKy&WDpKRYNoU)Ow8{V1LNEPiyfwp;YX(T-NMz1GhWrqJ?iq`B-s zf&Rc6_V%b$@yD11aH1TOR&6+3cmxNz(Wt$OBPSx>Dq{$n?%{L)pU>r~ zTuJ-;w}3l!HO_N(y8CQh(8Xj}qK>miciwDUB+iD5gWlNwuu4;p&*pT?w*G${dv~7C45?*djd6jr*B50BLbHyvP}!g$6w>khZ$|G zVej%X=2>{S$QX!TWnV9b^tq(IE_R3hUVFA5Fv}iCK9tBguB6`TXH;!EZ@|*vSp5b1 z8c-n^XH^u;AVZqm4V9OpvAAzC3JJya?Xuq5z|>nelt;bo0(AN7@3+k^0C9tpmA-rh zh^@d#_M`>+6m_}L22WMk%PQdT>dhlrBi!VB_CmVK>^&oD2zo(imPY#1m#o@lIHny~ z$m?;J(^7aG2%zG?zeLx0v4TJn(cDVSYL@%FTNU|p&_wR8e;J={B6MIwkNoSaFrx+y zDm?>z=O)H&DUpajVH59ZrGxl^ktcWd2P-v~{DgV)ghcpjLf`3LTh0IUCr}}j{o%Yt zb8Go*<(MNk;YmY<%#hXPGRLHiLpRJPJO1-!3a7mI>DCWTV+1+$^qz0oQ)y-X*J0de znNl0VO2Y+}-aN*Za-O9piV{(9<4YqQho+ZbD*4SO&-r#iHR|6g^T9(@bWG&oB4W3f zXx_8LMuu(cuR1C^1nI}E_FIriT#0hV2rHJ*xQ#?>&kI@&-PeY2R&Y-~$ovoX)F%R$X)YT)DMMr4NrYp^%zOJ3yxUq}PrflT^K7Z8kTWK>u!)?eQrgp}&* z0zG*L@b(1uahbgGVq7=qNL=xuQEAJyTeV}h+#(AC;1a+ZeCaV}u$Oh%}!P@A^f5I+XHk4PDdEo`eVRi2j zsmE_CZX7IhbX3~SGAeDc2E;S%hI2304rl z9)!W=E|CZ_3yiEXeUiG4qu>{bA_MVX5maOZOSVB#Fs;wwfy)}c4BUb{M3q#aR48m};1P{on6|aE& zMI5PrHd;iMX%BEHRE%pXf8<|jq~E#KZP4`p*c3s$L{1h6qY!Q;#CL2&sP4r=OK->IW6+YiO+^H+l2`4a|;}&p3;C7CJ4OFs_92#RE5o{3DBD74h1QI&ttr zN9&~t5no=WW{`zuC%v|6NHiOO9jaHDiM37vX*Z>OhUsHV7WXm{}lbRYdX0E9kHV;18-%n zOlSv7%BbX{tK~-p$O?-)G$cJ_5dNnn`+kGHYPgcq6$m6$lye64ToZl{Z3TzMl=pKC zP(2N;5NK`OTz4h>0ZYZ~i?`~jj5x7Qp`;OZ)T1JU!P{L+uK~2VlCowKWL{@LVJyv= zm2oX&g;{ICKjnY?pTb=rrGJy>s0cUmU`}R@k@`ho-GFP!o02p`b^$ml*1=RiBdh+F zl~3gsK-O3<`~hzDP2U-r-4qY!5{{L7Ig;~ao~1XxYAlYPDYA(Q1`+qZ zz$=%FiL+(GuXr(4wt5Q@S#6ybb({J$^mYmdrEGmLVW$6E0nb^ys7Q#sO3P6j+w2Y3 z6A?EZt1nfn+w( zLcw5M*#-)Z=APioth(;NA0r-82JCmP?oH1RW=n(q`so``J}juKpS>NIy&*smz1qPi zowW%Vmw!P>f6Dx~pJPvSVf8CeoK%cdOyb>TaFD(W3UMY-@(*Eu`!Hh#{NRKZ(= z$-u5>BH^5A*b0I{qm7)MOL!Tw#nfmZ8$Rd(%Lv5#3{#>11$8%V$)Wrdn!ecDrh4NX zz}R)uG|{YoSwAM8sNDU?PdX*Q{xcEsVe(ou8kSd$9_9wFto!ZRPEq)K)+Kx|v1P>j z@OY*qCk^gcJP4^L7|!aWBSPSNdGYuUF=^tE873Vl}USb#-$${23ysO@MC1oI!p(qy1Ea8__8Mi!awo|LE|TZ~c6* z{I54=PI;l!u=3U)eybE+4HKStn_5F#Y$9rTT2hN6FMJMOUgHt@ss^C@Fr_9sSH_ou z2yB6E_`}Uf5mJ~Qo(+iEH}{U$Aec}zotROunY zxoz~BiJMc5?QP*bX-dYbcqiu9;~y&wEk7j~x(FE9OUmc05oDQaYmzAQNqyE*nwW6Z zeur{HSf1XZMNrbG#`8@67PGA;iCeOPQ;Nl_%=MFi`hI=|mJSEuIv9u?$)h{1s47CF zh8XLN`}L1O-mgI$00(S?dCvAYH|MZUcuD>>x@s1?K(nmK$_B<1JNUraRz^f`6_C!+ zhgk|)NWy2703?WrG8rpVVZfS;63F{g>VOOPpAtuUO_hSBDn90{fO8obQ~x385V$B? zJ$)HE0mp}^E}vq1e18+H)-Ct*wvk(d5_o$DPuBhGh|(z{K>4R zbLR&|6q+%NlS3XasaQg{B?A~oFl*$+7|Yj^Kz*Y59o_*&dI|jv3O9F;&T#t2)-a6m zb9f$U;6+v;_=^KzK1XP$YSmFGWN2p;m zw>#0B#gN4>6_gtjrKBdpuRg(^b4t+}N}C!JsA(9`Jyd1WyPtPDXDc7|Cn{MMe$g!D zb&J5ZkLO-kx~0*58S}Ps$@5`bOpmT2wYkjO&I1^>QAR*|kcit-LfJfo`*CHDDnaK_ zwFT*u0Llddd%QsmMxvrD#*fwyXe{w!x-(V;0@;2VD+sqY3vsdxxpr=Db>vuwo0TKG znbncRFoRj;PplIGJ_UqB8rvWLN3Z;caWMV4cv^*it?QWf=MGi%rpZ|)w9ZlH^ZFMd zyY%6xNq^ON>mCGGc*dLM0>aaMk|)Jw_GzGHb(q)pH~Vz5Ha%`JY{b=; zXXTr0$(QwM36w_^j&>D%TyHA+;b!B;9L-sX1#Cl%amHQTmJCt?HFaaWBr#E!Y<^Oa zz<}jITaCdSkh5n+lvCV3;sa2!mw8#<>inLKX?UbFqfdQ7(aPJtf$pMPrh%+ zvIH_8_@^;%7syw!vc8n~IKNFO`UHeCSSmnkygTS&-l-ebtk=>}I`Q&MhZbX*BziHsWELa7#KV1}(8kUE7^ z<@8=w)AjxRqT74%^yT#5fmq)LF^NpnuJ`Mlk8ELvDwF+~k65$Vqrb3Z7s6O`OqI(4 zle2iDXq0fo@(F<&8%CPj(TPnf{nRVT+!w^fSzq6ejS{h!;(p5b=TX+41rnbCQ@Q&}lf1>>CP1)6+8%-SG;FxXMZWn=GZwKsnO3HdSi1wWB?gg|n zg{!E3y|(+SFfy>48ew(Pa3gAB!S&~4#i*9obEWG7DXz{f&D|Wk8(TL45Y6wwwpn~( z#2O~wMWdJ+9$itesDg}gitgV!=PP+m0pz0a#NQ$bWN8qPUc}w=wpzV&OKE8g8jFhD zGn?=fgl2t{`HiJtq2M9^L#W}mQ85wQ>_o!L{MAKh`dO7v^lw6zY@#6E=C15j(wr{M z{FytBLNA*_SH%$5GXA&OO4InSjN<~X^{>h}89r+|1ifj?TJe7L`D_JdyAVX^JGU`t z4MV4IEmsc+5Y@@zHEU7QkN+Lmgw^Ua)1lZoC0VnD{X~_zP6?-~Wr|!4z*)VM?~d?fm#Gav1Z>4`eH?^!d^L}`U;M9q@J|e(fzh!J=`IV%|7>L zp@!JB11aGf`|bXyEQ`vVnjY^xl~}C`k@SIxBu~l2cQnDljy~NQt~3Vr8j}oSgKsES z(yBONmz|l6{r~Dta(UZ_RmF%N2VPU&+H*F(x0$Z>WTQGlNA=Ibxnn5L4C2yvbi zBgd*Gr3=+M6?wY8dMFCT0V;puK*InhA#SPC{Mb5HOg9rrz#k)L7_L3Mvr)#D!o|)B z)`6@AzC*bbIV`Nz2@_Bf%C#qC*;mY}N-wLTh+YyI7@!80*SgP%Gk&X7G19q(hR;#E z1sHdA2^m{C_2rQ3kR46Q$g_O8%8T1xJuh6JF7?8k+o4l{4myU*Zid zQ`@*&qJ-D5$0noht3X9vBkdfn@%rqv?T3=-k@#>{xn&3L2GnYLx&Il@gYZpn@6B~( zxyh@rDc0N$)Wf4oU;F<9@O)w1ZjjoY4@%8DAfn9YQ-dSim!^-%kx`)tDbJmj2D#Oe!7n;9tLKJ|q85HD=sm$lm;QI<_&AMQT`!vH5~Eg~=yJ7#AS? zR3{G=zd6)CH-FXMMQg=cUG}-*e0HaYZa|0Vdg>-u^?)lABW`O6|NeZRfadn6mguJ< zL1}Zx$=q|m!-HD|AtpzygVSh@FEiHcip6*g@RdEasZCT}_&Fa$+Cbh5`1ll*3c!k5 z7qm9T`R8>!S2(z|(g~3Tj2vVlNZ1s=M$Y7;b6@V9FYe7~ z}s3C{VAcUS}WI916^SQ$T@YsKOi@zanbEo|}-WHy~$n=KQCl2yq8KPI}_Xn+(%0mavSV<(?I8Z`%ahum8`5Em5Wy;2@4bYq^|@xP9<# zWAgnU-by_1MBauS;dFiB5C49m9BBYE{k2k8&@O=T0spK!VyCYBJjBIUp7ZEC$42L( z8*2K~y_pZE_o|x``-61KICSx^mpYdc?;Kh4)BH}B;>}(r!k|nj*MuJhl;JebxJyy@ zg;-Q}Y|WD7cuNtSu0SE;GWt?;`e{*t9XvT>*(WTsYwy_OIyiN}&8DF(0jcb*t&=4? zvi>>niUAH|jd!#hO)_&1C0p*dWps@geX~BM=&}ef2{_w9RYiGGO3yMi*Euj@bjC{; z@vGTHHu=r4ut}pe&e!BkhgG?Z9me?dNCTOI;^?-c0WTQ$Z&e+}Hlo-CRm>xBtzgy(%KBfx#LkQR}#Sppj*|e5IiJ zbb3S_GpauMOV%D6+DFdCg%Ae8xy20lX9Bus+la{LqC<9%OTkuhn}w8?cuLeYpsdfeC>x%_o>EnPfi%=j+Q7s zi$e_?!J(K=0n*&RzuHwZ*5fNiqr93(LeN+{CigOj@;F|ymSIMwC+ zGqtPHBic3IPgfsRP^Q*I`MF?_f|UMoUys$+=iYav(=R(V9;NmioBZ|a7|*V+8={EY zE3UWa8qICvWnG;+C;0XEv9+|@*lTzJvC#YVkCcgrYF6`@&KV9WatbB%kFWL2Uc_i> zhg;bBhK9U(d)K?`k5?|m?vQg;`6`jn5trSSUBKy%O#-P zA_sJJ6CWC;vQ80luT)9lRH5ebc2m@^SA|%UY>5Y(d3o;#@d~d>nqD3(1A zzhw5K=Q4FAM|G3630IQpycEGO*Nd2Z|0$-rg#LlW(Rq)5BEc#uC~a5XfE$?tb=9a8 zHA4b>fM**GZIpGq8q<3lAjZzJ6%|AzIlj=AE3Y|B3}UKs*_20~5MgKAS2yyu(Wa?d zThrp$LL2#3ktq85yFO8J&Trpo$OQ47J+&Qn7E(sXJWxYJcs^8#p~ zs1=p|;vCbym3TJd*3oDRiriNjO=IU>e=y=`q*W%FO1h2QsU(s0VdNql5+nkId%P`E zNTZz5mk~@D;@M9byvqJ9+9_4#V68sdXgb_X?-6q^1?Msald1Z7?C_&x;|{-f1jbXY znXKcRYfPR`o2G`-8!WuF2*fJJ!kY;n1WJbLqAnm#5cmaBGPXYQc4MC}DQUlh94!#a zPaB}{YQXi)gwKe#o7o(8E;J|EHPZ92QZ*8D@P4J7A$P~%iF3wPq41#v;0)Y*Id%IT zW)?n^y{xJJY??V){J7X4*BLc%2$-nmN67sKV==rQD~!oDC(5I8#FiXH^Cv6BBk8jK z24Mir5)=vW)aMza_ims~(FoOpz4MNet&|D5D#@WwbqO*% zS}P4=ZiE~skp$kmE^;D$|JmEs)|SN~U}Njks}I4iavz%O<$AnTlvyPGu==v==OwK; zV;_HAkj*zKOO{YLg>uds0E5a|x+Q(Jhxt$%!hSvZhm4&i@LCSS2xCy$w}hc2Zeu`m z7_#sv1eM0PL2nQhxz!%xr!{}i-Ty-Wlv7B31BUzLy(r$N=7Y7UH{wgy8mQUDOCowA zIB&0~PF#uGe?3XvqhXH~SpHyxxA@p+E8{*lKO$Bq*Wi{J$vt+O)n^Kr0fZSlFsh00 z^?~R9aG1>IIEN5=lyy!i$B`{J9$&KRsP}%C#-XWs4*P?#L1^6SNrQ;s(PkZ`ph zvaYD(B>Aezm;v@U;I<@a$`c+iefxR$W4V#8ipf@WsZ-9x9>{(G4dh0WOj`PW6^T!< znZvA7J`mYJFW%bdlSWf1FlM08VF=>U+A(s7JVT|p#1wsCPjN0AdnjU+!*a>#&DZ>M zxBcx=AV?B!ux$Fh6X-E^xVxWh;nArj4>zKFJDM}G%@CbF{o;`wn5%qa*mgBkobT_7 zjh&@l4xq(%Cjg~>EIzUfU-Osx+bdp%HWtzsgTcD>(OIwU#u0D??3^LtMk0v^-Jz^U z@WOwH%3P#@WC?}Mwa}`K#RffSDMysL^i^=}pP$aop=0gLBov9CYh_U%snfhCZ-o*Q zXt?tMh~5P?f{l5YrD~*IY{RvbIio^GH3A5~k{~BP7YGm&9@xa#hyG-X!%+%SjKhoh zu?o!X^=G_ZItr;=XN?C?*w+cJM#vso0y;MNwum@$jaec(_dk+E?$ac>;x2^JV+oE7 zZ0uB63G=H`dCu=IO^ZmQ0|sMw?$9`=kdkDn5D>92uDQjH`6xsdgfCC zSwJV5ja+-wsUX~+qNc7M<)~Fr(tn6t_nNT$=YpBf_@9Y1Ys==VJsyvouH2eN4|CB7 ztgvC}XH(y+Xx&^reHWhye+e*hlV0=10Z*SF1rueih+ybHl8GD?-)ounOhhA0C! zfXA?Pcpg61+*Y_LISjQPPjySCroP;4H+$BAEt+L>DVxuxp?vBGi#rQQsUS_YJfpt& zh!nhtZtx7ur>_XZ-f!bnE%bXQ-ZKom(gs{RSm4`;2B8I(GJRFXc~jIgyB{+uN?AvydtT zwO3Ih3t zJ`4yDC~&i3fvikSZee}*6Y+?|duHaZH;bDZy;=Jx4U zTN&RG6=W7xnp1&j)L)ksj_=>g{;p`IhGq?BWN|46x$&5{IfHStb>q-Nx z^Ey)6hbU{nj-%48`7_Jcqq#SJR~3o3br@D#f7W`E&aAC3trit!WaecQ6y(Jg9&{{q zRK+jFuYMJMCP`<5ZbZBs(wk*cbGI64#U

!$fH5DAbQ7)vTNNkkfMN{+QKeuEnV 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 z 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 { @@ -204,8 +202,9 @@ snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + In order to run this example, we need to install the following: 1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) -TODO[vatsal]: link to enterprise TIBCO ComputeDB here? -2. [SnappyData 1.1.1 Enterprise Release](). Download the artifact snappydata-1.1.1-bin.tar.gz and Unzip it. +TODO[vatsal]: link to TIBCO ComputeDB developer/enterprise edition here? +2. [SnappyData 1.2.0 Enterprise Release](). Download the artifact snappydata-1.1.1-bin.tar.gz and + Unzip it. The binaries will be inside "snappydata-1.1.1-bin" directory. 3. JDK 8 diff --git a/build.gradle b/build.gradle index 69de09e..b93622d 100644 --- a/build.gradle +++ b/build.gradle @@ -8,12 +8,11 @@ archivesBaseName = 'snappy-poc' allprojects { - version = '1.1.1' + version = '1.2.0' repositories { mavenLocal() mavenCentral() - maven { url "http://mvnrepository.com/artifact" } } apply plugin: 'java' @@ -24,8 +23,8 @@ allprojects { apply plugin: "com.commercehub.gradle.plugin.avro" ext { - sparkVersion = '2.1.1.7' - snappyVersion = '1.1.1' + sparkVersion = '2.1.1.8' + snappyVersion = '1.2.0' } configurations.all { @@ -45,7 +44,6 @@ dependencies { compileOnly "io.snappydata:snappy-spark-core_2.11:${sparkVersion}" compileOnly "io.snappydata:snappy-spark-catalyst_2.11:${sparkVersion}" compileOnly "io.snappydata:snappy-spark-sql_2.11:${sparkVersion}" - // compileOnly "io.snappydata:snappydata-aqp_2.11:${snappyVersion}" compile 'org.apache.kafka:kafka-clients:0.10.0.1' compile 'org.apache.kafka:kafka_2.11:0.10.0.1' @@ -65,7 +63,6 @@ compileJava.source(generateAvro.outputs) avro.stringType = "charSequence" - ext { assemblyJar = rootProject.tasks.getByPath(':assembly:shadowJar').outputs } @@ -76,19 +73,4 @@ task generateAdImpressions(type: JavaExec, dependsOn: classes) { main = 'io.snappydata.adanalytics.KafkaAdImpressionProducer' classpath sourceSets.test.runtimeClasspath environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task aggeregateAdImpressions(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.adanalytics.SnappyLogAggregator' - jvmArgs = ['-XX:MaxPermSize=512m'] - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath -} - -task startSnappyIngestionPerf_Kafka(type: JavaExec, dependsOn: classes) { - main = 'io.snappydata.benchmark.KafkaSnappyIngestionPerf' - jvmArgs = ['-XX:MaxPermSize=512m'] - maxHeapSize = "8196m" - classpath sourceSets.test.runtimeClasspath - environment 'PROJECT_ASSEMBLY_JAR', assemblyJar.files.asPath } \ No newline at end of file diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index 90795a7..07b926c 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -17,21 +17,8 @@ package io.snappydata.adanalytics -import org.apache.spark.sql.types._ -import org.apache.spark.streaming.Seconds - object Configs { - val snappyMasterURL = "snappydata://localhost:10334" - - val sparkMasterURL = "spark://127.0.0.1:7077" - - val cassandraHost = "127.0.0.1" - - val snappyLocators = "localhost:10334" - - val maxRatePerPartition = 1000 - val kafkaTopic = "adImpressionsTopic" val brokerList = "localhost:9092" @@ -56,17 +43,17 @@ object Configs { val advertisers = (0 to numAdvertisers).map("advertiser" +) - val numProducerThreads = 1 + val numProducerThreads = 32 val UnknownGeo = "un" - val geos = Seq("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", + val geos: Seq[String] = Seq("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", UnknownGeo) - val numGeos = geos.size + val numGeos: Int = geos.size val numWebsites = 999 @@ -78,20 +65,5 @@ object Configs { val numLogsPerThread = 20000000 - val batchDuration = Seconds(1) - - val topics = Set(kafkaTopic) - val maxLogsPerSecPerThread = 5000 - - def getAdImpressionSchema: StructType = { - StructType(Array( - StructField("timestamp", TimestampType, true), - StructField("publisher", StringType, true), - StructField("advertiser", StringType, true), - StructField("website", StringType, true), - StructField("geo", StringType, true), - StructField("bid", DoubleType, true), - StructField("cookie", StringType, true))) - } } diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 9596033..67aee85 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -37,14 +37,14 @@ import org.apache.spark.{SparkConf, SparkContext} * {{{ * ./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics \ * --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar \ - * + * * }}} * * To run the job as a smart connector application use the following command: * {{{ * ./bin/spark-submit --class io.snappydata.adanalytics.SnappyLogAggregator \ * --conf spark.snappydata.connection=localhost:1527 --master \ - * + * * }}} * Note that for smart connector mode the application UI will be started on 4041 port. */ @@ -52,6 +52,7 @@ object SnappyLogAggregator extends SnappySQLJob with App { val conf = new SparkConf() .setAppName(getClass.getSimpleName) + .setMaster("local[*]") .set("spark.ui.port", "4041") .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .registerAvroSchemas(AdImpressionLog.getClassSchema) diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index f554082..d26674b 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -30,12 +30,19 @@ import org.apache.spark.streaming.{Seconds, StreamingContext} /** * Vanilla Spark implementation with no Snappy extensions being used. The aggregated data is * written to a kafka topic. + * + * Following command should be used to submit this job: + * + * {{{ + * ./bin/spark-submit --class io.snappydata.adanalytics.SparkLogAggregator \ + * --master + * }}} */ object SparkLogAggregator extends App { val sc = new SparkConf() .setAppName(getClass.getName) - .setMaster("local[*]") + .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") val ssc = new StreamingContext(sc, Seconds(1)) val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), diff --git a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala deleted file mode 100644 index 3c5d6a7..0000000 --- a/src/main/scala/io/snappydata/benchmark/SnappyQueryPerfJob.scala +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import java.io.PrintWriter - -import com.typesafe.config.Config -import org.apache.spark.sql._ - -class SnappyQueryPerfJob extends SnappySQLJob { - - override def runSnappyJob(sc: SnappySession, jobConfig: Config): Any = { - val outFileName = s"QueryPerf-${System.currentTimeMillis()}.out" - val pw = new PrintWriter(outFileName) - var start = System.currentTimeMillis() - sc.sql("select count(*) AS adCount, geo from adImpressions group by geo order by adCount desc limit 20").collect() - pw.println("Time for Q1 " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - sc.sql("select sum (bid) as max_bid, geo from adImpressions group by geo order by max_bid desc limit 20").collect() - pw.println("Time for Q2 " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - sc.sql("select sum (bid) as max_bid, publisher from adImpressions group by publisher order by max_bid desc limit 20").collect() - pw.println("Time for Q3 " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - val array = sc.sql("select count(*) from adImpressions").collect() - pw.println(array(0) +"Time for count(*) " + (System.currentTimeMillis() - start)) - pw.flush() - pw.close() - } - - override def isValidJob(sc: SnappySession, config: Config): SnappyJobValidation = { - SnappyJobValid() - } -} diff --git a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala b/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala deleted file mode 100644 index 3e773ad..0000000 --- a/src/main/scala/io/snappydata/benchmark/SnappySampleQueryPerfJob.scala +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - -package io.snappydata.benchmark - -import java.io.PrintWriter - -import com.typesafe.config.Config -import org.apache.spark.sql._ - -class SnappySampleQueryPerfJob extends SnappySQLJob { - - override def runSnappyJob(sc: SnappySession, jobConfig: Config): Any = { - val outFileName = s"SampleQueryPerf-${System.currentTimeMillis()}.out" - val pw = new PrintWriter(outFileName) - var start = System.currentTimeMillis() - sc.sql("select count(*) AS adCount, geo from adImpressions group by geo" + - " order by adCount desc limit 20 with error 0.1").collect() - pw.println("Time for Sample Q1 " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - sc.sql("select sum (bid) as max_bid, geo from adImpressions group by geo" + - " order by max_bid desc limit 20 with error 0.1").collect() - pw.println("Time for Sample Q2 " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - val array = sc.sql("select count(*) as sample_cnt from" + - " adImpressions with error 0.1").collect() - pw.println(array(0) +"Time for sample count(*) " + (System.currentTimeMillis() - start)) - pw.flush() - - start = System.currentTimeMillis() - sc.sql("select sum (bid) as max_bid, publisher from adImpressions group by" + - " publisher order by max_bid desc limit 20 with error 0.5").collect() - pw.println("Time for Sample Q3 " + (System.currentTimeMillis() - start)) - pw.flush() - - pw.close() - } - - override def isValidJob(sc: SnappySession, config: Config): SnappyJobValidation = { - SnappyJobValid() - } -} From 9ef41219f18ebedf22c36e8a3a7a2964e21af54b Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 17 Feb 2020 18:18:00 +0530 Subject: [PATCH 22/30] Keeping default number of producer threads to 1 --- src/main/scala/io/snappydata/adanalytics/Configs.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index 07b926c..867be1f 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -43,7 +43,7 @@ object Configs { val advertisers = (0 to numAdvertisers).map("advertiser" +) - val numProducerThreads = 32 + val numProducerThreads = 1 val UnknownGeo = "un" From b0b807d84c30717da663bdb53fe1dbe3df07beb9 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 24 Feb 2020 14:54:21 +0530 Subject: [PATCH 23/30] incorporating review comments --- README.md | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 38f4b08..3ebdb86 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ speeds with commodity infrastructure and far less complexity than today. SnappyData fulfills this promise by - Enabling streaming, transactions and interactive analytics in a single unifying system rather than stitching different -solutions—and +solutions - Delivering true interactive speeds via a state-of-the-art approximate query engine that leverages a multitude of synopses as well as the full dataset. SnappyData implements this by deeply integrating an in-memory database into Apache Spark. @@ -26,25 +26,19 @@ Here we use a simplified Ad Analytics example, which streams in [AdImpression](h logs, pre-aggregating the logs and ingesting into the built-in in-memory columnar store (where the data is stored both in 'exact' form as well as a stratified sample). We showcase the following aspects of this unified cluster: -- Simplicity of using the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to -model streams in spark. -- The use of Structured Streaming API to pre-aggregate AdImpression logs (it is faster and much more convenient to -incorporate more complex analytics, rather than using map-reduce). -- Demonstrate storing the pre-aggregated logs into the SnappyData columnar store with high efficiency. While the store -itself provides a rich set of features like hybrid row+column store, eager replication, WAN replicas, HA, choice of memory-only, HDFS, native disk persistence, eviction, etc we only work with a column table in this simple example. -- Run OLAP queries from any SQL client both on the full data set as well as sampled data (showcasing sub-second -interactive query speeds). The stratified sample allows us to manage an infinitely growing data set at a fraction of the -cost otherwise required. +- Simplicity of using the [DataFrame API](http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes) to model streams in Apache Spark. +- The use of Structured Streaming API to pre-aggregate AdImpression logs (it is faster and much more convenient to incorporate more complex analytics, rather than using map-reduce). +- Demonstrate storing the pre-aggregated logs into the SnappyData columnar store with high efficiency. While the store itself provides a rich set of features like hybrid row+column store, eager replication, WAN replicas, high-availability, choice of memory-only, HDFS and native disk persistence, eviction, etc, We only work with a column table in this simple example. +- Run OLAP queries from any SQL client both on the full data set as well as sampled data (showcasing sub-second interactive query speeds). The stratified sample allows us to manage an infinitely growing data set at a fraction of the cost otherwise required. ### Ad Impression Analytics use case We borrow our use case implementation from this [blog](https://chimpler.wordpress.com/2014/07/01/implementing-a-real-time-data-pipeline-with-spark-streaming/) \- We more or less use the same data structure and aggregation logic and we have adapted this code to showcase the -SnappyData programming model extensions to Spark. We have also kept the native Spark example using structured streaming -for comparison. +SnappyData programming model extensions to Spark. For comparison, we are also having the [native Spark example](src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala) using structured streaming. Our architecture is depicted in the figure below. -We consider an adnetwork where adservers log impressions in [Apache Kafka](http://kafka.apache.org/). These impressions +We consider an adnetwork where AdServers log impressions in [Apache Kafka](http://kafka.apache.org/). These impressions are then aggregated using [Spark Structured Streaming](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html) into the SnappyData Store. External clients connect to the same cluster using JDBC/ODBC and run arbitrary OLAP queries. As AdServers can feed logs from many websites and given that each AdImpression log message represents a single Ad viewed by a user, one can expect thousands of messages every second. It is crucial that ingestion logic keeps up with the @@ -208,7 +202,7 @@ TODO[vatsal]: link to TIBCO ComputeDB developer/enterprise edition here? The binaries will be inside "snappydata-1.1.1-bin" directory. 3. JDK 8 -To setup kafka cluster, start Zookeeper first from the root kafka folder with default zookeeper.properties: +To setup Kafka cluster, start Zookeeper first from the root Kafka folder with default zookeeper.properties: ``` bin/zookeeper-server-start.sh config/zookeeper.properties ``` @@ -218,7 +212,7 @@ Start one Kafka broker with default properties: bin/kafka-server-start.sh config/server.properties ``` -From the root kafka folder, Create a topic "adImpressionsTopic": +From the root Kafka folder, Create a topic "adImpressionsTopic": ``` bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 8 --topic adImpressionsTopic --replication-factor=1 ``` @@ -264,7 +258,7 @@ Submit the streaming job to the cluster and start it (consume the stream, aggreg SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel -processing from kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. +processing from Apache Kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. Start generating and publishing logs to Kafka from the `/snappy-poc/` folder ``` From e70ecc62fbaf52a2ea16cffb30bd79c4a0e2157c Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 24 Feb 2020 16:33:49 +0530 Subject: [PATCH 24/30] incorporating review comments --- README.md | 85 +++++++++++-------- .../adanalytics/SnappyLogAggregator.scala | 19 +++-- .../adanalytics/SparkLogAggregator.scala | 1 - 3 files changed, 60 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 3ebdb86..71bb3da 100644 --- a/README.md +++ b/README.md @@ -129,17 +129,19 @@ Adservers and generates random [AdImpressionLogs](src/avro/adimpressionlog.avsc) Kafka source and ingests data into Snappydata table using [`Snappysink`](https://snappydatainc.github.io/snappydata/howto/use_stream_processing_with_snappydata/#structured-streaming). ```scala + // The volumes are low. Optimize Spark shuffle by reducing the partition count snappy.sql("set spark.sql.shuffle.partitions=8") -import org.apache.spark.sql.streaming.ProcessingTime snappy.sql("drop table if exists aggrAdImpressions") snappy.sql("create table aggrAdImpressions(time_stamp timestamp, publisher string," + " geo string, avg_bid double, imps long, uniques long) " + "using column options(buckets '11')") -val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", StringType), - StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), + +val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", + StringType), StructField("advertiser", StringType), + StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) import snappy.implicits._ @@ -148,38 +150,47 @@ val df = snappy.readStream .option("kafka.bootstrap.servers", brokerList) .option("value.deserializer", classOf[ByteArrayDeserializer].getName) .option("startingOffsets", "earliest") - .option("maxOffsetsPerTrigger", 100000) .option("subscribe", kafkaTopic) - .load().select("value").as[Array[Byte]](Encoders.BINARY) + .load() + // projecting only value column of the Kafka data an using + .select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { + // Reuse deserializer for each partition which will internally reuse decoder and data object val deserializer = new AdImpressionLogAVRODeserializer itr.map(data => { + // deserializing AVRO binary data and formulating Row out of it val adImpressionLog = deserializer.deserialize(data) - Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher.toString, - adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, - adImpressionLog.getGeo.toString, adImpressionLog.getBid, adImpressionLog.getCookie.toString) + Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher + .toString, adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, + adImpressionLog.getGeo.toString, adImpressionLog.getBid, + adImpressionLog.getCookie.toString) }) })(RowEncoder.apply(schema)) + // filtering invalid records .filter(s"geo != '${Configs.UnknownGeo}'") +// Aggregating records with val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) .withWatermark("eventTime", "10 seconds") - .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"timestamp", $"publisher", $"geo") - .agg(avg("bid").alias("avg_bid"), count("geo").alias("imps"), + .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") + .agg(unix_timestamp(min("timestamp"), "MM-dd-yyyy HH:mm:ss").alias("timestamp"), + avg("bid").alias("avg_bid"), count("geo").alias("imps"), approx_count_distinct("cookie").alias("uniques")) .select("timestamp", "publisher", "geo", "avg_bid", "imps", "uniques") val logStream = windowedDF .writeStream - .format("snappysink") - .queryName("log_aggregator") - .trigger(ProcessingTime("1 seconds")) - .option("tableName", "aggrAdImpressions") + .format("snappysink") // using snappysink as output sink + .queryName("log_aggregator") // name of the streaming query + .trigger(ProcessingTime("1 seconds")) // trigger the batch processing every second + .option("tableName", "aggrAdImpressions") // target table name where data will be ingested + //checkpoint location where the streaming query progress and intermediate aggregation state + // is stored. It should be ideally on some HDFS location. .option("checkpointLocation", snappyLogAggregatorCheckpointDir) + // Only the rows that were updated since the last trigger will be outputted to the sink. + // More details about output mode: https://spark.apache.org/docs/2.1.1/structured-streaming-programming-guide.html#output-modes .outputMode("update") .start - -logStream.awaitTermination() ``` #### Ingesting into a Sample table @@ -195,11 +206,9 @@ snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + ### Let's get this going In order to run this example, we need to install the following: -1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) -TODO[vatsal]: link to TIBCO ComputeDB developer/enterprise edition here? -2. [SnappyData 1.2.0 Enterprise Release](). Download the artifact snappydata-1.1.1-bin.tar.gz and - Unzip it. -The binaries will be inside "snappydata-1.1.1-bin" directory. +1. [Apache Kafka 2.11-0.10.2.2](https://archive.apache.org/dist/kafka/0.10.2.2/kafka_2.11-0.10.2.2.tgz) +2. [TIBCO ComputeDB 1.2.0](https://tap.tibco.com/storefront/trialware/tibco-computedb-developer-edition/prod15349.html) +Or [Snappydata 1.2.0](https://github.com/SnappyDataInc/snappydata/releases/download/v1.2.0/snappydata-1.2.0-bin.tar.gz) 3. JDK 8 To setup Kafka cluster, start Zookeeper first from the root Kafka folder with default zookeeper.properties: @@ -253,9 +262,11 @@ Submit the streaming job to the cluster and start it (consume the stream, aggreg > Make sure you copy/paste the SNAPPY_POC_HOME path from above in the command below where indicated ``` -./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar $SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar $SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.2.0-assembly.jar ``` +8090 is the default port of spark-jobserver which is used to manage snappy jobs. + SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, if the driver were to fail, it can automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel processing from Apache Kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. @@ -265,9 +276,9 @@ Start generating and publishing logs to Kafka from the `/snappy-poc/` folder ./gradlew generateAdImpressions ``` -You can monitor the streaming query processing on the [Structured Streaming UI](http://localhost:5050/structuredstreaming/). It is -important that our stream processing keeps up with the input rate. So, we should note that the `Processing Rate` keeps -up with `Input Rate` and `Processing Time` remains less than the trigger interval which is one second. +You can monitor the streaming query progress on the [Structured Streaming UI](http://localhost:5050/structuredstreaming/). It is +important that our stream processing keeps up with the input rate. So, we should monitor that the `Processing Rate` keeps +up with `Input Rate` and `Processing Time` remains less than the trigger interval which is one second. ### Next, interact with the data. Fast. Now, we can run some interactive analytic queries on the pre-aggregated data. From the root SnappyData folder, enter: @@ -279,34 +290,34 @@ Now, we can run some interactive analytic queries on the pre-aggregated data. Fr Once this loads, connect to your running local cluster with: ``` -connect client 'localhost:1527'; +CONNECT CLIENT 'localhost:1527'; ``` -Set Spark shuffle partitions low since we don't have a lot of data; you can optionally view the members of the cluster +Set Spark shuffle partitions to a lower number since we don't have a lot of data; you can optionally view the members of the cluster as well: ``` -set spark.sql.shuffle.partitions=7; -show members; +SET spark.sql.shuffle.partitions=8; +SHOW members; ``` Let's do a quick count to make sure we have the ingested data: ```sql -select count(*) from aggrAdImpressions; +SELECT COUNT(*) FROM aggrAdImpressions; ``` Now, lets run some OLAP queries on the column table of exact data. First, lets find the top 20 geographies with the most ad impressions: ```sql -select count(*) AS adCount, geo from aggrAdImpressions group by geo order by adCount desc limit 20; +SELECT COUNT(*) AS adCount, geo FROM aggrAdImpressions GROUP BY geo ORDER BY adCount DESC LIMIT 20; ``` Next, let's find the total uniques for a given ad, grouped by geography: ```sql -select sum(uniques) AS totalUniques, geo from aggrAdImpressions where publisher='publisher11' group by geo order by totalUniques desc limit 20; +SELECT SUM(uniques) AS totalUniques, geo FROM aggrAdImpressions WHERE publisher='publisher11' GROUP BY geo ORDER BY totalUniques DESC LIMIT 20; ``` Now that we've seen some standard OLAP queries over the exact data, let's execute the same queries on our sample tables @@ -316,30 +327,30 @@ table would be much higher than the sample tables. Since this is an example, the we are showcasing how easy AQP is to use. We are asking for an error rate of 20% or below and a confidence interval of 0.95 (note the last two clauses on the query). -The addition of these last two clauses route the query to the sample table despite the exact table being in the FROM +The addition of these last two clauses route the query to the sample table despite the base table being in the FROM clause. If the error rate exceeds 20% an exception will be produced: ```sql -select count(*) AS adCount, geo from aggrAdImpressions group by geo order by adCount desc limit 20 with error 0.20 confidence 0.95 ; +SELECT COUNT(*) AS adCount, geo FROM aggrAdImpressions GROUP BY geo ORDER BY adCount DESC LIMIT 20 WITH ERROR 0.20 CONFIDENCE 0.95 ; ``` And the second query from above: ```sql -select sum(uniques) AS totalUniques, geo from aggrAdImpressions where publisher='publisher11' group by geo order by totalUniques desc limit 20 with error 0.20 confidence 0.95 ; +SELECT SUM(uniques) AS totalUniques, geo FROM aggrAdImpressions WHERE publisher='publisher11' GROUP BY geo ORDER BY totalUniques DESC LIMIT 20 WITH ERROR 0.20 CONFIDENCE 0.95 ; ``` Note that you can still query the sample table without specifying error and confidence clauses by simply specifying the sample table in the FROM clause: ```sql -select sum(uniques) AS totalUniques, geo from sampledAdImpressions where publisher='publisher11' group by geo order by totalUniques desc; +SELECT SUM(uniques) AS totalUniques, geo FROM sampledAdImpressions WHERE publisher='publisher11' GROUP BY geo ORDER BY totalUniques DESC; ``` Now, we check the size of the sample table: ```sql -select count(*) as sample_cnt from sampledAdImpressions; +SELECT COUNT(*) AS sample_cnt FROM sampledAdImpressions; ``` Finally, stop the SnappyData cluster with: diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 67aee85..fb39c15 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -94,14 +94,15 @@ object SnappyLogAggregator extends SnappySQLJob with App { .option("kafka.bootstrap.servers", brokerList) .option("value.deserializer", classOf[ByteArrayDeserializer].getName) .option("startingOffsets", "earliest") - // limiting maximum events to be processed in a single batch - .option("maxOffsetsPerTrigger", 100000) .option("subscribe", kafkaTopic) - .load().select("value").as[Array[Byte]](Encoders.BINARY) + .load() + // projecting only value column of the Kafka data an using + .select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { // Reuse deserializer for each partition which will internally reuse decoder and data object val deserializer = new AdImpressionLogAVRODeserializer itr.map(data => { + // deserializing AVRO binary data and formulating Row out of it val adImpressionLog = deserializer.deserialize(data) Row(new java.sql.Timestamp(adImpressionLog.getTimestamp), adImpressionLog.getPublisher .toString, adImpressionLog.getAdvertiser.toString, adImpressionLog.getWebsite.toString, @@ -123,11 +124,15 @@ object SnappyLogAggregator extends SnappySQLJob with App { val logStream = windowedDF .writeStream - .format("snappysink") - .queryName("log_aggregator") - .trigger(ProcessingTime("1 seconds")) - .option("tableName", "aggrAdImpressions") + .format("snappysink") // using snappysink as output sink + .queryName("log_aggregator") // name of the streaming query + .trigger(ProcessingTime("1 seconds")) // trigger the batch processing every second + .option("tableName", "aggrAdImpressions") // target table name where data will be ingested + //checkpoint location where the streaming query progress and intermediate aggregation state + // is stored. It should be ideally on some HDFS location. .option("checkpointLocation", snappyLogAggregatorCheckpointDir) + // Only the rows that were updated since the last trigger will be outputted to the sink. + // More details about output mode: https://spark.apache.org/docs/2.1.1/structured-streaming-programming-guide.html#output-modes .outputMode("update") .start diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index d26674b..708dbc8 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -57,7 +57,6 @@ object SparkLogAggregator extends App { .option("kafka.bootstrap.servers", brokerList) .option("value.deserializer", classOf[ByteArrayDeserializer].getName) .option("startingOffsets", "earliest") - .option("maxOffsetsPerTrigger", 100000) .option("subscribe", kafkaTopic) .load().select("value").as[Array[Byte]](Encoders.BINARY) .mapPartitions(itr => { From 1bb8f8ab41f4e6f9cb69a453960cf207d0da9073 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 24 Feb 2020 16:42:21 +0530 Subject: [PATCH 25/30] Adding note declaring AQP related instructions enterprise only. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 71bb3da..176ef8e 100644 --- a/README.md +++ b/README.md @@ -320,6 +320,8 @@ Next, let's find the total uniques for a given ad, grouped by geography: SELECT SUM(uniques) AS totalUniques, geo FROM aggrAdImpressions WHERE publisher='publisher11' GROUP BY geo ORDER BY totalUniques DESC LIMIT 20; ``` +Note: Following instructions will only work with TIBCO ComputeDB distribution and not with Snappydata community distribution. + Now that we've seen some standard OLAP queries over the exact data, let's execute the same queries on our sample tables using SnappyData's [Approximate Query Processing techinques](https://github.com/SnappyDataInc/snappydata/blob/master/docs/aqp.md). In most production situations, the latency difference here would be significant because the volume of data in the exact From ce23b642b401a5e8713d9e44edebbc9f70ea02ca Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 2 Mar 2020 14:26:47 +0530 Subject: [PATCH 26/30] Adding license file --- LICENSE | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c4ec2c3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +Copyright 2019. TIBCO Software Inc. + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS From 4f77b944e4e2d0fedefb66314f5bd21bcbea6106 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 2 Mar 2020 14:30:01 +0530 Subject: [PATCH 27/30] Updating copyright headers --- .../adanalytics/AdImpressionGenerator.scala | 19 ++++-------------- .../AdImpressionLogAVRODeserializer.scala | 19 ++++-------------- .../AdImpressionLogAVROSerializer.scala | 20 ++++--------------- .../io/snappydata/adanalytics/Configs.scala | 19 ++++-------------- .../KafkaAdImpressionProducer.scala | 19 ++++-------------- .../adanalytics/SnappyLogAggregator.scala | 19 ++++-------------- .../adanalytics/SparkLogAggregator.scala | 19 ++++-------------- 7 files changed, 28 insertions(+), 106 deletions(-) diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala index 685de1c..a956325 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionGenerator.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics import java.util.Random diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala index 1260695..8c777a9 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVRODeserializer.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics diff --git a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala index f2057a1..3310718 100644 --- a/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala +++ b/src/main/scala/io/snappydata/adanalytics/AdImpressionLogAVROSerializer.scala @@ -1,20 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ - +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics import java.io.ByteArrayOutputStream diff --git a/src/main/scala/io/snappydata/adanalytics/Configs.scala b/src/main/scala/io/snappydata/adanalytics/Configs.scala index 867be1f..a2ed950 100644 --- a/src/main/scala/io/snappydata/adanalytics/Configs.scala +++ b/src/main/scala/io/snappydata/adanalytics/Configs.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics diff --git a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala index 1d18fd7..10fd499 100644 --- a/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala +++ b/src/main/scala/io/snappydata/adanalytics/KafkaAdImpressionProducer.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index fb39c15..77f384f 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 708dbc8..6a19367 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -1,19 +1,8 @@ /* - * Copyright (c) 2016-2020 TIBCO Software Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you - * may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. See the License for the specific language governing - * permissions and limitations under the License. See accompanying - * LICENSE file. - */ +* Copyright © 2019. TIBCO Software Inc. +* This file is subject to the license terms contained +* in the license file that is distributed with this file. +*/ package io.snappydata.adanalytics From e28e664e20efc1212957334891858dbd30aff960 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 12 Mar 2020 14:00:43 +0530 Subject: [PATCH 28/30] Some corrections in README --- README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 176ef8e..eeb1618 100644 --- a/README.md +++ b/README.md @@ -193,16 +193,6 @@ val logStream = windowedDF .start ``` -#### Ingesting into a Sample table -Finally, create a sample table that ingests from the column table specified above. This is the table that approximate -queries will execute over. Here we create a query column set on the 'geo' column, specify how large of a sample we want -relative to the column table (3%) and specify which table to ingest from: - -```scala -snappy.sql("CREATE SAMPLE TABLE sampledAdImpressions" + -" OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions')") -``` - ### Let's get this going In order to run this example, we need to install the following: @@ -284,7 +274,7 @@ up with `Input Rate` and `Processing Time` remains less than the trigger interva Now, we can run some interactive analytic queries on the pre-aggregated data. From the root SnappyData folder, enter: ``` -./bin/snappy-shell +./bin/snappy-sql ``` Once this loads, connect to your running local cluster with: @@ -323,11 +313,19 @@ SELECT SUM(uniques) AS totalUniques, geo FROM aggrAdImpressions WHERE publisher= Note: Following instructions will only work with TIBCO ComputeDB distribution and not with Snappydata community distribution. Now that we've seen some standard OLAP queries over the exact data, let's execute the same queries on our sample tables -using SnappyData's [Approximate Query Processing techinques](https://github.com/SnappyDataInc/snappydata/blob/master/docs/aqp.md). +using SnappyData's [Approximate Query Processing techniques](https://github.com/SnappyDataInc/snappydata/blob/master/docs/aqp.md). In most production situations, the latency difference here would be significant because the volume of data in the exact table would be much higher than the sample tables. Since this is an example, there will not be a significant difference; we are showcasing how easy AQP is to use. +Create a sample table that ingests from the column table specified above. This is the table that approximate +queries will execute over. Here we create a query column set on the 'geo' column, specify how large of a sample we want +relative to the column table (3%) and specify which table to ingest from: + +```sql +CREATE SAMPLE TABLE sampledAdImpressions OPTIONS(qcs 'geo', fraction '0.03', strataReservoirSize '50', baseTable 'aggrAdImpressions'); +``` + We are asking for an error rate of 20% or below and a confidence interval of 0.95 (note the last two clauses on the query). The addition of these last two clauses route the query to the sample table despite the base table being in the FROM clause. If the error rate exceeds 20% an exception will be produced: From 2896620d24a8621e5255bbb18abb095d543d6368 Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Thu, 12 Mar 2020 14:53:45 +0530 Subject: [PATCH 29/30] - Changing artifact name to `snappy-examples` from `snappy-poc` - updating all doc references of `snappy-poc` to `snappy-examples` --- README.md | 16 ++++++++-------- assembly/build.gradle | 2 +- build.gradle | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index eeb1618..c527432 100644 --- a/README.md +++ b/README.md @@ -218,10 +218,10 @@ bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 8 --topic a Checkout the Ad analytics example ``` -git clone https://github.com/SnappyDataInc/snappy-poc.git +git clone https://github.com/SnappyDataInc/snappy-examples.git ``` -Next from the checkout `/snappy-poc/` directory, build the example +Next from the checkout `/snappy-examples/` directory, build the example ``` -- Build and create a jar having all dependencies in assembly/build/libs ./gradlew assemble @@ -234,11 +234,11 @@ Goto the SnappyData product install home directory. In conf subdirectory, create file "spark-env.sh" (copy spark-env.sh.template) and add this line ... ``` -SPARK_DIST_CLASSPATH=/assembly/build/libs/snappy-poc-1.1.1-assembly.jar +SPARK_DIST_CLASSPATH=/assembly/build/libs/snappy-examples-1.2.0-assembly.jar ``` -> Make sure you set the `snappy_poc_home` directory appropriately above +> Make sure you set the `snappy_examples_home` directory appropriately above -Leave this file open as you will copy/paste the path for `snappy_poc_home` shortly. +Leave this file open as you will copy/paste the path for `snappy_examples_home` shortly. Start SnappyData cluster using following command from installation directory. @@ -252,7 +252,7 @@ Submit the streaming job to the cluster and start it (consume the stream, aggreg > Make sure you copy/paste the SNAPPY_POC_HOME path from above in the command below where indicated ``` -./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar $SNAPPY_POC_HOME/assembly/build/libs/snappy-poc-1.2.0-assembly.jar +./bin/snappy-job.sh submit --lead localhost:8090 --app-name AdAnalytics --class io.snappydata.adanalytics.SnappyLogAggregator --app-jar $SNAPPY_EXAMPLES_HOME/assembly/build/libs/snappy-examples-1.2.0-assembly.jar ``` 8090 is the default port of spark-jobserver which is used to manage snappy jobs. @@ -261,7 +261,7 @@ SnappyData supports "Managed Spark Drivers" by running these in Lead nodes. So, automatically re-start on a standby node. While the Lead node starts the streaming job, the actual work of parallel processing from Apache Kafka, etc is done in the SnappyData servers. Servers execute Spark Executors collocated with the data. -Start generating and publishing logs to Kafka from the `/snappy-poc/` folder +Start generating and publishing logs to Kafka from the `/snappy-examples/` folder ``` ./gradlew generateAdImpressions ``` @@ -372,7 +372,7 @@ store data in column and sample tables and interactively query data. All in a si [SnappyData Docs](http://snappydatainc.github.io/snappydata/) -[This Example Source](https://github.com/SnappyDataInc/snappy-poc) +[This Example Source](https://github.com/SnappyDataInc/snappy-examples) [SnappyData Technical Paper](http://www.snappydata.io/snappy-industrial) diff --git a/assembly/build.gradle b/assembly/build.gradle index f33b252..767a278 100644 --- a/assembly/build.gradle +++ b/assembly/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.github.johnrengelman.shadow' -archivesBaseName = 'snappy-poc' +archivesBaseName = 'snappy-examples' dependencies { compile rootProject diff --git a/build.gradle b/build.gradle index b93622d..0b5aa66 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'com.commercehub.gradle.plugin.avro' version "0.5.0" } -archivesBaseName = 'snappy-poc' +archivesBaseName = 'snappy-examples' allprojects { From 39cbc1956903a0074d428956343fc49963115c0f Mon Sep 17 00:00:00 2001 From: Vatsal Mevada Date: Mon, 16 Mar 2020 11:02:06 +0530 Subject: [PATCH 30/30] Setting watermark delayThreshold to 0 seconds to make sure that the streaming aggregation state is cleaned up immediately- This also means delayed events won't be adjusted with the aggregation state. We are anyways not handling delayed events in this use case as we are using column table without key columns hence the sink will always use insert operation. In order to handle delayed events we will need to use putInto which will be very expensive anyways. SNAP-3285 is logged to handle delayed events in more optimized manner. --- README.md | 2 +- .../io/snappydata/adanalytics/SnappyLogAggregator.scala | 6 +++--- .../io/snappydata/adanalytics/SparkLogAggregator.scala | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c527432..795e4f3 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ val df = snappy.readStream // Aggregating records with val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) - .withWatermark("eventTime", "10 seconds") + .withWatermark("eventTime", "0 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") .agg(unix_timestamp(min("timestamp"), "MM-dd-yyyy HH:mm:ss").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias("imps"), diff --git a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala index 77f384f..10f570a 100644 --- a/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SnappyLogAggregator.scala @@ -72,8 +72,8 @@ object SnappyLogAggregator extends SnappySQLJob with App { " geo string, avg_bid double, imps long, uniques long) " + "using column options(buckets '11')") - val schema = StructType(Seq(StructField("timestamp", TimestampType), StructField("publisher", - StringType), StructField("advertiser", StringType), + val schema = StructType(Seq(StructField("timestamp", TimestampType), + StructField("publisher", StringType), StructField("advertiser", StringType), StructField("website", StringType), StructField("geo", StringType), StructField("bid", DoubleType), StructField("cookie", StringType))) @@ -104,7 +104,7 @@ object SnappyLogAggregator extends SnappySQLJob with App { // Aggregating records with val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) - .withWatermark("eventTime", "10 seconds") + .withWatermark("eventTime", "0 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") .agg(unix_timestamp(min("timestamp"), "MM-dd-yyyy HH:mm:ss").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias("imps"), diff --git a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala index 6a19367..23157ae 100644 --- a/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala +++ b/src/main/scala/io/snappydata/adanalytics/SparkLogAggregator.scala @@ -61,7 +61,7 @@ object SparkLogAggregator extends App { // Group by on sliding window of 1 second val windowedDF = df.withColumn("eventTime", $"timestamp".cast("timestamp")) - .withWatermark("eventTime", "10 seconds") + .withWatermark("eventTime", "0 seconds") .groupBy(window($"eventTime", "1 seconds", "1 seconds"), $"publisher", $"geo") .agg(min("timestamp").alias("timestamp"), avg("bid").alias("avg_bid"), count("geo").alias ("imps"), approx_count_distinct("cookie").alias("uniques"))

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 WK6djSdrz#@%xQC`#!g-Aky1To(yOr2T|W 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