1

Некоторые основные вопросы касательно Spark. Можем ли мы использовать искру только в контексте обработки заданий? В нашем случае мы имеем поток данных позиционирования и движения, которые мы можем уточнить и сохранить в таблицах кассандры. Это делается с помощью кафки и искрового потока. Но для веб-пользователя, который хотите просмотреть какой-либо отчет с некоторыми критериями поиска, мы можем использовать Spark (Spark SQL). Для этого мы должны ограничить cql? Если мы сможем использовать искру, как мы можем вызывать искру-sql из веб-службы, развернутой на сервере tomcat.мы можем использовать Spark sql для предоставления запросов в веб-службах REST

+0

Посмотрите на https://github.com/spark-jobserver/spark-jobserver#features. Это можно использовать в пользовательском интерфейсе. Я думаю, что это поддерживает Spark SQL. – satish

+0

Как раз сейчас я заметил, что источник spark-jobserver интегрирован в предприятие datastax 4.8. Базовые данные и кассандра уже существуют во многих системах уровня производства. Поэтому мне интересно узнать, как они интегрируют такие сервисы, связанные с запросами, в производство. Используется ли искра? Или, используя искровые задания, они создают и обновляют данные, связанные с запросами, во многих таблицах, а в веб-приложении они запрашивают такие таблицы непосредственно с драйверами Java и datastax java? Преимущество spark-sql заключается в том, что нам нужно объединить таблицы для получения данных Какой лучший метод? –

ответ

0

Ну, вы можете сделать это путем передачи запроса SQL с помощью HTML-адрес, как:

http://yourwebsite.com/Requests?query=WOMAN 

В точке приема, архитектура будет что-то вроде:

Tomcat+Servlet --> Apache Kafka/Flume --> Spark Streaming --> Spark SQL inside a SS closure 

В сервлета (если вы не знаете, что такое сервлет, лучше посмотрите его) в папке webapplication в вашем tomcat, у вас будет что-то вроде этого:

public class QueryServlet extends HttpServlet{ 
    @Override 
    public void doGet(ttpServletRequest request, HttpServletResponse response){ 
     String requestChoice = request.getQueryString().split("=")[0]; 
     String requestArgument = request.getQueryString().split("=")[1]; 
     KafkaProducer<String, String> producer; 

      Properties properties = new Properties(); 
      properties.setProperty("bootstrap.servers", "localhost:9092"); 
      properties.setProperty("acks", "all"); 
      properties.setProperty("retries", "0"); 
      properties.setProperty("batch.size", "16384"); 
      properties.setProperty("auto.commit.interval.ms", "1000"); 
      properties.setProperty("linger.ms", "0"); 
      properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
      properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
      properties.setProperty("block.on.buffer.full", "true"); 
      producer = new KafkaProducer<>(properties); 
      producer.send(new ProducerRecord<String, String>(
        requestChoice, 
        requestArgument)); 

В Спарк Streaming запущенного приложения (которое вам нужно работать, чтобы поймать запросы, в противном случае вы знаете, как долго он принимает искры, чтобы начать), Вы должны иметь Кафка приемник

JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(batchInt*1000)); 

    Map<String, Integer> topicMap = new HashMap<>(); 
    topicMap.put("wearable", 1); 

    //FIrst Dstream is a couple made by the topic and the value written to the topic 
    JavaPairReceiverInputDStream<String, String> kafkaStream = 
      KafkaUtils.createStream(jssc, "localhost:2181", "test", topicMap); 

После этого то, что происходит в том, что

  1. Вы делаете настройки либо тело GET или давая аргумент запроса
  2. ГЭТ улавливается сервлет, который сразу же создает, отправить GET, закрыть производитель Кафка (его можно фактически избежать Kafka Step, просто отправляя свой Spar k Потоковая передача информации любым другим способом; см. приемники SparkStreaming)
  3. Spark Streaming управляет вашим кодом SparkSQL как и любым другим приложением Spark, но он продолжает работать, ожидая появления других запросов.

Конечно, в сервлете вы должны проверить правильность запроса, но это основная идея. Или, по крайней мере, архитектура, которую я использовал

+0

Мы можем сделать искру SQL, интегрируя в kafka и потоковое. Это O.K. Но есть ли какая-либо альтернатива, например, совместное использование sparkContext для веб-приложения. В случае, если мы используем kafka, нам нужно создать тему для каждого запроса или сохранить одну тему с общим объектом запроса и ответа с типом для идентификации запроса. Эффективность будет лучше? –

+0

К сожалению, контекст искры не является сериализуемым. Я никогда не пытался создать сервлет, который первым запускает контекст искры, а затем сохраняет его активным. Возможно, использование статического блока в начале класса могло бы помочь. Что касается Кафки, нет: все запросы должны быть в одной теме. Если вы решили использовать несколько тем, они должны направить на разные приложения, поскольку они разделены либо на рабочую нагрузку, либо на логику.Кроме того, каждый раз, когда вы создаете разные темы, вы должны каждый раз подписываться на каждый из них. Это невозможно. – Vale