บทช่วยสอนการใช้งาน Apache Sqoop: Archiโครงสร้าง คำสั่ง และตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
Apache Sqoop ย้ายข้อมูลจำนวนมากระหว่างฐานข้อมูลเชิงสัมพันธ์และ HDFS โดยใช้สถาปัตยกรรมตัวเชื่อมต่อ สร้างงาน MapReduce ที่นำเข้าตารางไปยัง Hive หรือ HBase และส่งออกผลลัพธ์ที่ประมวลผลแล้วกลับไปยังระบบต้นทาง
SQOOP ใน Hadoop คืออะไร
อาปาเช่ สควอป (SQL-to-Hadoop) เป็นเครื่องมือที่ออกแบบมาเพื่อรองรับการส่งออกและนำเข้าข้อมูลจำนวนมากเข้าสู่ระบบ เอชดีเอฟเอส จากแหล่งเก็บข้อมูลที่มีโครงสร้าง เช่น ฐานข้อมูลเชิงสัมพันธ์ คลังข้อมูลระดับองค์กร และระบบ NoSQL เป็นเครื่องมือการย้ายข้อมูลที่ใช้สถาปัตยกรรมตัวเชื่อมต่อ ซึ่งรองรับปลั๊กอินเพื่อเชื่อมต่อกับระบบภายนอกใหม่ๆ
ตัวอย่างการใช้งานของ Hadoop Sqoop คือองค์กรที่ดำเนินการนำเข้า Sqoop ทุกคืนเพื่อโหลดข้อมูลของวันจาก RDBMS ของธุรกรรมการผลิตลงใน รัง คลังข้อมูลเพื่อการวิเคราะห์ต่อไป
ในบทช่วยสอน Apache Sqoop ต่อไปนี้ เราจะเรียนรู้เกี่ยวกับสถาปัตยกรรม Apache Sqoop
สควอช Archiเทคเจอร์
ที่มีอยู่ทั้งหมด ระบบการจัดการฐานข้อมูล ได้รับการออกแบบด้วย SQL มาตรฐานในใจ อย่างไรก็ตาม แต่ละ DBMS มีความแตกต่างกันในเรื่องของภาษาถิ่นในระดับหนึ่ง ดังนั้นความแตกต่างนี้ทำให้เกิดความท้าทายในการถ่ายโอนข้อมูลข้ามระบบ Sqoop Connectors เป็นส่วนประกอบที่ช่วยเอาชนะความท้าทายเหล่านี้
การถ่ายโอนข้อมูลระหว่าง Sqoop Hadoop และระบบจัดเก็บข้อมูลภายนอกสามารถทำได้ด้วยความช่วยเหลือของตัวเชื่อมต่อของ Sqoop
Sqoop มีตัวเชื่อมต่อสำหรับการทำงานกับฐานข้อมูลเชิงสัมพันธ์ยอดนิยมมากมาย รวมถึง MySQL, PostgreSQL, Oracle, เซิร์ฟเวอร์ SQL และ DB2 ตัวเชื่อมต่อแต่ละตัวเหล่านี้รู้วิธีโต้ตอบกับ DBMS ที่เกี่ยวข้อง นอกจากนี้ยังมีตัวเชื่อมต่อ JDBC ทั่วไปสำหรับการเชื่อมต่อกับฐานข้อมูลใดๆ ที่รองรับ Javaโปรโตคอล JDBC ของ Sqoop นอกจากนี้ Sqoop ยังมีฟังก์ชันการทำงานที่ได้รับการปรับให้เหมาะสมอีกด้วย MySQL และ PostgreSQL ตัวเชื่อมต่อที่ใช้ API เฉพาะฐานข้อมูลเพื่อทำการถ่ายโอนจำนวนมากอย่างมีประสิทธิภาพ
แผนภาพด้านล่างแสดงตำแหน่งของไคลเอ็นต์ Sqoop ที่อยู่ระหว่างแหล่งเก็บข้อมูลภายนอกและคลัสเตอร์ Hadoop โดยมีเลเยอร์ตัวเชื่อมต่ออยู่ด้านหนึ่ง และ HDFS, Hive และ HBase อยู่ด้านตรงข้าม
ภายใต้เลเยอร์ตัวเชื่อมต่อ Sqoop จะสร้าง Java คลาสที่จำลองแถวหนึ่งของตารางแล้วส่งเฉพาะแผนที่ แผนที่ลด งานแต่ละงานในการแมปจะอ่านส่วนหนึ่งของช่วงคอลัมน์ที่แยกออก ดังนั้นปริมาณงานจึงเพิ่มขึ้นตามจำนวนตัวแมป ไม่ใช่ตามเคอร์เซอร์ JDBC ตัวเดียว
นอกจากนี้ Sqoop ยังมีตัวเชื่อมต่อจากผู้ให้บริการภายนอกหลากหลายรายสำหรับแหล่งจัดเก็บข้อมูล ตั้งแต่ระดับองค์กรไปจนถึงระดับองค์กรขนาดใหญ่ คลังข้อมูล (รวมถึง Netezza, Teradata และ Oracle) ไปยังร้านค้า NoSQL (เช่น Couchbase) อย่างไรก็ตาม ตัวเชื่อมต่อเหล่านี้ไม่ได้มาพร้อมกับชุด Sqoop จำเป็นต้องดาวน์โหลดแยกต่างหากและสามารถเพิ่มลงในการติดตั้ง Sqoop ที่มีอยู่ได้อย่างง่ายดาย
ทำไมเราถึงต้องการ Sqoop?
การประมวลผลเชิงวิเคราะห์โดยใช้ Hadoop จำเป็นต้องโหลดข้อมูลจำนวนมหาศาลจากแหล่งต่าง ๆ ลงในคลัสเตอร์ Hadoop กระบวนการโหลดข้อมูลจำนวนมากลงใน Hadoop จากแหล่งต่าง ๆ แล้วจึงประมวลผลนั้นมาพร้อมกับความท้าทายบางประการ การรักษาและรับรองความสอดคล้องของข้อมูลและการรับรองการใช้ทรัพยากรอย่างมีประสิทธิภาพเป็นปัจจัยบางประการที่ต้องพิจารณาก่อนเลือกวิธีการโหลดข้อมูลที่เหมาะสม
ประเด็นสำคัญ:
- การโหลดข้อมูลโดยใช้สคริปต์ — วิธีการแบบดั้งเดิมที่ใช้สคริปต์ในการโหลดข้อมูลนั้นไม่เหมาะสมสำหรับการโหลดข้อมูลจำนวนมากเข้าสู่ Hadoop เนื่องจากวิธีการนี้ไม่มีประสิทธิภาพและใช้เวลานานมาก
- การเข้าถึงข้อมูลภายนอกโดยตรงผ่านแอปพลิเคชัน Map-Reduce — การให้สิทธิ์การเข้าถึงข้อมูลที่อยู่ในระบบภายนอกโดยตรง (โดยไม่ต้องโหลดลงใน Hadoop) สำหรับแอปพลิเคชัน map-reduce ทำให้แอปพลิเคชันเหล่านี้ซับซ้อนขึ้น ดังนั้นวิธีการนี้จึงไม่เหมาะสม
นอกจากความสามารถในการจัดการกับข้อมูลจำนวนมหาศาลแล้ว Hadoop ยังสามารถทำงานกับข้อมูลในหลายรูปแบบได้อีกด้วย ดังนั้น เพื่อโหลดข้อมูลที่หลากหลายเหล่านี้เข้าสู่ Hadoop จึงได้มีการพัฒนาเครื่องมือต่างๆ ขึ้นมา สควอช และ ไลเดอร์ เป็นเครื่องมือในการโหลดข้อมูลสองรายการดังกล่าว
ต่อไปในบทช่วยสอน Sqoop พร้อมตัวอย่างนี้ เราจะเรียนรู้เกี่ยวกับความแตกต่างระหว่าง Sqoop, Flume และ HDFS
Sqoop กับ Flume กับ HDFS ใน Hadoop
| สควอช | ไลเดอร์ | เอชดีเอฟเอส |
|---|---|---|
| Sqoop ใช้สำหรับการนำเข้าข้อมูลจากแหล่งข้อมูลที่มีโครงสร้าง เช่น RDBMS | Flume ใช้สำหรับย้ายข้อมูลการสตรีมจำนวนมากไปยัง HDFS | HDFS เป็นระบบไฟล์แบบกระจายที่ใช้โดยระบบนิเวศ Hadoop เพื่อจัดเก็บข้อมูล |
| Sqoop มีสถาปัตยกรรมแบบตัวเชื่อมต่อ ตัวเชื่อมต่อจะรู้วิธีเชื่อมต่อกับแหล่งข้อมูลที่เกี่ยวข้องและดึงข้อมูล | Flume มีสถาปัตยกรรมแบบใช้ตัวแทน โดยที่นี่จะมีการเขียนโค้ด (เรียกว่า 'ตัวแทน') ซึ่งทำหน้าที่ดึงข้อมูล | HDFS มีสถาปัตยกรรมแบบกระจาย โดยที่ข้อมูลจะกระจายไปทั่วโหนดข้อมูลหลายโหนด |
| HDFS เป็นปลายทางสำหรับการนำเข้าข้อมูลโดยใช้ Sqoop | ข้อมูลจะไหลไปยัง HDFS ผ่านช่องสัญญาณตั้งแต่ศูนย์ขึ้นไป | HDFS เป็นปลายทางขั้นสูงสุดสำหรับการจัดเก็บข้อมูล |
| โหลดข้อมูล Sqoop ไม่ได้ขับเคลื่อนด้วยเหตุการณ์ | โหลดข้อมูล Flume สามารถขับเคลื่อนโดยเหตุการณ์ได้ | HDFS เก็บข้อมูลที่ได้รับมาไม่ว่าจะด้วยวิธีใดก็ตาม |
| ในการนำเข้าข้อมูลจากแหล่งข้อมูลที่มีโครงสร้าง เราต้องใช้คำสั่ง Sqoop เท่านั้น เนื่องจากตัวเชื่อมต่อรู้วิธีโต้ตอบกับแหล่งข้อมูลที่มีโครงสร้างและดึงข้อมูลจากแหล่งข้อมูลเหล่านั้น | เพื่อโหลดข้อมูลสตรีมมิ่ง เช่น ทวีตที่สร้างบน Twitter หรือไฟล์บันทึกของเว็บเซิร์ฟเวอร์ ควรใช้ Flume เอเจนต์ Flume สร้างขึ้นเพื่อดึงข้อมูลการสตรีม | HDFS มีคำสั่งเชลล์ในตัวสำหรับจัดเก็บข้อมูล แต่ไม่สามารถนำเข้าข้อมูลแบบสตรีมมิ่งได้ |
คุณสมบัติหลักของ Sqoop
การเปรียบเทียบข้างต้นอธิบายว่า Sqoop อยู่ในกลุ่มใด ส่วนชุดคุณสมบัติด้านล่างจะเป็นตัวตัดสินว่ามันเหมาะสมกับงานนำเข้าข้อมูลเฉพาะนั้นหรือไม่
- โหลดเต็ม: คำสั่งเดียวสามารถคัดลอกตารางทั้งหมดได้ และ
import-all-tablesคัดลอกทุกตารางในสคีมาในครั้งเดียว - การโหลดแบบเพิ่มทีละน้อย:
appendโหมด tracks คือคอลัมน์ที่เพิ่มขึ้นอย่างต่อเนื่อง เช่น คีย์ทดแทน ในขณะที่lastmodifiedโหมด tracks มีคอลัมน์ประทับเวลา ดังนั้นเฉพาะแถวใหม่หรือแถวที่มีการเปลี่ยนแปลงเท่านั้นที่จะถูกส่งต่อ - การถ่ายโอนแบบขนาน: คอลัมน์ที่แยกออกจะแบ่งช่วงคีย์ออกเป็นส่วนๆ สำหรับงานแมป และจำนวนตัวแมปเปอร์จะกำหนดว่าจะเรียกใช้งานพร้อมกันกี่งาน
- นำเข้าแบบสอบถามรูปแบบอิสระ: สามารถนำเข้าผลลัพธ์ของคำสั่ง SQL ใดๆ ก็ได้ แทนที่จะนำเข้าทั้งตาราง ซึ่งจะช่วยรักษาการเชื่อมต่อและการกรองข้อมูลไว้ในฝั่งฐานข้อมูล
- ขนส่งสินค้าเข้าคลังสินค้าโดยตรง: การนำเข้าสามารถสร้างและเติมข้อมูลได้ รัง หรือเขียนข้อมูลลงในตาราง HBase โดยตรงแทนที่จะหยุดการทำงานping ในไฟล์ HDFS ดิบ
- การบีบอัดและรูปแบบไฟล์: ผลลัพธ์สามารถบันทึกเป็นข้อความคั่นด้วยตัวคั่น (delimited text), ไฟล์ลำดับ (SequenceFile), Avro หรือ Parquet โดยมีตัวเลือกการบีบอัดระดับโคเดก (codec-level compression)
- การรักษาความปลอดภัย: Sqoop สามารถทำงานร่วมกับ Kerberos ได้ และสามารถอ่านข้อมูลรับรองจากไฟล์รหัสผ่าน หรือขอให้ป้อนข้อมูลรับรองแทนการพิมพ์ลงในบรรทัดคำสั่งได้
คำสั่งนำเข้าและส่งออกของ Sqoop
การถ่ายโอนข้อมูลทั้งสองทิศทางดำเนินการผ่านยูทิลิตี้บรรทัดคำสั่งเดียว เครื่องมือการนำเข้าจะย้ายแถวจากฐานข้อมูลไปยัง Hadoop และเครื่องมือการส่งออกจะย้ายไฟล์จาก Hadoop กลับไปยังตารางฐานข้อมูล
โดยทั่วไป การนำเข้าข้อมูลจะระบุการเชื่อมต่อ JDBC, ตารางต้นทาง, ไดเร็กทอรีปลายทาง, คอลัมน์ที่แยก และจำนวนตัวแมปเปอร์:
sqoop import \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employees \ --target-dir /user/hadoop/warehouse/employees \ --split-by emp_no \ --num-mappers 4
การส่งออก (Export) จะกลับกระบวนการทำงาน โดยจะอ่านไฟล์ที่คั่นด้วยตัวคั่นซึ่งอยู่ในไดเร็กทอรี HDFS อยู่แล้ว และแทรกไฟล์เหล่านั้นลงในตารางที่มีอยู่ ดังนั้นจึงต้องสร้างตารางเป้าหมายก่อน:
sqoop export \ --connect jdbc:mysql://localhost:3306/employees \ --username hadoop \ --password-file /user/hadoop/.mysql.password \ --table employee_summary \ --export-dir /user/hadoop/warehouse/employee_summary \ --input-fields-terminated-by ','
โดยปกติแล้ว การทำงานตอนกลางคืนมักไม่จำเป็นต้องดึงข้อมูลทั้งตารางสองครั้ง การนำเข้าแบบเพิ่มทีละส่วนจะบันทึกค่าสูงสุดที่เคยพบแล้ว และเริ่มต้นจากค่านั้นในการทำงานครั้งถัดไป:
sqoop import \ --connect jdbc:mysql://localhost:3306/sales \ --table orders \ --incremental append \ --check-column order_id \ --last-value 15000 \ --target-dir /user/hadoop/warehouse/orders
นี่คือข้อโต้แย้งที่พบได้ในแทบทุกงาน:
| ข้อโต้แย้ง | สิ่งที่มันควบคุม |
|---|---|
--connect |
เจดีบีซี URL ของฐานข้อมูลต้นทางหรือฐานข้อมูลปลายทาง |
--table |
ตารางที่ใช้อ่านข้อมูลเมื่อนำเข้า หรือเขียนข้อมูลลงไปเมื่อส่งออก |
--target-dir |
ไดเร็กทอรี HDFS ที่จะรับการนำเข้า ต้องไม่มีอยู่แล้ว |
--export-dir |
ไดเร็กทอรี HDFS ที่ไฟล์ต่างๆ ถูกอ่านโดยการส่งออก |
--split-by |
คอลัมน์ที่มีช่วงข้อมูลแบ่งตามงานแผนที่ |
--num-mappers (-m) |
จำนวนงานแมปแบบขนาน ค่าเริ่มต้นคือสี่ |
--incremental |
เลือก append or lastmodified เปลี่ยนแปลง tracกษัตริย์. |
--hive-import |
สร้างตาราง Hive ที่ตรงกันและโหลดข้อมูลที่นำเข้าลงในตารางนั้น |
⚠️ ระวัง: การส่งออกไม่ใช่ธุรกรรมเดียว แต่ละงานของการแมปจะคอมมิตชุดข้อมูลของตัวเอง ดังนั้นหากเกิดความล้มเหลวระหว่างทาง อาจทำให้ข้อมูลบางส่วนยังคงอยู่ในตารางเป้าหมาย ควรส่งการเขียนผ่านตารางชั่วคราวเมื่อการโหลดต้องเป็นแบบทั้งหมดหรือไม่มีเลย
สถานะโครงการ Sqoop และทางเลือกที่ทันสมัยอื่นๆ
มีรายละเอียดเกี่ยวกับเวอร์ชันหนึ่งที่สำคัญก่อนที่จะนำคำสั่งข้างต้นไปใช้ในตัวกำหนดเวลา
นักพัฒนา Sqoop ลงมติยุติโครงการในเดือนมิถุนายน 2021 และการย้ายไปยังที่อื่นก็เริ่มต้นขึ้น อะปาเช่ แอทติก เสร็จสมบูรณ์ในเดือนกรกฎาคม 2021 เว็บไซต์ รายชื่อผู้รับจดหมาย ที่เก็บข้อมูล Git และปัญหาต่างๆ tracไฟล์ ker และไฟล์ดาวน์โหลดทั้งหมดยังคงใช้งานได้ แต่เป็นแบบอ่านอย่างเดียว และไม่มีแผนที่จะออกเวอร์ชันใหม่เพิ่มเติมอีกแล้ว เวอร์ชันที่ใช้งานจริงล่าสุดคือ Sqoop 1.4.7 จากปี 2017 ส่วน Sqoop 2 เวอร์ชันแยกต่างหาก (1.99.x) นั้นไม่เคยมีฟีเจอร์ครบครันและไม่เคยถูกประกาศว่าพร้อมใช้งานจริง
งาน Sqoop ที่มีอยู่เดิมยังคงทำงานต่อไป และชุดซอฟต์แวร์ Hadoop เชิงพาณิชย์ยังคงจัดส่งและสนับสนุนเครื่องมือนี้ภายในแพลตฟอร์มของตนเองต่อไป อย่างไรก็ตาม งานนำเข้าข้อมูลใหม่มักจะสร้างขึ้นบนหนึ่งในเครื่องมือเหล่านี้แทน:
| ทางเลือก | เหมาะสมที่สุด |
|---|---|
| Spark โดยใช้แหล่งข้อมูล JDBC | ตารางชุดตัวอย่างtracts ที่นั่งอยู่ภายในอยู่แล้ว Spark ไปป์ไลน์ โดยใช้การอ่านแบบแบ่งส่วนแทนที่จะใช้ตัวแมปเปอร์ |
| อาปาเช่ นิไฟ | การกำหนดเส้นทางแบบเห็นภาพและอิงตามการไหลของข้อมูล ระหว่างระบบที่หลากหลายและแตกต่างกัน |
| Kafka Connect พร้อมตัวเชื่อมต่อ CDC | การบันทึกการเปลี่ยนแปลงข้อมูลอย่างต่อเนื่อง แทนการบันทึกข้อมูลเป็นชุดในตอนกลางคืน |
| แพลตฟอร์ม ETL ที่ได้รับการจัดการ เช่น Talend | ตัวเชื่อมต่อสำเร็จรูป การจัดตารางเวลา และการติดตามลำดับการทำงาน โดยไม่ต้องเขียนงานด้วยตนเอง |

