1

关于 Spark 的一些基本问题。我们可以仅在处理作业的上下文中使用 spark想查看一些带有一些搜索条件的报告,我们可以使用 Spark(Spark SQL)吗?或者为此我们应该限制为 cql 吗?如果我们可以使用 spark ,我们如何从部署在 tomcat 服务器中的 web 服务调用 spark-sql 。

4

1 回答 1

0

好吧,你可以通过 HTML 地址传递一个 SQL 请求来做到这一点,例如:

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

在接收点,架构将类似于:

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

在 servlet 中(如果你不知道 servlet 是什么,最好查一下)在你的 tomcat 的 webapplication 文件夹中,你会有这样的东西:

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));

在 Spark Streaming 运行应用程序中(您需要运行它才能捕获查询,否则您知道 Spark 启动需要多长时间),您需要有一个 Kafka Receiver

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 设置 GET 正文或将参数提供给查询
  2. GET 被您的 servlet 捕获,它立即创建、发送、关闭 Kafka 生产者(实际上可以避免 Kafka 步骤,只需以任何其他方式向您的 Spark Streaming 应用程序发送信息;请参阅 SparkStreaming 接收器)
  3. Spark Streaming 像任何其他提交的 Spark 应用程序一样操作您的 SparkSQL 代码,但它会继续运行以等待其他查询的到来。

当然,在 servlet 中您应该检查请求的有效性,但这是主要思想。或者至少我一直在使用的架构

于 2016-07-18T09:17:19.780 回答