Java 在HDFS中写入avro文件-存在
目前我正在学习spark streaming和avro,所以我的第一个例子是,读取spark RDD并构建通用记录,创建avro文件,这个文件我应该用HDFS编写。现在我可以打开avro文件了,我是否会在HDFS的文件中添加附件 这段代码编写了一个avro文件,但当我尝试添加或追加时,它失败了。我正在为此使用Java8Java 在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 {
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;
});