Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在HDFS中写入avro文件-存在_Java_Apache Kafka_Hdfs_Avro - Fatal编程技术网

Java 在HDFS中写入avro文件-存在

Java 在HDFS中写入avro文件-存在,java,apache-kafka,hdfs,avro,Java,Apache Kafka,Hdfs,Avro,目前我正在学习spark streaming和avro,所以我的第一个例子是,读取spark RDD并构建通用记录,创建avro文件,这个文件我应该用HDFS编写。现在我可以打开avro文件了,我是否会在HDFS的文件中添加附件 这段代码编写了一个avro文件,但当我尝试添加或追加时,它失败了。我正在为此使用Java8 public static void saveAvro(GenericRecord record, Schema schema) throws IOException {

目前我正在学习spark streaming和avro,所以我的第一个例子是,读取spark RDD并构建通用记录,创建avro文件,这个文件我应该用HDFS编写。现在我可以打开avro文件了,我是否会在HDFS的文件中添加附件

这段代码编写了一个avro文件,但当我尝试添加或追加时,它失败了。我正在为此使用Java8

public static void saveAvro(GenericRecord record, Schema schema) throws IOException {

        DatumWriter<GenericRecord> bdPersonDatumWriter = new GenericDatumWriter<>(schema);
        DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<>(bdPersonDatumWriter);

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create("hdfs://sandbox-hdp.hortonworks.com:8020/tmp/poc/ResultHDFSTest.avro"),
                conf);
        Path F = new Path("hdfs://sandbox-hdp.hortonworks.com:8020/tmp/poc/ResultHDFSTest.avro");
        fs.setReplication(F, (short) 1);

        if (!fs.exists(F)) {
            System.out.println("File not exists.. creating....");
            OutputStream out = fs.create(F, (short) 1);
            System.out.println("OutputStream create.");
            dataFileWriter.create(schema, out);
            System.out.println("dataFileWriter create.");
            dataFileWriter.append(record);
            System.out.println("dataFileWriter append OK {0} .");

        } else {
            //Here fail, not open file.. avro stored in HDFS
            System.out.println("File exists....");
           // I want to add information to an existing avro file.
            dataFileWriter.append(record);
            System.out.println("dataFileWriter append OK {1} .");
        }
        dataFileWriter.close();
        System.out.println("dataFileWriter closed.");

    }
    
publicstaticvoidsaveavro(GenericRecord,Schema)抛出IOException{
DatumWriter bdPersonDatumWriter=新的通用DatumWriter(模式);
DataFileWriter DataFileWriter=新的DataFileWriter(bdPersonDatumWriter);
Configuration conf=新配置();
FileSystem fs=FileSystem.get(URI.create(“hdfs://sandbox-hdp.hortonworks.com:8020/tmp/poc/ResultHDFSTest.avro"),
形态);
路径F=新路径(“hdfs://sandbox-hdp.hortonworks.com:8020/tmp/poc/ResultHDFSTest.avro");
fs.setReplication(F,(short)1);
如果(!fs.存在(F)){
System.out.println(“文件不存在..正在创建…”);
OutputStream out=fs.create(F,(short)1);
System.out.println(“OutputStream create”);
创建(schema,out);
System.out.println(“dataFileWriter创建”);
dataFileWriter.append(记录);
println(“dataFileWriter附加OK{0}”);
}否则{
//此处失败,未打开文件..存储在HDFS中的avro
System.out.println(“文件存在…”);
//我想将信息添加到现有的avro文件中。
dataFileWriter.append(记录);
println(“dataFileWriter附加OK{1}”);
}
dataFileWriter.close();
System.out.println(“dataFileWriter关闭”);
}
附加存在文件avro HDFS的堆栈跟踪:

线程“main”org.apache.avro.AvroRuntimeException中的异常:非 打开 位于org.apache.avro.file.DataFileWriter.assertOpen(DataFileWriter.java:88) 位于org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:311) 位于com.test.avro.App.saveAvro(App.java:83) 位于com.test.avro.App.main(App.java:55)

DataFileWriter appendTo方法只接受java.nio文件。我想做的是正确的还是有其他方法

编辑1。 我想将信息添加到现有文件中

第一个代码片段显示了您试图创建avro文件的实现。这里是我的spark streaming的框架代码:

JavaStreamingContext jssc = sparkConfigurationBuilder
                .buildJSC(sparkConfigurationBuilder.buildSparkConfiguration());
    
    jssc.sparkContext().checkpointFile("c:\\tmp");
    Map<String, Object> kafkaParams = sparkDriverUtils.getKafkaProperties();        
    Collection<String> topics = Arrays.asList(sparkDriverUtils.getTopics().trim().split(","));// 1 o more topics        
    LOGGER.warn("Lista de Topics: " + topics.toString());
    
JavaStreamingContext jssc=SparkConfiguration Builder
.buildJSC(SparkConfiguration Builder.buildSparkConfiguration());
jssc.sparkContext().checkpointFile(“c:\\tmp”);
Map kafkaParams=sparkDriverUtils.getKafkaProperties();
集合主题=Arrays.asList(sparkDriverUtils.getTopics().trim().split(“,”);//1 o更多主题
LOGGER.warn(“Lista de Topics:+Topics.toString());

JavaInputDStream=KafkaUtils.createDirectStream(jssc,
LocationStrategies.PreferConsistent(),
订阅(主题,卡夫卡帕兰));
//此数据流导致avro。。
JavadStreamTransactionsDS=transactions.map(f->{
事务txn=jsonMapperUtil.rowToTransaction(f);
warn(“returnar:JavaDStream”);
返回txn;
});
现在,我想将transactionsDS结果另存为HDFS中的avro文件。我有一个问题,JavaStreamingContext我可以为数据集创建SparkSession,或者我应该改变订阅kafka代理的方式吗

问候

DataFileWriter appendTo方法只接受文件java.nio

对。Avro与HDFS路径没有连接

为了“附加到HDFS文件”,您需要在本地下载它们,然后覆盖它们的全部内容



除此之外,您提到了Spark流,但所示代码中没有任何部分实际使用Spark API调用

为什么要使用RDD或低级Java API?Spark具有内置的Avro支持。。。谢谢,我看到了url,SparkSession,它可以通过与Java InputStream相同的流传输方式向kafka broker订阅吗?还是与Java InputStream相同?找个Sparkession?你在用卡夫卡吗?似乎您在这里只使用HDFS。您正在使用合流模式注册表吗?或者通过Kafka+Avro阅读任何有关Spark/Flink的Cloudera博客?嗨,是的,我正在使用Cassandra、Kafka+Kafka连接器(镜头作为源)和Spark streaming,我想将我的结果保存为Avro,保存在HDFS中。现在,我正在处理第一次保存到本地系统和移动到hdfs后的变通方法,但我将使用流媒体查看Sql Spark。我将使用流集或Nifi,而不是为此编写Spark代码编辑我的问题,我添加了Spark代码段。当做
JavaInputDStream<ConsumerRecord<String, String>> stream = KafkaUtils.createDirectStream(jssc,
                LocationStrategies.PreferConsistent(),
                ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams));
//This DSTream resulto to avro..
JavaDStream<Transactions> transactionsDS = transactions.map(f-> {
            Transactions txn = jsonMapperUtil.rowToTransaction(f);
            LOGGER.warn("Retornar  : JavaDStream<Transactions>");
            return  txn;
        });