当运行中的spark流程序将源代码作为textFileStream时,无法获取任何数据

时间:2017-11-14 12:59:57

标签: scala apache-spark streaming spark-streaming rdd

我在Spark shell上运行以下代码

 >`spark-shell
scala> import org.apache.spark.streaming._
import org.apache.spark.streaming._

scala> import org.apache.spark._
import org.apache.spark._

scala> object sparkClient{
 | def main(args : Array[String])
 | {
 | val ssc = new StreamingContext(sc,Seconds(1))
 | val Dstreaminput = ssc.textFileStream("hdfs:///POC/SPARK/DATA/*")
 | val transformed = Dstreaminput.flatMap(word => word.split(" "))
 | val mapped = transformed.map(word => if(word.contains("error"))(word,"defect")else(word,"non-defect"))
 | mapped.print()
 | ssc.start()
 | ssc.awaitTermination()
 | }
 | }
defined object sparkClient

scala> sparkClient.main(null)

输出为空白,如下所示。没有文件被读取,也没有流式传输。

时间:1510663547000毫秒

时间:1510663548000毫秒

时间:1510663549000 ms

时间:1510663550000毫秒

时间:1510663551000毫秒

时间:1510663552000 ms

时间:1510663553000 ms

时间:1510663554000 ms

时间:1510663555000毫秒

我在上面的代码中输入的路径如下:

[hadoopadmin@master ~]$ hadoop fs -ls /POC/SPARK/DATA/
17/11/14 18:04:32 WARN util.NativeCodeLoader: Unable to load native-hadoop 
library for your platform... using builtin-java classes where applicable
Found 3 items
-rw-r--r--   2 hadoopadmin supergroup      17881 2017-09-21 11:02 
 /POC/SPARK/DATA/LICENSE
-rw-r--r--   2 hadoopadmin supergroup      24645 2017-09-21 11:04 
 /POC/SPARK/DATA/NOTICE
 -rw-r--r--   2 hadoopadmin supergroup        845 2017-09-21 12:35 
 /POC/SPARK/DATA/confusion.txt

有人可以解释我哪里出错吗?或者语法是否有任何问题(虽然我没有遇到任何错误),因为我是新来的火花?

2 个答案:

答案 0 :(得分:1)

textFileStream无法读取预先存在的数据。它只包含新文件:

  通过原子移动或将它们重命名为数据目录,在dataDirectory中创建

https://spark.apache.org/docs/latest/streaming-programming-guide.html#basic-sources

答案 1 :(得分:0)

地球上的每个人都有幸福的权利,无论是火花本身还是火花开发商。

textFileStream()的火花流方法需要在流过程开始后修改文件。这意味着,火花蒸汽将无法读取现有文件。

因此,您可能认为可以复制新文件。但这是一个问题,因为复制不会影响文件的修改时间。

最后一个选项,您可以尝试动态创建新文件。但这很繁琐,应该在火花循环运行时发生。

我编写了一个简单的Java程序,可以动态创建文件。所以现在每个人都很高兴。 :-)(您只需要在classpath上使用commons-io lib。只需一个jar。)

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;

import org.apache.commons.io.IOUtils;

public class CreateFileMain extends JFrame {

    private static final long serialVersionUID = 1L;
    
    Button b;
    public CreateFileMain() {
        b = new Button("Create New File");
        
        b.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                String dir = "C:/Users/spratapw/workspace/batchload1/spark-streaming-poc/input/";
                deleteExistingFiles(dir);
                
                Random r = new Random();
                File f = new File(dir+r.nextInt()+".txt");
                createNewFile(f);
            }

            private void createNewFile(File f) {
                try {
                    f.createNewFile();
                    List<String> lines = new ArrayList<>();
                    lines.add("Hello World");
                    FileOutputStream fos = new FileOutputStream(f);
                    IOUtils.writeLines(lines, "\n", fos, Charset.defaultCharset());
                    fos.close();
                    
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }

            private void deleteExistingFiles(String dir) {
                File filetodelete = new File(dir);
                File[] allContents = filetodelete.listFiles();
                if (allContents != null) {
                    for (File file : allContents) {
                        file.delete();
                    }
                }
            }
        });
        
        
        this.add(b);
        this.setLayout(new FlowLayout());
    }
    
    public static void main(String[] args) throws IOException {
        CreateFileMain m = new CreateFileMain();
        m.setVisible(true);
        m.setSize(200, 200);
        m.setLocationRelativeTo(null);
        m.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
 }

输出: enter image description here