Hadoop MapReduce Join & Counter พร้อมตัวอย่าง

เข้าร่วมใน Mapreduce คืออะไร?

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

เมื่อมีการกระจายการรวมใน MapReduce แล้ว Mapper หรือ ลด จะใช้ชุดข้อมูลที่เล็กกว่าเพื่อค้นหาบันทึกที่ตรงกันจากชุดข้อมูลขนาดใหญ่ จากนั้นรวมบันทึกเหล่านั้นเพื่อสร้างบันทึกผลลัพธ์

ประเภทของการเข้าร่วม

ขึ้นอยู่กับสถานที่ที่ดำเนินการรวมจริง การรวมใน Hadoop ถูกแบ่งออกเป็น-

1. การเข้าร่วมด้านแผนที่ – เมื่อผู้ทำแผนที่ดำเนินการเข้าร่วม จะเรียกว่าเป็นการรวมด้านแผนที่ ในประเภทนี้ การรวมจะดำเนินการก่อนที่ฟังก์ชันแผนที่จะใช้ข้อมูลจริง จำเป็นที่อินพุตของแต่ละแผนที่จะต้องอยู่ในรูปของพาร์ติชันและจัดเรียงตามลำดับ นอกจากนี้ จะต้องมีพาร์ติชั่นจำนวนเท่ากัน และจะต้องเรียงลำดับตามคีย์การรวม

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

ในที่นี้ การประมวลผลด้านแผนที่จะปล่อยคีย์การรวมและทูเพิลที่สอดคล้องกันของทั้งสองตาราง จากผลของการประมวลผลนี้ สิ่งอันดับทั้งหมดที่มีคีย์การรวมเดียวกันจะตกอยู่ในตัวลดขนาดเดียวกัน ซึ่งจะรวมบันทึกด้วยคีย์การรวมเดียวกัน

ผังกระบวนการโดยรวมของการรวมใน Hadoop แสดงอยู่ในไดอะแกรมด้านล่าง

ประเภทของการรวมใน Hadoop MapReduce
ประเภทของการรวมใน Hadoop MapReduce

วิธีรวมชุดข้อมูลสองชุด: ตัวอย่าง MapReduce

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

ตัวอย่าง MapReduce
ไฟล์ 1
ตัวอย่าง MapReduce
ไฟล์ 2

Input: ชุดข้อมูลอินพุตเป็นไฟล์ txt DeptName.txt และ DepStrength.txt

ดาวน์โหลดไฟล์อินพุตได้จากที่นี่

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

su - hduser_

ตัวอย่าง MapReduce

ขั้นตอน 1) คัดลอกไฟล์ zip ไปยังตำแหน่งที่คุณต้องการ

ตัวอย่าง MapReduce

ขั้นตอน 2) คลายการบีบอัดไฟล์ซิป

sudo tar -xvf MapReduceJoin.tar.gz

ตัวอย่าง MapReduce

ขั้นตอน 3) ไปที่ไดเร็กทอรี MapReduceJoin/

cd MapReduceJoin/

ตัวอย่าง MapReduce

ขั้นตอน 4) เริ่ม Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

ตัวอย่าง MapReduce

ขั้นตอน 5) DeptStrength.txt และ DeptName.txt เป็นไฟล์อินพุตที่ใช้สำหรับโปรแกรมตัวอย่าง MapReduce Join นี้

ไฟล์เหล่านี้จะต้องถูกคัดลอกไปยัง HDFS โดยใช้คำสั่งด้านล่าง -

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

ตัวอย่าง MapReduce

ขั้นตอน 6) รันโปรแกรมโดยใช้คำสั่งด้านล่าง-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

ตัวอย่าง MapReduce

ตัวอย่าง MapReduce

ขั้นตอน 7) หลังจากดำเนินการ ไฟล์เอาท์พุต (ชื่อ 'part-00000') จะถูกจัดเก็บไว้ในไดเร็กทอรี /output_mapreducejoin บน HDFS

สามารถดูผลลัพธ์ได้โดยใช้อินเทอร์เฟซบรรทัดคำสั่ง

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

ตัวอย่าง MapReduce

สามารถดูผลลัพธ์ได้ผ่านทางเว็บอินเตอร์เฟสเช่นกัน

ตัวอย่าง MapReduce

ตอนนี้เลือก 'เรียกดูระบบไฟล์' และนำทางขึ้นไป /output_mapreduceเข้าร่วม

ตัวอย่าง MapReduce

จุดเปิด ส่วน-r-00000

ตัวอย่าง MapReduce

ผลลัพธ์จะปรากฏขึ้น

ตัวอย่าง MapReduce

หมายเหตุ: โปรดทราบว่าก่อนที่จะรันโปรแกรมนี้ในครั้งต่อไป คุณจะต้องลบไดเร็กทอรีเอาต์พุต /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 ประเภท แผนที่ลด เคาน์เตอร์

  1. ตัวนับ Hadoop ในตัว:มีตัวนับ Hadoop ในตัวบางตัวที่มีอยู่สำหรับแต่ละงาน ด้านล่างนี้เป็นกลุ่มตัวนับในตัว -
    • ตัวนับงาน MapReduce – รวบรวมข้อมูลเฉพาะงาน (เช่น จำนวนบันทึกอินพุต) ในช่วงเวลาดำเนินการ
    • ตัวนับระบบไฟล์ – รวบรวมข้อมูล เช่น จำนวนไบต์ที่อ่านหรือเขียนโดยงาน
    • ตัวนับรูปแบบไฟล์อินพุต – รวบรวมข้อมูลจำนวนไบต์ที่อ่านผ่าน FileInputFormat
    • ตัวนับ FileOutputFormat – รวบรวมข้อมูลจำนวนไบต์ที่เขียนผ่าน FileOutputFormat
    • เคาน์เตอร์งาน – ตัวนับเหล่านี้ถูกใช้โดย JobTracสถิติที่พวกเขารวบรวมนั้นรวมถึง ตัวอย่างเช่น จำนวนงานที่เริ่มต้นสำหรับงานหนึ่งๆ
  2. เคาน์เตอร์ที่ผู้ใช้กำหนด

นอกเหนือจากตัวนับในตัวแล้ว ผู้ใช้สามารถกำหนดตัวนับของตนเองได้โดยใช้ฟังก์ชันที่คล้ายกันที่มีให้โดย การเขียนโปรแกรมภาษา. ตัวอย่างเช่นใน 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.ไม่ถูกต้อง

สรุปโพสต์นี้ด้วย: