关于 Spark 的一些基本问题。我们可以仅在处理作业的上下文中使用 spark想查看一些带有一些搜索条件的报告,我们可以使用 Spark(Spark SQL)吗?或者为此我们应该限制为 cql 吗?如果我们可以使用 spark ,我们如何从部署在 tomcat 服务器中的 web 服务调用 spark-sql 。
问问题
531 次
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);
在这之后,会发生什么
- 您执行 GET 设置 GET 正文或将参数提供给查询
- GET 被您的 servlet 捕获,它立即创建、发送、关闭 Kafka 生产者(实际上可以避免 Kafka 步骤,只需以任何其他方式向您的 Spark Streaming 应用程序发送信息;请参阅 SparkStreaming 接收器)
- Spark Streaming 像任何其他提交的 Spark 应用程序一样操作您的 SparkSQL 代码,但它会继续运行以等待其他查询的到来。
当然,在 servlet 中您应该检查请求的有效性,但这是主要思想。或者至少我一直在使用的架构
于 2016-07-18T09:17:19.780 回答