Я пытаюсь профилировать, какие функции занимают больше всего времени для задания TeraSort Hadoop.для моей тестовой системы я использую базовую псевдораспределенную установку с 1 узлом.Это означает, что все JVM NameNode, DataNode, Tasktracker и Jobtracker работают на одном компьютере.
Сначала я генерирую ~ 9 ГБ данных с помощью TeraGen, а затем запускаю на нем TeraSort.Пока выполняются JVM, я проверяю их выполнение с помощью VisualVM.Я знаю, что это не самый точный профилировщик, но он бесплатный и простой в использовании!Я использую последнюю версию дистрибутива Apache hadoop, и мои эксперименты проводятся на системе на базе Intel Atom.
Когда я смотрю на Self time (CPU) для Hot Spots-Methods в VisualVM, я вижу java.Функция util.zip.CRC32.update () занимает почти 40% общего времени.Когда я смотрю на эту функцию в дереве вызовов, она вызывается функцией main () маппера, особенно когда IdentityMapper.map () читает входные файлы из HDFS.Функция, которая фактически выполняет вызов функции CRC32.update (): org.apache.hadoop.fs.FSInputChecker.readChecksumChunk ()
У меня есть три вопроса по этому поводу:
Почему контрольная сумма CRC32 обновляется для блоков, считываемых из HDFS?Если я правильно понимаю, как только блок прочитан, простое сравнение данных, считанных с диска, с CRC блока должно быть единственной операцией, а не генерировать и обновлять значение CRC блока.
Я искал источник для функции обновления, и она реализована в файле java.util.zip.CRC32.java.Конкретная вызываемая функция - это перегруженный метод update () с тремя аргументами.Поскольку эта функция реализована в Java, возможно ли, что несколько уровней абстракции (Hadoop, JVM, инструкции процессора) снижают собственную эффективность вычисления CRC?
Наконец, есть ли что-тосовершенно неправильно с моей методологией VisualVM или интерпретацией результатов выборки?
Спасибо,