Запись в файл в HDFS в Hadoop
Я искал дисковое интенсивное приложение Hadoop для тестирования активности ввода-вывода в Hadoop, но я не мог найти такого приложения, которое поддерживало бы использование диска выше, скажем, 50% или какое-то такое приложение, которое фактически держит диск занятым. Я попробовал randomwriter, но это удивительно не интенсивный дисковый ввод-вывод.
Итак, я написал крошечную программу для создания файла в Mapper и записи в него текста. Это приложение работает хорошо, но использование высоко только в главном узле который также является узлом имени, job tracker и одним из рабов. Использование диска равно нулю или незначительно в других трекерах задач. Я не могу понять, почему дисковый ввод-вывод так низок в трекерах задач. Может кто-нибудь подтолкнуть меня в правильном направлении, если я делаю что-то неправильно? Спасибо заранее.
вот мой пример сегмента кода, который я написал в WordCount.файл java для создания и записи строки UTF в файл -
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path outFile;
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
outFile = new Path("./dummy"+ context.getTaskAttemptID());
FSDataOutputStream out = fs.create(outFile);
out.writeUTF("helloworld");
out.close();
fs.delete(outFile);
}
2 ответов
Я думаю, что любой механизм, который создает объекты java на ячейку в каждой строке и запускает любую сериализацию объектов java перед сохранением его на диск, имеет мало шансов использовать IO.
По моему опыту сериализация работает со скоростью несколько Мб в секунду или немного больше, но не 100 МБ в секунду.
Так что ты избегаешь Hadoop и слои на пути выхода вполне имеет право.
Теперь рассмотрим, как работает запись в HDFS. Данные записываются на локальный диск через местные datanode, а затем синхронно с другими узлами в сети, в зависимости от вашего коэффициента репликации. В этом случае вы не можете записать больше данных в HDFS, чем пропускная способность сети. Если ваш кластер относительно невелик, вещи приобретают ценность. Для кластера 3 узлов и тройной репликации вы будете направлять все данные ко всем узлам, поэтому пропускная способность записи HDFS всего кластера будет около 1 Гбит - если у вас есть такая сеть.
Итак, я бы предложил:
a) уменьшите коэффициент репликации до 1, таким образом остановите быть связан сетью.
b) напишите большие куски данных в одном вызове mapper
OK. Должно быть, я был очень глуп, что не проверил раньше. Фактическая проблема заключалась в том, что все мои узлы данных на самом деле не работали. Я переформатировал namenode и все встало на свои места, я получал использование 15-20%, что неплохо для WC. Я запущу его для TestDFSIO и посмотрю, смогу ли я использовать диск еще больше.