หลังจากที่ผมได้ทำการติดตั้ง Hadoop 1.2.1 บน Ubuntu 12.04 LTS ไปเรียบร้อยแล้ว ซึ่งก็จะได้โครงสร้างพื้นฐานของการประมวลผลแบบกระจายแบบ MapReduce บน HDFS (Hadoop Distributed File System) แต่การประมวลผลแบบ MapReduce บน HDFS นั้น ค่อนข้างมีความซับซ้อนพอสมควร ผมจึงยังไม่อยากแนะนำ ถ้าหากใครสนใจ สามารถอ่านเพิ่มเติมได้จากลิ้งค์อ้างอิงท้ายบทความนี้นะครับ
แต่สิ่งที่ผมอยากจะแนะนำในบทความนี้ก็คือ HBase ครับ ซึ่งก็คือระบบฐานข้อมูลแบบกระจายของ Hadoop และสามารถรองรับข้อมูลขนาดใหญ่มาก (Big Data) ในระดับ พันล้าน row และ ล้าน column ได้ โดย HBase จะจัดเก็บข้อมูลแบบกระจายอยู่บน HDFS และคำสั่งที่จะ Create Read Update Delete (CRUD) นั้นจะเป็นการประมวลผลแบบกระจายแบบ MapReduce น่าสนใจไหมครับ หากใครสนใจก็คอยติดตามอ่านบทความต่อๆไปด้วยนะครับ เพราะครั้งนี้ผมจะเริ่มต้นที่การติดตั้งก่อน
แต่สิ่งที่ผมอยากจะแนะนำในบทความนี้ก็คือ HBase ครับ ซึ่งก็คือระบบฐานข้อมูลแบบกระจายของ Hadoop และสามารถรองรับข้อมูลขนาดใหญ่มาก (Big Data) ในระดับ พันล้าน row และ ล้าน column ได้ โดย HBase จะจัดเก็บข้อมูลแบบกระจายอยู่บน HDFS และคำสั่งที่จะ Create Read Update Delete (CRUD) นั้นจะเป็นการประมวลผลแบบกระจายแบบ MapReduce น่าสนใจไหมครับ หากใครสนใจก็คอยติดตามอ่านบทความต่อๆไปด้วยนะครับ เพราะครั้งนี้ผมจะเริ่มต้นที่การติดตั้งก่อน
HBase Version
สำหรับรุ่น stable ปัจจุบันนั้น เป็นรุ่น 0.94.15 แต่มีรุ่นใหม่ล่าสุดคือ 0.96.1.1 เนื่องจาก Hadoop ได้แตกออกเป็น 2 รุ่นคือ 1.x และ 2.x ซึ่ง HBase รุ่นไหนควรใช้กับ Hadoop รุ่นไหนนั้น สามารถดูได้จากตารางในหัวข้อ 2.1.3 บทที่ 2 เรื่อง Apache HBase Configuration ของหนังสือ The Apache HBase™ Reference Guide
เนื่องจากผมใช้ Hadoop 1.2.1 และ HBase 0.96.0 ผ่านการทดสอบกับ Hadoop 1.1.x แล้ว (เสียดายที่ไม่มีข้อมูลรุ่นใหม่ล่าสดุ) ผมจึงคาดว่า HBase รุ่นใหม่ล่าสุดนี้ น่าจะใช้กับ Hadoop 1.2.1 ได้ (หวังว่าผมจะคาดการณ์ไม่ผิดนะ) จึงทดลองดาวโหลด Binary Package (hbase-0.96.1.1-hadoop1-bin.tar.gz) มาติดตั้ง
Operation Mode
HBase จะประกอบไปด้วยบริการ 3 ประเภทคือ
- master (HMaster) เป็นบริการหลักของ HBase ซึ่งจะคอยตรวจสอบการทำงานของ regionserver โดยปกติแล้วจะทำงานอยู่บน NameNode ของ Hadoop
- regionserver (HRegionServer) เป็นบริการที่ทำหน้าที่ดูแลและจัดการข้อมูลภายใน region นั้นๆ โดยปกติแล้วจะทำงานอยู่บน DataNode ของ Hadoop
- zookeeper (HQuorumPeer) เป็นบริการที่ทำหน้าที่ผสานงานระหว่างเครื่องต่างๆในระบบประมวลผลแบบกระจาย ซึ่ง HBase นำมาใช้ผสานงานระหว่างเครื่อง HMaster และ HRegionServer
ซึ่งบริการทั้ง 3 ประเภท สามารถทำงานอยู่บนเครื่องๆเดียวได้ (Single-Node โหมด) โดย HBase มีโหมดการทำงาน 3 โหมดเช่นเดียวกัน Hadoop คือ Standalone Pseudo-Distributed และ Fully-Distributed สำหรับ Standalone นั้น จะไม่ทำงานเป็นเครือข่าย และข้อมูลจะถูกจัดเก็บแบบไฟล์ปกติ จะไม่ใช้ HDFS ส่วนการทำงานในโหมด Pseudo-Distributed และ Fully-Distributed จะทำงานเป็นเครือข่าย และข้อมูลจะถูกจัดเก็บอยู่ใน HDFS ของ Hadoop
Setup Single-Node Mode
เนื่องจาก HBase ไม่มี Debian Package ให้ มีแต่ Binary Package และภายใน Package จะมีทั้งโปรแกรมและ config ไฟล์รวมๆกันอยู่ ไม่ได้แยก config ไฟล์ไปไว้ที่ /etc แต่อย่างใด ผมจึงเลือกที่จะแตกไฟล์ไว้ที่ /usr/local แทน ด้วยคำสั่ง
cd /usr/local
sudo tar xzf /path/to/hbase-0.96.1.1-hadoop1-bin.tar.gz
Configuration ไฟล์ที่เกี่ยวข้องจะอยู่ในโฟลเดอร์ conf มีไฟล์ต่างๆดังนี้
- hbase-env.sh
- กำหนดค่า JAVA_HOME ใหม่ให้ถูกต้อง สำหรับค่า default ที่กำหนดไว้คือ /usr/java/jdk1.6.0/ แต่เนื่องจากบน Ubuntu จะใช้ OpenJDK เป็นหลัก ผมจึงเปลี่ยนค่าให้เป็น /usr/lib/jvm/default-java ซึ่งจะใช้ default JDK ที่ติดตั้งไว้ โดยปกติแล้ว Ubuntu 12.04 LTS จะใช้ OpenJDK 6 ซึ่งน่าจะเข้ากันได้ดี แต่เนื่องจากผมมีโปรแกรมบางตัวที่ใช้ Java 7 จึงเปลี่ยนมาใช้ OpenJDK 7 (หวังว่าจะไม่มีปัญหา)
- กำหนดค่า HBASE_MANAGES_ZK=true ซึ่งจะทำให้มีการ start zookeeper อัตโนมัติพร้อมๆกับตอน start HBase (โดย default ค่านี้จะเป็น true อยู่แล้ว เราอาจจะไม่กำหนดก็ได้)
- hbase-site.xml
- ค่า default ต่างๆระบุไว้ที่หัวข้อ 2.3.1.1 เรื่อง HBase Default Configuration ของหนังสือ The Apache HBase™ Reference Guide ทำให้เราไม่จำเป็นต้องระบุค่าทุกๆค่า ซึ่งมีจำนวนมาก เราสามารถระบุเฉพาะค่าที่ไม่ตรงกับ default ก็พอ
- กำหนดค่า hbase.rootdir เพื่อระบุว่าข้อมูล HBase ทั้งหมดจะอยู่ที่ไหน เช่น เก็บไว้ที่ /hbase ใน HDFS ซึ่งสามารถเข้าถึงได้ดังนี้
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:8020/hbase</value>
</property>
- กำหนดค่า hbase.cluster.distributed เป็น true
- กำหนดค่า hbase.zookeeper.quorum เป็นรายชื่อเครื่องทั้งหมดที่อยู่ในกลุ่มของ HBase ในที่นี้เราตั้งค่าสำหรับ Single-Node จึงกำหนดให้มีเพียง localhost เท่านั้น
เนื่องจากเรากำหนดให้ HBase จัดเก็บข้อมูลไว้ที่ /hbase ตามที่ตั้งค่าไว้ใน hbase-site.xml เราจึงต้องสร้างโฟลเดอร์เตรียมไว้ด้วยคำสั่ง
hadoop fs -mkdir /hbaseหากไม่สามารถสร้างได้ เนื่องจากปกติแล้ว Hadoop ที่ติดตั้งด้วย Debian Package จะใช้ user ชื่อ hdfs ในการจัดการ HDFS แทนที่จะใช้ root เราจึงอาจจะต้องสั่งสร้าง /hbase ด้วยคำสั่ง
sudo -u hdfs hadoop fs -mkdir /hbaseจากนั้น จึงสร้าง user root บนระบบ Hadoop ด้วยคำสั่ง
hadoop-create-user.sh -u rootแล้วกำหนดสิทธิ์ให้ user root สามารถจัดการ /hbase ได้ ด้วยการเปลี่ยนเจ้าของ โดยสั่ง
sudo -u hdfs hadoop fs -chown root /hbaseหากตรวจสอบโฟลเดอร์ที่สร้างขึ้นด้วยคำสั่ง hadoop fs -ls / ดูจะพบว่า /hbase เปลี่ยนเป็นของ root เรียบร้อยดังนี้
# hadoop fs -ls /
Found 3 items
drwx------ - root supergroup 0 2014-02-08 17:58 /hbase
drwxrwxrwx - hdfs supergroup 0 2014-02-07 10:29 /tmp
drwxr-xr-x - hdfs supergroup 0 2014-02-07 15:19 /user
Start/Stop Service
เนื่องจากการ start/stop บริการต่างๆของ HBase นั้น จะมีการติดต่อไปยัง Hadoop ด้วย ssh ซึ่งจะมีการถามรหัสผ่านทุกครั้ง ทำให้ไม่สะดวกต่อการสั่งงาน โดยเฉพาะหากเราต้องการตั้งให้มีการ start/stop อัตโนมัติ การที่เราจะใช้ ssh โดยไม่ต้องป้อนรหัสผ่านเลยนั้น จะต้องใช้กุญแจอิเล็กทรอนิกส์เป็นรหัสผ่านแทน ซึ่งสามารถตรวจสอบว่ามีการตั้งค่ากุญแจอิเล็กทรอนิกส์สำหรับ root ไว้แล้วหรือยังโดยใช้คำสั่ง
sudo ssh localhost
หากสามารถเข้าได้โดยไม่ต้องป้อนรหัสผ่าน แสดงว่าเราได้เคยตั้งค่ากุญแจรหัสอิเล็กทรอนิกส์ไว้แล้ว (อาจจะมีโปรแกรมบางชนิดมีการแนะนำให้ทำไว้แล้ว) ถ้าหากต้องป้อนรหัสผ่าน แสดงว่ายังไม่ได้ตั้งค่ากุญแจอิเล็กทรอนิกส์ไว้ เราจะต้องสร้างกุญแจขึ้นมาใหม่ด้วยคำสั่ง ssh-keygen ดังนี้
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
คำสั่งนี้ จะสร้างกุญแจรหัสของเราขึ้นมา โดยเก็บไว้ที่ไฟล์ ~/.ssh/id_dsa ซึ่งเป็นกุญแจส่วนตัวของเรา (Private Key) และจะมีไฟล์ ~/.ssh/id_dsa.pub ซึ่งเป็นกุญแจสาธารณะ (Public Key) สำหรับให้ผู้ที่เราจะติดต่อแลกเปลี่ยนข้อมูลกัน โดยเราจะต้องนำเอากุญแจสาธารณะไปไว้ที่ไฟล์ ~/.ssh/authorized_keys ของเครื่องที่เราจะติดต่อด้วย โดยใช้คำสั่งดังนี้
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
เมื่อตั้งค่ากุญแจรหัสอิเล็กทรอนิกส์แล้ว ก็จะสามารถสั่ง start/stop บริการต่างๆของ HBase ได้อย่างราบรื่น ซึ่งมีสคริปท์ให้เราเรียกใช้ได้อยู่ในโฟลเดอร์ bin คือ สั่ง start ด้วยคำสั่ง
sudo /path/to/hbase/bin/start-hbase.sh
สั่ง stop บริการด้วย
sudo /path/to/hbase/bin/stop-hbase.sh
ปัญหาที่อาจจะเกิดขึ้น
เมื่อ start HBase แล้ว ตรวจสอบบริการต่างๆด้วยคำสั่ง jps ต้องพบบริการ master (HMaster) regionserver (HRegionServer) และ zookeeper (HQuorumPeer) หากบริการใดไม่ทำงาน ควรตรวจสอบดูข้อผิดพลาดใน log ไฟล์ เช่น ถ้า master ไม่ทำงาน log ไฟล์ของ master แสดงข้อความFATAL [master:SLOffice:60000] master.HMaster: Unhandled exception. Starting shutdown.
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="":hdfs:supergroup:rwxr-xr-x
ซึ่งหมายความว่า HBase กำลังเข้าถึง HDFS ด้วย user root เพื่อที่จะเขียนข้อมูล แต่ไม่มีสิทธิ์ แสดงว่าเราอาจจะลืมทำขั้นตอนที่สร้าง /hbase และเปลี่ยนสิทธิ์ให้ root เป็นต้น
อ้างอิง
- สมชัย หลิมศิโรรัตน์, Hadoop 1.x Installation on Ubuntu
- The Apache Software Foundation, MapReduce Tutorial
- The Apache Software Foundation, HDFS Architecture Guide
- The Apache Software Foundation, HBase
- The Apache Software Foundation, The Apache HBase™ Reference Guide
ไม่มีความคิดเห็น:
แสดงความคิดเห็น