Мы создали java REST-API для получения данных о событиях (например, при нажатии на кнопку покупки) и записи этих данных в HDFS. По сути, мы открываем потоки для каждого хоста, который отправляет данные (в формате JSON), или используем существующие, обогащаем данные отметкой времени, именем события и именем хоста и записываем их в (FS)DataOutputStream:
1 public synchronized void writeToFile(String filename, String hostname, String content) throws IOException {
2 FSDataOutputStream stream = registry.getStream(filename, hostname);
3 stream.writeBytes(content);
4 stream.hflush();
5 }
Во-первых, мы использовали stream.writeChars(content)
в строке 3, что привело к таким файлам, как: .{.".m.e.s.s.a.g.e.".:.".h.e.l.l.o.".}
Глядя на реализацию DataOutputStream.writeChars(String s), вы видите 8-битный сдвиг вправо и добавление начального x00 для каждого символа по причинам i не понимаю.
Затем я попробовал stream.writeUTF(content)
в строке 3, файлы выглядели намного лучше: .W{"message":"hello"}
Но все же, несколько байт на много. Глядя на код, writeUTF(String s) сначала отправляет количество байтов в s, а затем саму строку. Таким образом, .W
представляет количество байтов в данных события, подтвержденное изменением длины данных события, которое показало разные начальные символы в файле.
Так что мое последнее средство, stream.writeBytes(content)
. Здесь все выглядело нормально: {"message":"hello"}
, пока не вступили в действие специальные символы: {"message":"hallöchen"}
стало {"message":"hall.chen"}
. writeBytes вырезает первые 8 бит символа перед его записью. Я думаю, что мне нужна некоторая функциональность UTF-8, чтобы правильно писать эти символы.
Итак, теперь я немного потерян. Как я могу это решить?