Використовуючи 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.