3.1 ประวัติความเป็นมาของคำว่า BigData

คำว่า Big Data ปรากฏขึ้นเมื่อไม่นานมานี้ Google Trends แสดงจุดเริ่มต้นของการเติบโตอย่างแข็งขันในการใช้วลีนี้ตั้งแต่ปี 2011:

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

ในการปฏิบัติของฉัน ฉันได้พบกับคำจำกัดความที่แตกต่างกัน:

  • Big Data คือเมื่อมีข้อมูลมากกว่า 100GB (500GB, 1TB อะไรก็ได้ที่คุณต้องการ)
  • Big Data คือข้อมูลที่ไม่สามารถประมวลผลใน Excel ได้
  • Big Data คือข้อมูลที่ไม่สามารถประมวลผลได้ในคอมพิวเตอร์เครื่องเดียว

และแม้แต่สิ่งเหล่านี้:

  • โดยทั่วไปแล้ว Big Data คือข้อมูลใดๆ
  • Big Data ไม่มีอยู่จริง มันถูกคิดค้นโดยนักการตลาด

ฉันจะยึดคำจำกัดความจากวิกิพีเดีย:

ข้อมูลขนาดใหญ่เป็นชุดของแนวทาง เครื่องมือ และวิธีการสำหรับการประมวลผลข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างที่มีปริมาณมหาศาลและมีความหลากหลายอย่างมีนัยสำคัญ เพื่อให้ได้ผลลัพธ์ที่มนุษย์รับรู้ได้ ซึ่งมีประสิทธิภาพในสภาวะของการเติบโตอย่างต่อเนื่อง การกระจายผ่านโหนดจำนวนมากของเครือข่ายคอมพิวเตอร์ ในช่วงปลายทศวรรษ 2000 ซึ่งเป็นทางเลือกแทนระบบการจัดการฐานข้อมูลแบบดั้งเดิมและโซลูชันชั้นธุรกิจอัจฉริยะ

ดังนั้นด้วยBig Dataฉันจะเข้าใจไม่ใช่จำนวนข้อมูลที่เฉพาะเจาะจงและแม้แต่ตัวข้อมูลเอง แต่วิธีการประมวลผลซึ่งอนุญาตให้มีการประมวลผลข้อมูลแบบกระจาย วิธีการเหล่านี้สามารถนำไปใช้กับชุดข้อมูลขนาดใหญ่ (เช่น เนื้อหาของทุกหน้าบนอินเทอร์เน็ต) เช่นเดียวกับชุดข้อมูลขนาดเล็ก (เช่น เนื้อหาของการบรรยายนี้)

ต่อไปนี้เป็นตัวอย่างบางส่วนของสิ่งที่อาจเป็นแหล่งข้อมูลที่ต้องใช้เทคนิคข้อมูลขนาดใหญ่:

  • บันทึกพฤติกรรมผู้ใช้บนอินเทอร์เน็ต
  • สัญญาณ GPS จากรถยนต์สำหรับบริษัทขนส่ง
  • ข้อมูลที่นำมาจากเซ็นเซอร์ใน Large Hadron Collider
  • หนังสือดิจิทัลในหอสมุดแห่งรัฐรัสเซีย
  • ข้อมูลการทำธุรกรรมของลูกค้าธนาคารทั้งหมด
  • ข้อมูลเกี่ยวกับการซื้อทั้งหมดในเครือค้าปลีกขนาดใหญ่ ฯลฯ

จำนวนแหล่งข้อมูลเพิ่มขึ้นอย่างรวดเร็ว ซึ่งหมายความว่าเทคโนโลยีการประมวลผลข้อมูลกำลังเป็นที่ต้องการมากขึ้นเรื่อยๆ

3.2 หลักการข้อมูลขนาดใหญ่

ตามคำจำกัดความของ Big Data เราสามารถกำหนดหลักการพื้นฐานของการทำงานกับข้อมูลดังกล่าวได้:

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

2. ความอดทนต่อความผิดพลาด หลักการของความสามารถในการปรับขนาดในแนวนอนหมายความว่าสามารถมีเครื่องหลายเครื่องในคลัสเตอร์ได้ ตัวอย่างเช่น คลัสเตอร์ Hadoop ของ Yahoo มีมากกว่า 42,000 เครื่อง (คุณสามารถดูขนาดคลัสเตอร์ในองค์กรต่างๆ ได้ที่ลิงก์นี้) ซึ่งหมายความว่าบางเครื่องจะรับประกันว่าจะล้มเหลว แนวทางปฏิบัติเกี่ยวกับข้อมูลขนาดใหญ่จำเป็นต้องตระหนักถึงการหยุดชะงักเหล่านี้และอยู่รอดได้โดยไม่มีผลกระทบที่สำคัญใดๆ

3. พื้นที่ข้อมูล ในระบบกระจายขนาดใหญ่ ข้อมูลจะถูกกระจายไปยังเครื่องจำนวนมาก หากข้อมูลอยู่ในเซิร์ฟเวอร์หนึ่งและประมวลผลบนเซิร์ฟเวอร์อื่น ค่าใช้จ่ายในการถ่ายโอนข้อมูลอาจสูงกว่าต้นทุนของการประมวลผลเอง ดังนั้น หนึ่งในหลักการที่สำคัญที่สุดสำหรับการออกแบบโซลูชัน BigData คือหลักการของพื้นที่ข้อมูล ถ้าเป็นไปได้ เราจะประมวลผลข้อมูลในเครื่องเดียวกับที่เราจัดเก็บไว้

เครื่องมือข้อมูลขนาดใหญ่ที่ทันสมัยทั้งหมดปฏิบัติตามหลักการทั้งสามนี้ไม่ทางใดก็ทางหนึ่ง เพื่อให้เป็นไปตามนั้น จำเป็นต้องมีวิธีการ วิธีการ และกระบวนทัศน์ในการพัฒนาเครื่องมือพัฒนาข้อมูล หนึ่งในวิธีการสุดคลาสสิคที่ผมจะวิเคราะห์ในการบรรยายวันนี้

3.3 แผนที่ลด

MapReduceเป็นรูปแบบการประมวลผลข้อมูลแบบกระจายที่เสนอโดย Google สำหรับการประมวลผลข้อมูลจำนวนมากในกลุ่มคอมพิวเตอร์ MapReduce แสดงได้ดีด้วยรูปภาพต่อไปนี้:

MapReduce จะถือว่าข้อมูลถูกจัดระเบียบเป็นบางระเบียน การประมวลผลข้อมูลเกิดขึ้นใน 3 ขั้นตอน:

1. แผนที่เวที ในขั้นตอนนี้ ข้อมูลจะได้รับการประมวลผลล่วงหน้าโดยใช้ฟังก์ชัน map() ซึ่งกำหนดโดยผู้ใช้ งานของขั้นตอนนี้คือการประมวลผลล่วงหน้าและกรองข้อมูล การดำเนินการคล้ายกับการทำงานของแผนที่ในภาษาโปรแกรมการทำงาน - ฟังก์ชันที่กำหนดเองจะถูกนำไปใช้กับบันทึกอินพุตแต่ละรายการ

ฟังก์ชัน map() ที่ใช้กับบันทึกอินพุตเดียวจะสร้างคู่คีย์-ค่าจำนวนมาก ตั้งค่า - นั่นคือ สามารถส่งคืนเพียงหนึ่งเรกคอร์ด อาจไม่ส่งคืนอะไรเลย หรืออาจส่งคืนคู่คีย์-ค่าหลายคู่ สิ่งที่จะอยู่ในคีย์และค่านั้นขึ้นอยู่กับผู้ใช้ แต่คีย์เป็นสิ่งที่สำคัญมาก เนื่องจากข้อมูลที่มีคีย์เดียวในอนาคตจะตกอยู่ในอินสแตนซ์หนึ่งของฟังก์ชันลด

2. สับเปลี่ยนสเตจ มันไม่มีใครสังเกตเห็นโดยผู้ใช้ ในขั้นตอนนี้ เอาต์พุตของฟังก์ชันแผนที่จะ "แยก" - แต่ละช่องจะสอดคล้องกับคีย์เอาต์พุตหนึ่งปุ่มของระยะแผนที่ ในอนาคตตะกร้าเหล่านี้จะทำหน้าที่เป็นปัจจัยการผลิตสำหรับการลด

3. ลดขั้นตอน แต่ละ "ตะกร้า" ที่มีค่าที่สร้างขึ้นในขั้นตอนการสับเปลี่ยนจะเข้าสู่อินพุตของฟังก์ชัน reduce()

ผู้ใช้กำหนดฟังก์ชันลดขนาดและคำนวณผลลัพธ์สุดท้ายสำหรับ "ตะกร้า"เดียว ชุดของค่าทั้งหมดที่ส่งกลับโดยฟังก์ชัน reduce() คือผลลัพธ์สุดท้ายของงาน MapReduce

ข้อเท็จจริงเพิ่มเติมบางประการเกี่ยวกับ MapReduce:

  1. การเรียกใช้ฟังก์ชัน แผนที่ทั้งหมดทำงานอย่างอิสระและสามารถทำงานแบบขนานได้ รวมทั้งบนเครื่องคลัสเตอร์ต่างๆ
  2. การเรียกใช้ฟังก์ชัน ลดขนาดทั้งหมดทำงานโดยอิสระและสามารถทำงานแบบขนานได้ รวมถึงบนเครื่องคลัสเตอร์ต่างๆ
  3. การสุ่มเป็นการภายในแทนการเรียงลำดับแบบขนาน ดังนั้นจึงสามารถทำงานบนเครื่องคลัสเตอร์ต่างๆ ได้ คะแนน 1-3 ช่วยให้คุณสามารถใช้หลักการของการปรับขยายแนวนอน .
  4. โดยปกติแล้ว ฟังก์ชันแผนที่จะใช้ในเครื่องเดียวกับที่เก็บข้อมูล ซึ่งจะช่วยลดการส่งข้อมูลผ่านเครือข่าย (หลักการของตำแหน่งข้อมูล)
  5. MapReduce เป็นการสแกนข้อมูลทั้งหมดเสมอ ไม่มีดัชนีใดๆ ซึ่งหมายความว่า MapReduce ใช้งานได้ไม่ดีเมื่อต้องการการตอบสนองอย่างรวดเร็ว

3.4 ตัวอย่างของงานที่แก้ไขได้อย่างมีประสิทธิภาพด้วย MapReduce

การนับจำนวนคำ

เริ่มจากงานคลาสสิค - จำนวนคำ งานถูกกำหนดดังนี้: มีเอกสารจำนวนมาก งานคือการคำนวณจำนวนครั้งทั้งหมดที่เกิดขึ้นในคลังข้อมูลสำหรับแต่ละคำที่เกิดขึ้นอย่างน้อยหนึ่งครั้งในคลังข้อมูล

สารละลาย:

เนื่องจากเรามีเอกสารจำนวนมาก ให้เอกสารหนึ่งฉบับเป็นบันทึกอินพุตเดียวสำหรับงาน MapRreduce ใน MapReduce เราสามารถกำหนดฟังก์ชันที่ผู้ใช้กำหนดเท่านั้น ซึ่งเราจะทำ (เราจะใช้ pseudocode ที่เหมือน python):

def map(doc): 
for word in doc: 
yield word, 1 
def reduce(word, values): 
yield word, sum(values) 

ฟังก์ชั่นแผนที่เปลี่ยนเอกสารอินพุตเป็นชุดของคู่ (คำ 1) สับเปลี่ยนอย่างโปร่งใสสำหรับเราเปลี่ยนเป็นคู่ (คำ [1,1,1,1,1,1,1]) ลดผลรวมเหล่านี้ ส่งคืน คำตอบสุดท้ายของคำว่า

กำลังประมวลผลบันทึกระบบโฆษณา

ตัวอย่างที่สองนำมาจากการปฏิบัติจริงของ Data-Centric Alliance

งาน:มี csv-log ของระบบการโฆษณาของแบบฟอร์ม:

<user_id>,<country>,<city>,<campaign_id>,<creative_id>,<payment></p> 
 
11111,RU,Moscow,2,4,0.3 
22222,RU,Voronezh,2,3,0.2 
13413,UA,Kyiv,4,11,0.7 
… 

จำเป็นต้องคำนวณต้นทุนเฉลี่ยของการแสดงโฆษณาในเมืองต่างๆ ของรัสเซีย

สารละลาย:

def map(record): 
user_id, country, city, campaign_id, creative_id, payment = record.split(",") 
payment=float(payment) 
if country == "RU": 
yield city, payment 
def reduce(city, payments): 
yield city, sum(payments)/len(payments) 

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