Використовуючи GNU Parallel для scp величезного файлу, розділяючи його по шмату на хоста


2

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

~$ 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? Я думав про поєднання двох входів (один - хостинг), але все ще не маю уявлення, як це зробити.

Буду дуже вдячний за будь-які думки.

Відповіді:


1

Працює з версії 20150922:

parallel-20150922 -a bigfile --roundrobin  --pipepart --slf hosts.txt -j1 'cat > giraf'

Щиро дякую! Я бачу лише одне обмеження - я можу розділити файл лише на блоки, а не на рядки. Чи завжди в цьому випадку правильно обробляються закінчення рядків? Мені дуже не байдуже, якщо один вузол отримує трохи більше ліній, ніж інший, але мені потрібні лінії, щоб вони були повноцінними та читабельними.
Чарівник

Він розпадається на \ n, тож ви повинні бути в безпеці.
Оле Танге

Я запустив його у файл із 10000 рядками та 2 вузлами, використовуючи розмір блоку, трохи більший, ніж вихід 'du -b', розділений на два. Один вузол отримав ~ 4850 ліній, інший ~ 4900, решта втрачено. Чи є якийсь спосіб забезпечити скопіювання всіх рядків? Або я повинен обчислити розмір блоку якимось іншим способом?
Чарівник

Ніколи не слід втрачати лінії. Чи можете ви опублікувати точну команду, яку ви написали? Якщо ви виконуєте команду, яку я даю, --блок не потрібен.
Оле Танге
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.