Использование API файловой системы Apache Ozone приводит к ошибке
Я хочу загрузить файл в Apache Ozone. Я используюFileSystem
интерфейс. Код Java выглядит следующим образом
код Java:
Configuration conf = new Configuration();
conf.addResource(new OzoneConfiguration());
System.setProperty("HADOOP_USER_NAME", "work");
FileSystem fs = FileSystem.get(conf); //"fs.defaultFS" o3fs://bucket1.volume1/
String objectName = UUID.randomUUID().toString();
byte[] objectData = readFile(objectName);
Path newfilePath = new Path("/" + objectName);
FSDataOutputStream outputStream = fs.create(newfilePath, (short) 3);
outputStream.write(objectData);
outputStream.flush();
IOUtils.closeStream(outputStream);
fs.close();
Я помещаю файл конфигурации в папку "Ресурсы".
core-site.xml
конфигурация:
<property>
<name>fs.o3fs.impl</name>
<value>org.apache.hadoop.fs.ozone.BasicOzoneFileSystem</value>
</property>
<property>
<name>fs.AbstractFileSystem.o3fs.impl</name>
<value>org.apache.hadoop.fs.ozone.OzFs</value>
</property>
<property>
<name>fs.defaultFS</name>
<value>o3fs://bucket1.volume1/</value>
</property>
Исключение составляет:
Exception in thread "main" java.lang.NullPointerException: client is null
at java.util.Objects.requireNonNull(Objects.java:228)
at org.apache.hadoop.hdds.scm.XceiverClientRatis.getClient(XceiverClientRatis.java:201)
at org.apache.hadoop.hdds.scm.XceiverClientRatis.sendRequestAsync(XceiverClientRatis.java:227)
at org.apache.hadoop.hdds.scm.XceiverClientRatis.sendCommandAsync(XceiverClientRatis.java:305)
at org.apache.hadoop.hdds.scm.storage.ContainerProtocolCalls.writeChunkAsync(ContainerProtocolCalls.java:315)
at org.apache.hadoop.hdds.scm.storage.BlockOutputStream.writeChunkToContainer(BlockOutputStream.java:599)
at org.apache.hadoop.hdds.scm.storage.BlockOutputStream.writeChunk(BlockOutputStream.java:452)
at org.apache.hadoop.hdds.scm.storage.BlockOutputStream.handleFlush(BlockOutputStream.java:463)
at org.apache.hadoop.hdds.scm.storage.BlockOutputStream.flush(BlockOutputStream.java:429)
at org.apache.hadoop.ozone.client.io.BlockOutputStreamEntry.flush(BlockOutputStreamEntry.java:137)
at org.apache.hadoop.ozone.client.io.KeyOutputStream.handleStreamAction(KeyOutputStream.java:489)
at org.apache.hadoop.ozone.client.io.KeyOutputStream.handleFlushOrClose(KeyOutputStream.java:455)
at org.apache.hadoop.ozone.client.io.KeyOutputStream.flush(KeyOutputStream.java:428)
at org.apache.hadoop.fs.ozone.OzoneFSOutputStream.flush(OzoneFSOutputStream.java:51)
at java.io.FilterOutputStream.flush(FilterOutputStream.java:140)
at java.io.DataOutputStream.flush(DataOutputStream.java:123)
at FSTest.main(FSTest.java:28)
pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-ozone-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-ozone-client</artifactId>
<version>0.5.0-beta</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-ozone-filesystem-lib-legacy -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-ozone-filesystem-lib-legacy</artifactId>
<version>0.5.0-beta</version>
</dependency>
1 ответ
https://docs.alluxio.io/os/user/edge/en/ufs/Ozone.html
Обратитесь к этим документам, в ozone-0.5.0-beta есть ошибка, связанная с ScmClientConfig, поэтому вам нужно добавить следующую конфигурацию в ozone-site.xml
<configuration>
<property>
<name>ozone.scm.names</name>
<value>localhost</value>
</property>
<property>
<name>scm.container.client.max.size</name>
<value>256</value>
</property>
<property>
<name>scm.container.client.idle.threshold</name>
<value>10s</value>
</property>
<property>
<name>hdds.ratis.raft.client.rpc.request.timeout</name>
<value>60s</value>
</property>
<property>
<name>hdds.ratis.raft.client.async.outstanding-requests.max</name>
<value>32</value>
</property>
<property>
<name>hdds.ratis.raft.client.rpc.watch.request.timeout</name>
<value>180s</value>
</property>
</configuration>
Надеюсь, это поможет тебе.