Разница между distcp и distcp-update заключается в том, что distcp по умолчанию пропускает файлы, в то время как «distcp -update» обновляет файл, если размер src отличается от размера dst.
Это немного запутанно в документации, поскольку характер distcp по умолчанию заключается в пропуске, если файл существует для предотвращения столкновения.
Из документов: «Как отмечено в предыдущем, это не является« синхронизацией ». Единственным критерием проверки является размер исходного и целевого файлов, если они отличаются, исходный файл заменяет целевой файл».
Имейте в виду, что -update не является дельта-xfer-algo, как rsync, и делает только проверку размера, что не идеально, когда файлы имеют одинаковый размер, но данные разные.
Я также должен разработать некоторые из них и объяснить, что «distcp -overwrite» перезапишет файл независимо от того, соответствует ли размер или нет. Это разрушительный процесс, поэтому убедитесь, что вы действительно хотите это сделать.
Некоторые большие примеры можно найти здесь: http://hadoop.apache.org/common/docs/r0.19.2/distcp.html#uo
Я также хочу, чтобы дать пример того, что я делаю в операции синхронизации между двумя кластерами:
Hadoop distcp -pugp -i -удалено -update hftp: // hdfs-nn1: 50070/clustera hdfs: // hdfs-nn2: 9000/clustera
Это обновит все файлы в hdfs-nn2, которые не совпадают по размеру с hdfs-nn1, а также удалите все посторонние файлы. При использовании .Trash, любые удаленные файлы помещаются в ваш Trash пользователя, вызывающего distcp.
Я бы немного экспериментировал с ним, чтобы вы могли видеть эффект различных команд, так как это может быть болезненно, когда вы случайно уничтожаете ТБ данных, поэтому определенно используйте свою корзину.
также для меня distcp -update не удается иногда, когда кластер занят http://stackoverflow.com/questions/17438093/sockettimeoutexception-when-running-hadoop-distcp-update-between-clusters – Bohdan