Java Spark中的流文件流口水

Java Spark中的流文件流口水,java,apache-spark,hadoop,spark-streaming,drools,Java,Apache Spark,Hadoop,Spark Streaming,Drools,我们能够成功地将drools与spark集成,当我们尝试应用drools中的规则时,我们能够对HDFS中的批处理文件进行处理,但我们尝试将drools用于流文件,以便我们能够立即做出决定,但是我们不知道怎么做。下面是我们试图实现的代码片段。 案例1: SparkConf conf = new SparkConf().setAppName("sample"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRD

我们能够成功地将drools与spark集成,当我们尝试应用drools中的规则时,我们能够对HDFS中的批处理文件进行处理,但我们尝试将drools用于流文件,以便我们能够立即做出决定,但是我们不知道怎么做。下面是我们试图实现的代码片段。
案例1:

    SparkConf conf = new SparkConf().setAppName("sample");
    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<String> javaRDD = sc.textFile("/user/root/spark/sample.dat");
    List<String> store = new ArrayList<String>();
    store = javaRDD.collect();
SparkConf conf=new SparkConf().setAppName(“示例”);
JavaSparkContext sc=新的JavaSparkContext(conf);
JavaRDD JavaRDD=sc.textFile(“/user/root/spark/sample.dat”);
列表存储=新建ArrayList();
store=javaRDD.collect();
案例2:当我们使用流媒体上下文时

SparkConf sparkconf = new SparkConf().setAppName("sparkstreaming");
    JavaStreamingContext ssc = 
              new JavaStreamingContext(sparkconf, new Duration(1));

    JavaDStream<String> lines = ssc.socketTextStream("xx.xx.xx.xx", xxxx);
SparkConf SparkConf=new SparkConf().setAppName(“sparkstreaming”);
JavaStreamingContext ssc=
新的JavaStreamingContext(sparkconf,新的持续时间(1));
JavaDStream lines=ssc.socketTextStream(“xx.xx.xx.xx”,xxxx);
在第一种情况下,我们可以在变量存储上应用规则,但在第二种情况下,我们无法在
dstream
行上应用规则


如果有人有一些想法,如何做到这一点,将是一个很大的帮助

这里有一种方法可以完成

  • 首先使用业务规则创建知识会话

    //Create knowledge and session here
    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add( ResourceFactory.newFileResource( "rulefile.drl"),
            ResourceType.DRL );
    Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
    kbase.addKnowledgePackages( pkgs );
    final StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
    
    //在此处创建知识和会话
    KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
    KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newFileResource(“rulefile.drl”),
    ResourceType.DRL);
    集合pkgs=kbuilder.getKnowledgePackages();
    kbase.addKnowledgePackages(PKG);
    final StatelessKnowledgeSession ksession=kbase.newStatelessKnowledgeSession();
    
  • 使用StreamingContext创建JavaDStream

    SparkConf sparkconf = new SparkConf().setAppName("sparkstreaming");
    JavaStreamingContext ssc = 
              new JavaStreamingContext(sparkconf, new Duration(1));
    JavaDStream<String> lines = ssc.socketTextStream("xx.xx.xx.xx", xxxx);  
    
    SparkConf SparkConf=new SparkConf().setAppName(“sparkstreaming”);
    JavaStreamingContext ssc=
    新的JavaStreamingContext(sparkconf,新的持续时间(1));
    JavaDStream lines=ssc.socketTextStream(“xx.xx.xx.xx”,xxxx);
    
  • 调用DStream的foreachRDD创建事实并触发规则

    lines.foreachRDD(new Function<JavaRDD<String>, Void>() {
      @Override
      public Void call(JavaRDD<String> rdd) throws Exception {
         List<String> facts = rdd.collect();
         //Apply rules on facts here
         ksession.execute(facts);
         return null;
      }
    });
    
    lines.foreachRDD(新函数(){
    @凌驾
    公共Void调用(JavaRDD)引发异常{
    List facts=rdd.collect();
    //在这里应用事实规则
    执行(事实);
    返回null;
    }
    });
    

  • 例如,我给user/root/,original将是user/vish/spark/sample.datDid@krishna gajula的答案工作?下面的答案对你有用吗?