ตัวอย่าง HBase POC



โพสต์นี้กล่าวถึงตัวอย่าง Proof of Concept for HBase คุณสามารถหาคำอธิบายที่ชัดเจนเกี่ยวกับแนวคิดเพื่อให้คุณเข้าใจ HBase ได้ดีขึ้น

ในบล็อกนี้เราจะพูดถึงตัวอย่าง Proof of Concept สำหรับ HBase





ที่นี่เรามีชุดข้อมูลดังภาพด้านล่าง

Sample_Hbase_Use_case



ชุดข้อมูลนี้ประกอบด้วยรายละเอียดเกี่ยวกับระยะเวลาของการโทรเข้าทั้งหมดการโทรออกและข้อความที่ส่งจากหมายเลขโทรศัพท์มือถือเฉพาะในวันที่ระบุ

ฟิลด์แรกแสดงถึงวันที่ฟิลด์ที่สองหมายถึงหมายเลขโทรศัพท์มือถือฟิลด์ที่สามแสดงถึงระยะเวลาทั้งหมดของการโทรเข้าฟิลด์ที่สี่หมายถึงระยะเวลาทั้งหมดของการโทรออกและฟิลด์ที่ห้าหมายถึงจำนวนข้อความทั้งหมดที่ส่ง

ตอนนี้งานของเราคือการดึงข้อมูลระยะเวลาของการโทรเข้าและโทรออกและข้อความที่ส่งจากหมายเลขโทรศัพท์ในวันใดวันหนึ่ง



ในกรณีการใช้งานนี้ฉันกำลังพยายามกรองระเบียน 15มีนาคม 2014 นี่คือโปรแกรม HBase เพื่อบรรลุเป้าหมายนี้

ด้านล่างนี้คือรหัสทั้งหมดของมัน

สาธารณะ ชั้นเรียน ตัวอย่าง{

เอกชน คงที่ การกำหนดค่า Conf

คงที่ HTable โต๊ะ

สาธารณะ ตัวอย่าง (String tableName, String colFams) พ่น IOException {

Conf = HBaseConfiguration สร้าง ()

createTable (tableName, colFams)

โต๊ะ = ใหม่ HTable ( Conf , tableName)

}

เป็นโมฆะ createTable (String tableName, String colFams) พ่น IOException {

HBaseAdmin hbase = ใหม่ HBaseAdmin ( Conf )

HTableDescriptor desc = ใหม่ HTableDescriptor (ชื่อตาราง)

HColumnDescriptor meta = ใหม่ HColumnDescriptor (colFams.getBytes ())

desc.addFamily (เมตา)

hbase.createTable (รายละเอียด)

}

สาธารณะ คงที่ เป็นโมฆะ addColumnEntry (String tableName แถวสตริง

สตริง colFamilyName สตริง colName ค่าสตริง)

พ่น IOException {

ไบต์ [] rowKey = ไบต์ toBytes (แถว)

ใส่ putdata = ใหม่ ใส่ (rowKey)

putdata.add (ไบต์. toBytes (colFamilyName), ไบต์ toBytes (colName),

ไบต์ toBytes (ค่า))

โต๊ะ .put (ใส่ข้อมูล)

}

สาธารณะ คงที่ เป็นโมฆะ getAllRecord (String tableName, สตริง startPartialKey,

สตริง endPartialKey) พ่น IOException {

ลอง {

สแกน s

ถ้า (startPartialKey == โมฆะ || endPartialKey == โมฆะ )

s = ใหม่ สแกน ()

อื่น

s = ใหม่ สแกน (ไบต์. toBytes (startPartialKey),

ไบต์ toBytes (endPartialKey))

ResultScanner ss = โต๊ะ .getScanner (s)

HashMapoutputRec = ใหม่ HashMap()

สตริง imsi =“”

สำหรับ (ผล r: ss) {

HashMap keyVal = ใหม่ แฮชแมพ ()

สำหรับ (KeyValue kv: r.raw ()) {

imsi = ใหม่ สตริง (kv.getRow ()) สตริงย่อย (10)

keyVal.put ( ใหม่ สตริง (kv.getQualifier ()),

ใหม่ สตริง (kv.getValue ()))

outputRec.put (imsi, keyVal)

ถ้า (keyVal.size () == 3)

ระบบ. ออก .println (ใช้เวลา +”” +“ นาทีที่เข้ามา:”

+ keyVal.get (“ c1″) +” นาทีที่จะมาถึง:”

+ keyVal.get (“ c2″) +” ข้อความ:”

+ keyVal.get (“ c3”))

}

}

} ในที่สุด {

}

}

สาธารณะ คงที่ เป็นโมฆะ หลัก (สตริง [] args) พ่น IOException {

สตริง tableName =“ daterecords”

สตริง colFamilyNames =“ i”

การทดสอบตัวอย่าง = ใหม่ ตัวอย่าง (tableName, colFamilyNames)

สตริง fileName =“ / home / cloudera / Desktop / data”

// สิ่งนี้จะอ้างอิงทีละบรรทัด

สายอักขระ = โมฆะ

ลอง {

// FileReader อ่านไฟล์ข้อความในการเข้ารหัสเริ่มต้น

FileReader fileReader = ใหม่ FileReader (ชื่อไฟล์)

// ห่อ FileReader ใน BufferedReader เสมอ

BufferedReader bufferedReader = ใหม่ BufferedReader (fileReader)

ในขณะที่ ((บรรทัด = bufferedReader.readLine ())! = โมฆะ ) {

สตริง [] values ​​= line.split (”“)

addColumnEntry (tableName, ค่า [0] +“ -” + ค่า [1],

colFamilyNames,“ c1”, ค่า [2])

addColumnEntry (tableName, ค่า [0] +“ -” + ค่า [1],

colFamilyNames,“ c2”, ค่า [3])

addColumnEntry (tableName, ค่า [0] +“ -” + ค่า [1],

colFamilyNames,“ c3”, ค่า [4])

}

bufferedReader.close ()

} จับ (FileNotFoundException เช่น) {

ระบบ. ออก .println (“ ไม่สามารถเปิดไฟล์ ‘” + fileName +“‘”)

} จับ (IOException เช่น) {

ระบบ. ออก .println (“ เกิดข้อผิดพลาดในการอ่านไฟล์ ‘” + fileName +“‘”)

// หรือเราทำได้แค่:

// เช่น printStackTrace ()

}

getAllRecord (tableName,“ 20140315”,“ 20140316”)

}

}

ที่นี่เราได้สร้างออบเจ็กต์ของ Configuration, HTable class และสร้าง Hbase Table ด้วยชื่อ: วันที่ และตระกูลคอลัมน์: ผม .

ในกรณีการใช้งานนี้เราจะใช้การรวมกันของวันที่และหมายเลขโทรศัพท์มือถือโดยคั่นด้วย '-' เป็นคีย์แถวสำหรับตาราง Hbase นี้และระยะเวลาการโทรเข้าและโทรออก 'จำนวนข้อความที่ส่งเป็นคอลัมน์' c1 ',' c2 ',' c3 'สำหรับคอลัมน์ตระกูล' i '

เรามีข้อมูลอินพุตที่เก็บไว้ในระบบไฟล์ภายในของ Cloudera ดังนั้นเราจำเป็นต้องเขียน Java Logic ที่อ่านข้อมูลจากไฟล์

ด้านล่างนี้คือตรรกะของ Java

ในวิธีนี้เรากำลังจัดเก็บข้อมูลลงในตารางสำหรับแต่ละคอลัมน์ของตระกูลคอลัมน์

เราสามารถตรวจสอบข้อมูลที่จัดเก็บในตาราง Hbase ‘daterecords’ ได้โดยใช้คำสั่ง scan

คุณจะได้รับข้อมูลดังภาพด้านล่าง

ตอนนี้เราได้แทรกข้อมูลลงในตาราง HBase เรียบร้อยแล้ว

ให้เราดึงข้อมูลที่เก็บไว้ในตารางของวันที่โดยเฉพาะ

ในกรณีการใช้งานนี้เรากำลังพยายามดึงข้อมูลของวันที่: 15มีนาคม 2557

ในการดึงข้อมูลเราได้สร้างวิธีการ

getAllRecord (String tableName, String startPartialKey, String endPartialKey)

พารามิเตอร์แรกแสดงถึงชื่อตารางส่วนที่สองหมายถึงวันที่เริ่มต้นที่เราต้องดึงข้อมูลและพารามิเตอร์ที่สามคือวันที่เริ่มต้นถัดไป

เช่น:

getAllRecord (tableName,“ 20140315”,“ 20140316”)

ตอนนี้ให้เราเข้าใจ ตรรกะ ของวิธีนี้

เรากำลังพยายามสแกนตาราง Hbase โดยใช้ HBase API ด้วยความช่วยเหลือของ startPartialKey และ endPartialKey

เนื่องจาก StartPartialKey และ endPartialkey ไม่เป็นโมฆะมันจะไปที่บล็อกอื่นและสแกนระเบียนที่มีค่า startPartialKey

เราได้สร้างออบเจ็กต์ของเครื่องสแกนผลลัพธ์ซึ่งเก็บบันทึกที่สแกนของตาราง Hbase และ HashMap เพื่อจัดเก็บผลลัพธ์ที่จะเป็นผลลัพธ์

เรากำลังสร้างออบเจ็กต์ของ Result เพื่อรับที่เก็บข้อมูลใน Result Scanner และดำเนินการสำหรับลูป

imsi คือสตริงที่กำหนดเพื่อจัดเก็บหมายเลขโทรศัพท์มือถือและ keyVal คือ Hash Map ที่เก็บเอาต์พุตที่ดึงมาจากคอลัมน์ของโทรศัพท์เครื่องใดเครื่องหนึ่ง

เราได้ให้ 20140315-1234567890 เป็น rowkey ไปยังตาราง Hbase ใน 20140315 นี้แสดงถึงวันที่และ 1234567890 แทนหมายเลขโทรศัพท์มือถือ

วิธีการติดตั้ง eclipse ide

เนื่องจากเราต้องการเพียงหมายเลขโทรศัพท์มือถือเราจึงใช้วิธีการสตริงย่อยเพื่อดึงข้อมูล

เรากำลังดึงข้อมูลจาก r.raw () และจัดเก็บไว้ใน HashMap โดยใช้ Put

ในที่สุดเราก็พยายามพิมพ์ลงบนคอนโซล

ผลลัพธ์จะเป็นดังภาพด้านล่าง

เราได้รับบันทึกของวันที่: 15 เรียบร้อยแล้วมีนาคม 2557.