Использование GNU Parallel для поиска большого файла с разбивкой по частям на хост

883
Enchantner

Я использую Ansible для настройки некоторой конфигурации на нескольких узлах, и в рамках этой настройки мне нужно разделить один большой файл на n строк и скопировать каждую часть в удаленный файл без создания локальной копии каждого чанка (например, команда bash split). делает). Ansible не может сделать это по умолчанию (или я просто еще не выяснил, как это сделать), поэтому я решил использовать GNU Parallel. Я обнаружил здесь, что копирование со стандартного ввода может быть легко сделано следующим образом:

~$ echo "Lots of data" | ssh user@example.com 'cat > big.txt' 

Но я хочу сделать это одновременно нескольким хозяевам! Итак, вот пример ввода:

~$ cat hosts.txt 1.1.1.1 2.2.2.2 3.3.3.3  ~$ cat data.txt lots of ... lines 

Я вычисляю количество строк на узел, выполняя "wc -l" и деля второе число на первое. Так что, в принципе, следующим шагом будет что-то вроде этого:

~$ cat data.txt | parallel -S `cat hosts.txt | tr "\n" ","` -N $LINES_PER_HOST --pipe "ssh $HOST 'cat > /data/piece.txt'" 

но как я могу запустить одну команду для каждого хоста, чем я должен заменить $ HOST? Я думал о комбинировании двух входов (один из них является хостом), но все еще не знал, как это сделать.

Буду очень признателен за любые мысли.

2

1 ответ на вопрос

1
Ole Tange

Работает с версии 20150922:

parallel-20150922 -a bigfile --roundrobin --pipepart --slf hosts.txt -j1 'cat > giraf' 
Большое спасибо! Я вижу только одно ограничение - я могу разбивать файл только по блокам, а не по строкам. Будет ли он всегда правильно обрабатывать окончания строк? Меня не волнует, получает ли один узел немного больше строк, чем другой, но мне нужно, чтобы строки были полными и читаемыми. Enchantner 7 лет назад 0
Он разделяется на \ n, так что вы должны быть в безопасности. Ole Tange 7 лет назад 0
Я запустил его в файл с 10000 строками и 2 узлами, используя размер блока немного больше, чем вывод 'du -b', деленный на два. Один узел получил ~ 4850 строк, другой ~ 4900, остальные потеряны. Есть ли способ убедиться, что все строки скопированы? Или я должен рассчитать размер блока другим способом? Enchantner 7 лет назад 0
Вы никогда не должны терять линии. Вы можете опубликовать точную команду, которую вы написали? Если вы запускаете команду, которую я даю, --block не нужен. Ole Tange 7 лет назад 0

Похожие вопросы