Hadoop MapReduce Join & Counter พร้อมตัวอย่าง
เข้าร่วมใน Mapreduce คืออะไร?
Mapreduce เข้าร่วม การดำเนินการนี้ใช้เพื่อรวมชุดข้อมูลขนาดใหญ่สองชุดเข้าด้วยกัน อย่างไรก็ตาม กระบวนการนี้เกี่ยวข้องกับการเขียนโค้ดจำนวนมากเพื่อดำเนินการรวมจริง การรวมชุดข้อมูลสองชุดเริ่มต้นด้วยการเปรียบเทียบขนาดของชุดข้อมูลแต่ละชุด หากชุดข้อมูลชุดหนึ่งมีขนาดเล็กกว่าเมื่อเปรียบเทียบกับชุดข้อมูลอีกชุดหนึ่ง ชุดข้อมูลที่เล็กกว่าจะถูกกระจายไปยังโหนดข้อมูลทุกโหนดในคลัสเตอร์
เมื่อมีการกระจายการรวมใน MapReduce แล้ว Mapper หรือ ลด จะใช้ชุดข้อมูลที่เล็กกว่าเพื่อค้นหาบันทึกที่ตรงกันจากชุดข้อมูลขนาดใหญ่ จากนั้นรวมบันทึกเหล่านั้นเพื่อสร้างบันทึกผลลัพธ์
ประเภทของการเข้าร่วม
ขึ้นอยู่กับสถานที่ที่ดำเนินการรวมจริง การรวมใน Hadoop ถูกแบ่งออกเป็น-
1. การเข้าร่วมด้านแผนที่ – เมื่อผู้ทำแผนที่ดำเนินการเข้าร่วม จะเรียกว่าเป็นการรวมด้านแผนที่ ในประเภทนี้ การรวมจะดำเนินการก่อนที่ฟังก์ชันแผนที่จะใช้ข้อมูลจริง จำเป็นที่อินพุตของแต่ละแผนที่จะต้องอยู่ในรูปของพาร์ติชันและจัดเรียงตามลำดับ นอกจากนี้ จะต้องมีพาร์ติชั่นจำนวนเท่ากัน และจะต้องเรียงลำดับตามคีย์การรวม
2. การรวมแบบลดด้าน – เมื่อทำการเข้าร่วมโดยตัวลด จะเรียกว่าการรวมแบบลดด้าน ไม่จำเป็นที่จะต้องมีชุดข้อมูลในรูปแบบที่มีโครงสร้าง (หรือแบ่งพาร์ติชัน) ในการเข้าร่วมนี้
ในที่นี้ การประมวลผลด้านแผนที่จะปล่อยคีย์การรวมและทูเพิลที่สอดคล้องกันของทั้งสองตาราง จากผลของการประมวลผลนี้ สิ่งอันดับทั้งหมดที่มีคีย์การรวมเดียวกันจะตกอยู่ในตัวลดขนาดเดียวกัน ซึ่งจะรวมบันทึกด้วยคีย์การรวมเดียวกัน
ผังกระบวนการโดยรวมของการรวมใน Hadoop แสดงอยู่ในไดอะแกรมด้านล่าง

วิธีรวมชุดข้อมูลสองชุด: ตัวอย่าง MapReduce
มีชุดข้อมูลสองชุดในสองไฟล์ที่แตกต่างกัน (แสดงด้านล่าง) Key Dept_ID นั้นพบได้ทั่วไปในทั้งสองไฟล์ เป้าหมายคือการใช้ MapReduce Join เพื่อรวมไฟล์เหล่านี้


Input: ชุดข้อมูลอินพุตเป็นไฟล์ txt DeptName.txt และ DepStrength.txt
ดาวน์โหลดไฟล์อินพุตได้จากที่นี่
ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Hadoop แล้ว ก่อนที่คุณจะเริ่มต้นด้วยกระบวนการจริงตัวอย่าง MapReduce Join ให้เปลี่ยนผู้ใช้เป็น 'hduser' (รหัสที่ใช้ขณะกำหนดค่า Hadoop คุณสามารถสลับเป็นรหัสผู้ใช้ที่ใช้ในระหว่างการกำหนดค่า Hadoop ของคุณ)
su - hduser_
ขั้นตอน 1) คัดลอกไฟล์ zip ไปยังตำแหน่งที่คุณต้องการ
ขั้นตอน 2) คลายการบีบอัดไฟล์ซิป
sudo tar -xvf MapReduceJoin.tar.gz
ขั้นตอน 3) ไปที่ไดเร็กทอรี MapReduceJoin/
cd MapReduceJoin/
ขั้นตอน 4) เริ่ม Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
ขั้นตอน 5) DeptStrength.txt และ DeptName.txt เป็นไฟล์อินพุตที่ใช้สำหรับโปรแกรมตัวอย่าง MapReduce Join นี้
ไฟล์เหล่านี้จะต้องถูกคัดลอกไปยัง HDFS โดยใช้คำสั่งด้านล่าง -
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
ขั้นตอน 6) รันโปรแกรมโดยใช้คำสั่งด้านล่าง-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
ขั้นตอน 7) หลังจากดำเนินการ ไฟล์เอาท์พุต (ชื่อ 'part-00000') จะถูกจัดเก็บไว้ในไดเร็กทอรี /output_mapreducejoin บน HDFS
สามารถดูผลลัพธ์ได้โดยใช้อินเทอร์เฟซบรรทัดคำสั่ง
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
สามารถดูผลลัพธ์ได้ผ่านทางเว็บอินเตอร์เฟสเช่นกัน
ตอนนี้เลือก 'เรียกดูระบบไฟล์' และนำทางขึ้นไป /output_mapreduceเข้าร่วม
จุดเปิด ส่วน-r-00000
ผลลัพธ์จะปรากฏขึ้น
หมายเหตุ: โปรดทราบว่าก่อนที่จะรันโปรแกรมนี้ในครั้งต่อไป คุณจะต้องลบไดเร็กทอรีเอาต์พุต /output_mapreducejoin
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
ทางเลือกอื่นคือใช้ชื่ออื่นสำหรับไดเร็กทอรีเอาต์พุต
ตัวนับใน MapReduce คืออะไร
A ตัวนับใน MapReduce เป็นกลไกที่ใช้ในการรวบรวมและวัดข้อมูลทางสถิติเกี่ยวกับงานและเหตุการณ์ MapReduce ตัวนับจะเก็บข้อมูลไว้ track คือค่าสถิติต่างๆ ของงานใน MapReduce เช่น จำนวนการดำเนินการที่เกิดขึ้นและความคืบหน้าของการดำเนินการ ตัวนับเหล่านี้ใช้สำหรับการวินิจฉัยปัญหาใน MapReduce
ตัวนับ Hadoop คล้ายกับการใส่ข้อความบันทึกลงในโค้ดสำหรับแผนที่หรือลดขนาด ข้อมูลนี้อาจเป็นประโยชน์สำหรับการวินิจฉัยปัญหาในการประมวลผลงาน MapReduce
โดยทั่วไป ตัวนับเหล่านี้ใน Hadoop จะถูกกำหนดไว้ในโปรแกรม (map หรือ reduce) และจะเพิ่มขึ้นระหว่างการทำงานเมื่อเกิดเหตุการณ์หรือเงื่อนไขเฉพาะ (ที่เฉพาะเจาะจงกับตัวนับนั้น) ตัวอย่างการใช้งานตัวนับ Hadoop ที่ดีมากอย่างหนึ่งคือ... track รายการที่ถูกต้องและไม่ถูกต้องจากชุดข้อมูลอินพุต
ประเภทของตัวนับ MapReduce
โดยทั่วไปมี 2 ประเภท แผนที่ลด เคาน์เตอร์
- ตัวนับ Hadoop ในตัว:มีตัวนับ Hadoop ในตัวบางตัวที่มีอยู่สำหรับแต่ละงาน ด้านล่างนี้เป็นกลุ่มตัวนับในตัว -
- ตัวนับงาน MapReduce – รวบรวมข้อมูลเฉพาะงาน (เช่น จำนวนบันทึกอินพุต) ในช่วงเวลาดำเนินการ
- ตัวนับระบบไฟล์ – รวบรวมข้อมูล เช่น จำนวนไบต์ที่อ่านหรือเขียนโดยงาน
- ตัวนับรูปแบบไฟล์อินพุต – รวบรวมข้อมูลจำนวนไบต์ที่อ่านผ่าน FileInputFormat
- ตัวนับ FileOutputFormat – รวบรวมข้อมูลจำนวนไบต์ที่เขียนผ่าน FileOutputFormat
- เคาน์เตอร์งาน – ตัวนับเหล่านี้ถูกใช้โดย JobTracสถิติที่พวกเขารวบรวมนั้นรวมถึง ตัวอย่างเช่น จำนวนงานที่เริ่มต้นสำหรับงานหนึ่งๆ
- เคาน์เตอร์ที่ผู้ใช้กำหนด
นอกเหนือจากตัวนับในตัวแล้ว ผู้ใช้สามารถกำหนดตัวนับของตนเองได้โดยใช้ฟังก์ชันที่คล้ายกันที่มีให้โดย การเขียนโปรแกรมภาษา. ตัวอย่างเช่นใน Java 'enum' ใช้เพื่อกำหนดตัวนับที่ผู้ใช้กำหนด
ตัวอย่างเคาน์เตอร์
ตัวอย่าง MapClass พร้อมตัวนับเพื่อนับจำนวนค่าที่หายไปและไม่ถูกต้อง ไฟล์ข้อมูลอินพุตที่ใช้ในบทช่วยสอนนี้ ชุดข้อมูลอินพุตของเราเป็นไฟล์ CSV ยอดขายมกราคม 2009.csv
public static class MapClass
extends MapReduceBase
implements Mapper<LongWritable, Text, Text, Text>
{
static enum SalesCounters { MISSING, INVALID };
public void map ( LongWritable key, Text value,
OutputCollector<Text, Text> output,
Reporter reporter) throws IOException
{
//Input string is split using ',' and stored in 'fields' array
String fields[] = value.toString().split(",", -20);
//Value at 4th index is country. It is stored in 'country' variable
String country = fields[4];
//Value at 8th index is sales data. It is stored in 'sales' variable
String sales = fields[8];
if (country.length() == 0) {
reporter.incrCounter(SalesCounters.MISSING, 1);
} else if (sales.startsWith("\"")) {
reporter.incrCounter(SalesCounters.INVALID, 1);
} else {
output.collect(new Text(country), new Text(sales + ",1"));
}
}
}
ข้อมูลโค้ดด้านบนแสดงตัวอย่างการใช้งานตัวนับใน Hadoop Map ลด
ที่นี่ เคาน์เตอร์ขาย เป็นตัวนับที่กำหนดโดยใช้ 'แจกแจง'- มันใช้ในการนับ หายไป และ ไม่ถูกต้อง บันทึกอินพุต
ในข้อมูลโค้ด ถ้า 'ประเทศ' ฟิลด์มีความยาวเป็นศูนย์ ดังนั้นค่าของมันจึงหายไป และด้วยเหตุนี้ตัวนับจึงสอดคล้องกัน เคาน์เตอร์ขายขาดหายไป เพิ่มขึ้น
ต่อไปถ้า. 'ฝ่ายขาย' สนามเริ่มต้นด้วยก " จากนั้นบันทึกจะถือว่าไม่ถูกต้อง สิ่งนี้ถูกระบุโดยตัวนับที่เพิ่มขึ้น SalesCounters.ไม่ถูกต้อง











