Разница между distcp и distcp -update заключается в том, что distcp по умолчанию пропускает файлы, а "distcp -update" обновляет файл, если размер src отличается от размера dst.
Это немного сбивает с толку в документации, так как по умолчанию distcp пропускает, если существует файл для предотвращения столкновения.
Из документов:
"Как отмечалось выше, это не операция" синхронизации ". Единственный проверенный критерий - это размеры файла источника и назначения; если они различаются, файл замены заменяет файл назначения."
Имейте в виду, -update
не является дельта-сферным алгоритмом, подобным rsync, и выполняет только проверку размера, которая не идеальна, когда файлы имеют одинаковый размер, но данные отличаются.
Я должен также уточнить некоторые и объяснить, что distcp -overwrite
будет перезаписывать файл независимо от того, совпадает ли размер или нет. Это разрушительный процесс, поэтому убедитесь, что вы действительно хотите это сделать.
Здесь можно найти несколько замечательных примеров: http://hadoop.apache.org/common/docs/r0.19.2/distcp.html#uo
Я также хочу привести пример того, что я делаю в операции синхронизации между двумя кластерами:
hadoop distcp -pugp -i -delete -update hftp://hdfs-nn1:50070/clustera hdfs://hdfs-nn2:9000/clustera
Это обновит все файлы в hdfs-nn2, которые не соответствуют по размеру из hdfs-nn1, а также удалит все посторонние файлы. При использовании .Trash все удаленные файлы помещаются в корзину пользователя, вызывающего distcp.
Я бы немного поэкспериментировал с этим, чтобы вы могли увидеть эффект от различных команд, так как это может быть болезненно, когда вы случайно удаляете ТБ данных, поэтому обязательно используйте вашу корзину.