我在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)
输出为空白,如下所示。没有文件被读取,也没有流式传输。
我在上面的代码中输入的路径如下:
[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
有人可以解释我哪里出错吗?或者语法是否有任何问题(虽然我没有遇到任何错误),因为我是新来的火花?
答案 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);
}
}