การใช้ GNU Parallel เพื่อ scp ไฟล์ขนาดใหญ่แยกมันออกเป็นชิ้น ๆ ต่อโฮสต์


2

ฉันใช้ Ansible เพื่อตั้งค่าการกำหนดค่าบนหลาย ๆ โหนดและเป็นส่วนหนึ่งของการตั้งค่านี้ฉันต้องแยกไฟล์ขนาดใหญ่หนึ่งไฟล์ด้วย n บรรทัดและคัดลอกแต่ละส่วนไปยังไฟล์ระยะไกลโดยไม่ต้องสร้างสำเนาโลคัลของแต่ละอัน (เช่นทุบตี แยก คำสั่งทำ) 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'

เยี่ยมมากขอบคุณ! ฉันเห็นข้อ จำกัด เพียงข้อเดียวเท่านั้น - ฉันสามารถแบ่งไฟล์เป็นบล็อกได้เท่านั้นไม่ใช่แยกบรรทัด ในกรณีนี้จะประมวลผลการสิ้นสุดบรรทัดอย่างถูกต้องหรือไม่ ฉันไม่สนใจจริง ๆ ว่าโหนดใดโหนดหนึ่งจะมีบรรทัดมากกว่าอีกโหนดหนึ่ง แต่ฉันต้องการให้บรรทัดนั้นสมบูรณ์และอ่านได้
Enchantner

มันแยกบน \ n ดังนั้นคุณควรปลอดภัย
Ole Tange

ฉันเปิดตัวไฟล์ที่มี 10,000 บรรทัดและ 2 โหนดโดยใช้ขนาดบล็อกใหญ่กว่าเล็กน้อยที่เอาต์พุต 'du -b' หารด้วยสอง โหนดหนึ่งมี ~ 4850 บรรทัดส่วนอีก ~ 4900 ส่วนที่เหลือจะหายไป มีวิธีใดเพื่อให้แน่ใจว่าทุกบรรทัดถูกคัดลอกหรือไม่? หรือฉันควรคำนวณขนาดบล็อกด้วยวิธีอื่น
Enchantner

คุณไม่ควรพลาดเส้น คุณสามารถโพสต์คำสั่งที่แน่นอนที่คุณเขียน? หากคุณเรียกใช้คำสั่งที่ฉันให้ - บล็อกไม่จำเป็น
Ole Tange
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.