Open Source DataHub: แพลตฟอร์มการค้นหาและค้นพบข้อมูลเมตาของ LinkedIn
การค้นหาข้อมูลที่คุณต้องการอย่างรวดเร็วถือเป็นสิ่งสำคัญสำหรับบริษัทใดๆ ที่ต้องอาศัยข้อมูลจำนวนมากในการตัดสินใจโดยอาศัยข้อมูล สิ่งนี้ไม่เพียงส่งผลกระทบต่อประสิทธิภาพการทำงานของผู้ใช้ข้อมูล (รวมถึงนักวิเคราะห์ นักพัฒนาการเรียนรู้ของเครื่องจักร นักวิทยาศาสตร์ข้อมูล และวิศวกรข้อมูล) แต่ยังส่งผลกระทบโดยตรงต่อผลิตภัณฑ์ขั้นสุดท้ายที่ขึ้นอยู่กับไปป์ไลน์การเรียนรู้ของเครื่องจักร (ML) ที่มีคุณภาพอีกด้วย นอกจากนี้ แนวโน้มในการนำไปใช้หรือสร้างแพลตฟอร์มแมชชีนเลิร์นนิงทำให้เกิดคำถาม: คุณมีวิธีใดในการค้นหาฟีเจอร์ แบบจำลอง ตัวชี้วัด ชุดข้อมูล ฯลฯ ภายใน
ในบทความนี้ เราจะพูดถึงวิธีที่เราเผยแพร่แหล่งข้อมูลภายใต้ใบอนุญาตแบบเปิด
WhereHows กลายเป็น DataHub แล้ว!
ทีมข้อมูลเมตาของ LinkedIn นำเสนอก่อนหน้านี้
แนวทางโอเพ่นซอร์ส
WhereHows ซึ่งเป็นพอร์ทัลดั้งเดิมของ LinkedIn สำหรับการค้นหาข้อมูลและแหล่งที่มา เริ่มต้นจากโครงการภายใน ทีมข้อมูลเมตาเปิดมัน
ลองครั้งแรก: "โอเพ่นซอร์สก่อน"
ในตอนแรกเราได้ติดตามโมเดลการพัฒนา "โอเพ่นซอร์สมาก่อน" ซึ่งการพัฒนาส่วนใหญ่เกิดขึ้นในที่เก็บข้อมูลโอเพ่นซอร์สและมีการเปลี่ยนแปลงสำหรับการปรับใช้ภายใน ปัญหาของแนวทางนี้คือโค้ดจะถูกส่งไปยัง GitHub ก่อนเสมอก่อนที่จะได้รับการตรวจสอบภายในโดยสมบูรณ์ จนกว่าจะมีการเปลี่ยนแปลงจากที่เก็บโอเพ่นซอร์สและมีการปรับใช้ภายในใหม่ เราจะไม่พบปัญหาในการใช้งานจริง ในกรณีที่การใช้งานไม่ดี การระบุผู้กระทำผิดก็ยากมากเช่นกัน เนื่องจากมีการเปลี่ยนแปลงเป็นชุด
นอกจากนี้ โมเดลนี้ยังลดประสิทธิภาพการทำงานของทีมเมื่อพัฒนาคุณสมบัติใหม่ๆ ที่จำเป็นต้องมีการทำซ้ำอย่างรวดเร็ว เนื่องจากบังคับให้การเปลี่ยนแปลงทั้งหมดถูกพุชไปยังที่เก็บโอเพ่นซอร์สก่อน จากนั้นจึงพุชไปยังที่เก็บข้อมูลภายใน เพื่อลดเวลาการประมวลผล การแก้ไขหรือการเปลี่ยนแปลงที่จำเป็นสามารถทำได้ในที่เก็บข้อมูลภายในก่อน แต่นี่กลายเป็นปัญหาใหญ่เมื่อต้องรวมการเปลี่ยนแปลงเหล่านั้นกลับเข้าไปในที่เก็บโอเพ่นซอร์ส เนื่องจากที่เก็บข้อมูลทั้งสองไม่ซิงค์กัน
โมเดลนี้ปรับใช้กับแพลตฟอร์ม ไลบรารี หรือโครงการโครงสร้างพื้นฐานที่ใช้ร่วมกันได้ง่ายกว่ามากเมื่อเทียบกับเว็บแอปพลิเคชันแบบกำหนดเองที่มีคุณสมบัติครบถ้วน นอกจากนี้ โมเดลนี้ยังเหมาะสำหรับโครงการที่เริ่มต้นโอเพ่นซอร์สตั้งแต่วันแรก แต่ WhereHows ถูกสร้างขึ้นให้เป็นแอปพลิเคชันเว็บภายในโดยสมบูรณ์ เป็นเรื่องยากมากที่จะแยกการพึ่งพาภายในทั้งหมดออกไปโดยสิ้นเชิง ดังนั้นเราจึงจำเป็นต้องเก็บทางแยกภายในไว้ แต่การรักษาทางแยกภายในและการพัฒนาโอเพ่นซอร์สเป็นส่วนใหญ่ไม่ได้ผลนัก
ความพยายามครั้งที่สอง: “ภายในก่อน”
**ในความพยายามครั้งที่สอง เราได้ย้ายไปยังโมเดลการพัฒนา "ภายในอันดับแรก" ซึ่งการพัฒนาส่วนใหญ่เกิดขึ้นภายในองค์กรและมีการเปลี่ยนแปลงโค้ดโอเพ่นซอร์สเป็นประจำ แม้ว่าโมเดลนี้จะเหมาะที่สุดสำหรับกรณีการใช้งานของเรา แต่ก็มีปัญหาโดยธรรมชาติ การผลักดันความแตกต่างทั้งหมดไปยังพื้นที่เก็บข้อมูลโอเพ่นซอร์สโดยตรง จากนั้นการพยายามแก้ไขข้อขัดแย้งในการผสานในภายหลังก็เป็นทางเลือกหนึ่ง แต่จะใช้เวลานาน ในกรณีส่วนใหญ่นักพัฒนาจะพยายามไม่ทำเช่นนี้ทุกครั้งที่ตรวจสอบโค้ดของตน ด้วยเหตุนี้ การดำเนินการนี้จะดำเนินการไม่บ่อยนักในชุดงาน และทำให้ยากต่อการแก้ไขข้อขัดแย้งในการผสานในภายหลัง
ครั้งที่สามมันได้ผล!
ความพยายามที่ล้มเหลวสองครั้งที่กล่าวถึงข้างต้นส่งผลให้พื้นที่เก็บข้อมูล WhereHows GitHub ยังคงล้าสมัยเป็นเวลานาน ทีมงานปรับปรุงคุณสมบัติและสถาปัตยกรรมของผลิตภัณฑ์อย่างต่อเนื่อง เพื่อให้ WhereHows สำหรับ LinkedIn เวอร์ชันภายในมีความก้าวหน้ามากกว่าเวอร์ชันโอเพ่นซอร์ส มันยังมีชื่อใหม่ - DataHub จากความพยายามที่ล้มเหลวครั้งก่อน ทีมงานจึงตัดสินใจพัฒนาโซลูชันระยะยาวที่ปรับขนาดได้
สำหรับโครงการโอเพ่นซอร์สใหม่ ทีมโอเพ่นซอร์สของ LinkedIn จะให้คำแนะนำและสนับสนุนรูปแบบการพัฒนาที่โมดูลของโครงการได้รับการพัฒนาในรูปแบบโอเพ่นซอร์สทั้งหมด อาร์ติแฟกต์ที่มีเวอร์ชันจะถูกปรับใช้กับพื้นที่เก็บข้อมูลสาธารณะ จากนั้นตรวจสอบกลับเข้าไปในอาร์ติแฟกต์ LinkedIn ภายในโดยใช้
อย่างไรก็ตาม แอปพลิเคชันแบ็คเอนด์ที่เติบโตเต็มที่ เช่น DataHub จะต้องใช้เวลาจำนวนมากจึงจะบรรลุสถานะนี้ สิ่งนี้ยังขัดขวางความเป็นไปได้ของการดำเนินการแบบโอเพ่นซอร์สที่ทำงานได้อย่างสมบูรณ์ก่อนที่การพึ่งพาภายในทั้งหมดจะถูกสรุปโดยสมบูรณ์ นั่นเป็นเหตุผลที่เราได้พัฒนาเครื่องมือที่ช่วยให้เราสามารถสนับสนุนโอเพ่นซอร์สได้รวดเร็วขึ้นและยุ่งยากน้อยลงมาก โซลูชันนี้เป็นประโยชน์ต่อทั้งทีมข้อมูลเมตา (นักพัฒนา DataHub) และชุมชนโอเพ่นซอร์ส ส่วนต่อไปนี้จะกล่าวถึงแนวทางใหม่นี้
โอเพ่นซอร์สอัตโนมัติการเผยแพร่
แนวทางล่าสุดของทีม Metadata ในการใช้ DataHub แบบโอเพ่นซอร์สคือการพัฒนาเครื่องมือที่จะซิงค์โค้ดเบสภายในและพื้นที่เก็บข้อมูลโอเพ่นซอร์สโดยอัตโนมัติ คุณสมบัติระดับสูงของชุดเครื่องมือนี้ประกอบด้วย:
- ซิงค์โค้ด LinkedIn กับ/จากโอเพ่นซอร์สที่คล้ายกัน
rsync . - การสร้างส่วนหัวใบอนุญาตคล้ายกับ
อาปาเช่หนู . - สร้างบันทึกการคอมมิตแบบโอเพ่นซอร์สโดยอัตโนมัติจากบันทึกการคอมมิตภายใน
- ป้องกันการเปลี่ยนแปลงภายในที่ทำลายการสร้างโอเพ่นซอร์สด้วย
การทดสอบการพึ่งพา .
ส่วนย่อยต่อไปนี้จะเจาะลึกฟังก์ชันที่กล่าวมาข้างต้นซึ่งมีปัญหาที่น่าสนใจ
การซิงโครไนซ์ซอร์สโค้ด
ต่างจาก DataHub เวอร์ชันโอเพ่นซอร์สซึ่งเป็นที่เก็บ GitHub เดียว DataHub เวอร์ชัน LinkedIn คือการรวมกันของที่เก็บหลายอัน (เรียกว่าภายใน
รูปที่ 1: การซิงโครไนซ์ระหว่างที่เก็บข้อมูล LinkedIn ดาต้าฮับ และที่เก็บข้อมูลเดียว ดาต้าฮับ โอเพ่นซอร์ส
เพื่อรองรับเวิร์กโฟลว์การสร้าง พุช และพุลอัตโนมัติ เครื่องมือใหม่ของเราจะสร้างการแมประดับไฟล์ที่สอดคล้องกับไฟล์ต้นฉบับแต่ละไฟล์โดยอัตโนมัติ อย่างไรก็ตาม ชุดเครื่องมือจำเป็นต้องมีการกำหนดค่าเริ่มต้น และผู้ใช้ต้องจัดเตรียมการแมปโมดูลระดับสูงดังที่แสดงด้านล่าง
{
"datahub-dao": [
"${datahub-frontend}/datahub-dao"
],
"gms/impl": [
"${dataset-gms}/impl",
"${user-gms}/impl"
],
"metadata-dao": [
"${metadata-models}/metadata-dao"
],
"metadata-builders": [
"${metadata-models}/metadata-builders"
]
}
การแมประดับโมดูลเป็น JSON แบบธรรมดาซึ่งมีคีย์เป็นโมดูลเป้าหมายในพื้นที่เก็บข้อมูลโอเพ่นซอร์ส และค่าเป็นรายการโมดูลแหล่งที่มาในที่เก็บ LinkedIn โมดูลเป้าหมายใดๆ ในพื้นที่เก็บข้อมูลโอเพ่นซอร์สสามารถป้อนโดยโมดูลแหล่งที่มาจำนวนเท่าใดก็ได้ หากต้องการระบุชื่อภายในของที่เก็บในโมดูลต้นทาง ให้ใช้
{
"${metadata-models}/metadata-builders/src/main/java/com/linkedin/Foo.java":
"metadata-builders/src/main/java/com/linkedin/Foo.java",
"${metadata-models}/metadata-builders/src/main/java/com/linkedin/Bar.java":
"metadata-builders/src/main/java/com/linkedin/Bar.java",
"${metadata-models}/metadata-builders/build.gradle": null,
}
การแมประดับไฟล์จะถูกสร้างขึ้นโดยอัตโนมัติโดยเครื่องมือ อย่างไรก็ตามผู้ใช้สามารถอัปเดตได้ด้วยตนเอง นี่คือการแมป 1:1 ของไฟล์ต้นฉบับ LinkedIn กับไฟล์ในที่เก็บโอเพ่นซอร์ส มีกฎหลายข้อที่เกี่ยวข้องกับการสร้างการเชื่อมโยงไฟล์โดยอัตโนมัติ:
- ในกรณีของโมดูลหลายซอร์สสำหรับโมดูลเป้าหมายในโอเพ่นซอร์ส ข้อขัดแย้งอาจเกิดขึ้น เช่น เหมือนกัน
FQCN มีอยู่ในโมดูลซอร์สมากกว่าหนึ่งโมดูล เนื่องจากเป็นกลยุทธ์การแก้ไขข้อขัดแย้ง เครื่องมือของเราจึงใช้ตัวเลือก "คนสุดท้ายชนะ" โดยค่าเริ่มต้น - "null" หมายความว่าไฟล์ต้นฉบับไม่ได้เป็นส่วนหนึ่งของที่เก็บโอเพ่นซอร์ส
- หลังจากส่งหรือแยกโอเพ่นซอร์สแต่ละครั้ง การแมปนี้จะได้รับการอัปเดตโดยอัตโนมัติและสร้างสแน็ปช็อต นี่เป็นสิ่งจำเป็นในการระบุการเพิ่มเติมและการลบจากซอร์สโค้ดตั้งแต่การดำเนินการครั้งล่าสุด
การสร้างบันทึกการคอมมิต
บันทึกการคอมมิตสำหรับการคอมมิตแบบโอเพ่นซอร์สจะถูกสร้างขึ้นโดยอัตโนมัติด้วยการรวมบันทึกการคอมมิตของที่เก็บข้อมูลภายใน ด้านล่างนี้คือตัวอย่างบันทึกการคอมมิตเพื่อแสดงโครงสร้างของบันทึกคอมมิตที่สร้างโดยเครื่องมือของเรา การคอมมิตจะระบุอย่างชัดเจนว่าที่เก็บซอร์สเวอร์ชันใดที่ได้รับการบรรจุในคอมมิตนั้น และให้ข้อมูลสรุปของบันทึกการคอมมิต ตรวจสอบอันนี้
metadata-models 29.0.0 -> 30.0.0
Added aspect model foo
Fixed issue bar
dataset-gms 2.3.0 -> 2.3.4
Added rest.li API to serve foo aspect
MP_VERSION=dataset-gms:2.3.4
MP_VERSION=metadata-models:30.0.0
การทดสอบการพึ่งพา
ลิงค์อินก็มี
นี่เป็นกลไกที่มีประโยชน์ซึ่งช่วยป้องกันการคอมมิตภายในที่ทำลายบิลด์โอเพ่นซอร์สและตรวจจับได้ในเวลาคอมมิต หากไม่มีสิ่งนี้ จะค่อนข้างยากที่จะตัดสินว่าการคอมมิตภายในใดที่ทำให้การสร้างพื้นที่เก็บข้อมูลโอเพ่นซอร์สล้มเหลว เนื่องจากเราทำการเปลี่ยนแปลงภายในเป็นชุดกับพื้นที่เก็บข้อมูลโอเพ่นซอร์ส DataHub
ความแตกต่างระหว่าง DataHub แบบโอเพ่นซอร์สและเวอร์ชันที่ใช้งานจริงของเรา
จนถึงจุดนี้ เราได้พูดคุยถึงโซลูชันของเราสำหรับการซิงโครไนซ์ที่เก็บข้อมูล DataHub สองเวอร์ชัน แต่เรายังไม่ได้สรุปเหตุผลว่าทำไมเราจึงต้องการสตรีมการพัฒนาที่แตกต่างกันสองเวอร์ชันตั้งแต่แรก ในส่วนนี้ เราจะแสดงรายการความแตกต่างระหว่าง DataHub เวอร์ชันสาธารณะและเวอร์ชันที่ใช้งานจริงบนเซิร์ฟเวอร์ LinkedIn และอธิบายสาเหตุของความแตกต่างเหล่านี้
แหล่งที่มาของความคลาดเคลื่อนประการหนึ่งเกิดจากการที่เวอร์ชันที่ใช้งานจริงของเรามีการพึ่งพาโค้ดที่ยังไม่เป็นโอเพ่นซอร์ส เช่น Offspring ของ LinkedIn (เฟรมเวิร์กการแทรกการพึ่งพาภายในของ LinkedIn) Offspring ถูกนำมาใช้กันอย่างแพร่หลายในโค้ดเบสภายใน เนื่องจากเป็นวิธีที่นิยมใช้ในการจัดการการกำหนดค่าแบบไดนามิก แต่มันไม่ใช่โอเพ่นซอร์ส ดังนั้นเราจึงจำเป็นต้องค้นหาทางเลือกโอเพ่นซอร์สแทน DataHub แบบโอเพ่นซอร์ส
มีเหตุผลอื่นด้วย ขณะที่เราสร้างส่วนขยายให้กับโมเดลข้อมูลเมตาสำหรับความต้องการของ LinkedIn ส่วนขยายเหล่านี้มักจะมีความเฉพาะเจาะจงกับ LinkedIn อย่างมาก และอาจไม่นำไปใช้กับสภาพแวดล้อมอื่นโดยตรง ตัวอย่างเช่น เรามีป้ายกำกับเฉพาะสำหรับรหัสผู้เข้าร่วมและข้อมูลเมตาที่ตรงกันประเภทอื่นๆ ดังนั้นเราจึงแยกส่วนขยายเหล่านี้ออกจากโมเดลข้อมูลเมตาโอเพ่นซอร์สของ DataHub แล้ว เมื่อเรามีส่วนร่วมกับชุมชนและเข้าใจความต้องการของพวกเขา เราจะดำเนินการกับส่วนขยายเหล่านี้ในเวอร์ชันโอเพ่นซอร์สทั่วไปเมื่อจำเป็น
การใช้งานง่ายและการปรับตัวที่ง่ายขึ้นสำหรับชุมชนโอเพ่นซอร์สยังเป็นแรงบันดาลใจให้เกิดความแตกต่างบางประการระหว่าง DataHub ทั้งสองเวอร์ชัน ความแตกต่างในโครงสร้างพื้นฐานการประมวลผลสตรีมคือตัวอย่างที่ดีของสิ่งนี้ แม้ว่าเวอร์ชันภายในของเราจะใช้เฟรมเวิร์กการประมวลผลสตรีมที่มีการจัดการ แต่เราเลือกใช้การประมวลผลสตรีมในตัว (สแตนด์อโลน) สำหรับเวอร์ชันโอเพ่นซอร์ส เนื่องจากจะหลีกเลี่ยงการสร้างการพึ่งพาโครงสร้างพื้นฐานอื่น
อีกตัวอย่างหนึ่งของความแตกต่างคือการมี GMS (ที่เก็บข้อมูลเมตาทั่วไป) เดียวในการใช้งานโอเพ่นซอร์สแทนที่จะเป็น GMS หลายตัว GMA (สถาปัตยกรรมเมตาดาต้าทั่วไป) คือชื่อของสถาปัตยกรรมแบ็คเอนด์สำหรับ DataHub และ GMS เป็นที่เก็บข้อมูลเมตาในบริบทของ GMA GMA เป็นสถาปัตยกรรมที่มีความยืดหยุ่นสูง ซึ่งช่วยให้คุณสามารถกระจายโครงสร้างข้อมูลแต่ละรายการ (เช่น ชุดข้อมูล ผู้ใช้ ฯลฯ) ไปยังที่เก็บข้อมูลเมตาของตัวเอง หรือจัดเก็บโครงสร้างข้อมูลหลายรายการไว้ในที่เก็บข้อมูลเมตาเดียว ตราบใดที่รีจิสทรีมีการแมปโครงสร้างข้อมูลใน GMS ได้รับการอัพเดตแล้ว เพื่อความสะดวกในการใช้งาน เราเลือกอินสแตนซ์ GMS เดียวที่จัดเก็บโครงสร้างข้อมูลที่แตกต่างกันทั้งหมดใน DataHub แบบโอเพ่นซอร์ส
รายการความแตกต่างทั้งหมดระหว่างการใช้งานทั้งสองมีระบุไว้ในตารางด้านล่าง
สินค้า
LinkedInดาต้าฮับ
โอเพ่นซอร์สดาต้าฮับ
โครงสร้างข้อมูลที่รองรับ
1) ชุดข้อมูล 2) ผู้ใช้ 3) ตัวชี้วัด 4) คุณสมบัติ ML 5) แผนภูมิ 6) แดชบอร์ด
1) ชุดข้อมูล 2) ผู้ใช้
แหล่งที่มาของข้อมูลเมตาที่รองรับสำหรับชุดข้อมูล
1)
ไฮฟ์คาฟคา RDBMS
ผับย่อย
คาฟคามาบรรจบกัน
การประมวลผลสตรีม
การจัดการ
แบบฝัง (สแตนด์อโลน)
การพึ่งพาการฉีดและการกำหนดค่าแบบไดนามิก
LinkedIn ลูกหลาน
สร้างเครื่องมือ
Ligradle (เครื่องห่อ Gradle ภายในของ LinkedIn)
CI / ซีดี
CRT (CI/CD ภายในของ LinkedIn)
ที่เก็บข้อมูลเมตา
กระจาย GMS หลายรายการ: 1) ชุดข้อมูล GMS 2) GMS ผู้ใช้ 3) GMS เมตริก 4) คุณลักษณะ GMS 5) แผนภูมิ/แดชบอร์ด GMS
GMS เดียวสำหรับ: 1) ชุดข้อมูล 2) ผู้ใช้
ไมโครเซอร์วิสในคอนเทนเนอร์ Docker
รูปที่ 2: สถาปัตยกรรม ดาต้าฮับ *โอเพ่นซอร์ส**
คุณสามารถดูสถาปัตยกรรมระดับสูงของ DataHub ได้ในภาพด้านบน นอกจากส่วนประกอบโครงสร้างพื้นฐานแล้ว ยังมีคอนเทนเนอร์ Docker ที่แตกต่างกันสี่แบบ:
datahub-gms: บริการจัดเก็บข้อมูลเมตา
datahub-ส่วนหน้า: แอปพลิเคชัน
datahub-mce-consumer: แอปพลิเคชัน
datahub-mae-consumer: แอปพลิเคชัน
เอกสารแหล่งเก็บข้อมูลโอเพ่นซอร์สและ
CI/CD บน DataHub เป็นโอเพ่นซอร์ส
พื้นที่เก็บข้อมูล DataHub แบบโอเพ่นซอร์สใช้
ทุกครั้งที่คอมมิตกับพื้นที่เก็บข้อมูลโอเพนซอร์ส DataHub อิมเมจ Docker ทั้งหมดจะถูกสร้างขึ้นและปรับใช้กับ Docker Hub โดยอัตโนมัติด้วยแท็ก "ล่าสุด" หากมีการกำหนดค่า Docker Hub ไว้บ้าง
การใช้ดาต้าฮับ
- โคลนพื้นที่เก็บข้อมูลโอเพ่นซอร์สและเรียกใช้คอนเทนเนอร์ Docker ทั้งหมดด้วย docker-compose โดยใช้สคริปต์ docker-compose ที่ให้มาเพื่อการเริ่มต้นอย่างรวดเร็ว
- ดาวน์โหลดข้อมูลตัวอย่างที่ให้ไว้ในที่เก็บโดยใช้เครื่องมือบรรทัดคำสั่งที่ให้มาด้วย
- เรียกดู DataHub ในเบราว์เซอร์ของคุณ
ติดตามอย่างแข็งขัน
แผนสำหรับอนาคต
ปัจจุบัน โครงสร้างพื้นฐานหรือไมโครเซอร์วิสทั้งหมดสำหรับ DataHub แบบโอเพ่นซอร์สถูกสร้างขึ้นเป็นคอนเทนเนอร์ Docker และทั้งระบบได้รับการจัดการโดยใช้
นอกจากนี้เรายังวางแผนที่จะจัดหาโซลูชันแบบครบวงจรสำหรับการปรับใช้ DataHub บนบริการคลาวด์สาธารณะ เช่น
สุดท้ายแต่ไม่ท้ายสุด ขอขอบคุณผู้ใช้งาน DataHub รุ่นแรกๆ ในชุมชนโอเพ่นซอร์สที่ได้ให้คะแนนอัลฟ่า DataHub และช่วยเราระบุปัญหาและปรับปรุงเอกสารประกอบ
ที่มา: will.com