ป้ายกำกับ

แสดงบทความที่มีป้ายกำกับ Hadoop แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Hadoop แสดงบทความทั้งหมด

วันอังคารที่ 17 มิถุนายน พ.ศ. 2557

HBase 0.96.2 Debian Package

เมื่อสองวันก่อนผมได้เขียนแนะนำการใช้งาน Hadoop Debian Package ที่ผมได้นำมาจัดการแก้ไขข้อผิดพลาดและทำ package ขึ้นมาใหม่ไว้แล้ว เพราะต้องการเผยแพร่ให้กับนักศึกษาของผม วันนี้ผมก็ได้ทำ Debian Package ของ HBase ขึ้นมาอีกไฟล์หนึ่ง เนื่องจาก HBase นั้นไม่มี Debian Package ให้ การจัดสภาพแวดล้อมและการตั้งค่าต่างๆ ยังไม่ค่อยจะสอดคล้องกับระบบของ Debian/Ubuntu มากนัก ผมจึงจำเป็นต้องแก้ไข ก็เลยจัดทำเป็น Debian Package ซะเลย จึงต้องการเผยแพร่และเขียนบันทึกแนะนำการใช้งานไว้ ณ. ที่นี้

Download

ไฟล์ที่ได้จัดทำขึ้นนี้เป็น HBase รุ่น 0.96.2 สามารถดาวโหลดได้ที่ Google Drive (md5sum) ซึ่งเป็นรุ่นที่ทำไว้สำหรับใช้งานร่วมกับ Hadoop 1.x สามารถดาวโหลดได้ที่ Google Drive (md5sum) เช่นกัน

Installation

เมื่อดาวโหลดมาแล้ว จะต้องติดตั้ง Hadoop 1.x ให้เรียบร้อยเสียก่อนนะครับ ซึ่งสามารถอ่านรายละเอียดวิธีการติดตั้งได้จากบทความเก่าที่เขียนไว้ จากนั้น สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hbase_0.96.2-hadoop1-SNORM_all.deb
โปรแกรมติดตั้งจะทำการสร้างกุญแจรหัสสำหรับใช้ในการเชื่อมต่อระหว่าง HBase กับ Hadoop โดยกุญแจรหัสนี้ จะสร้างไว้ในนามของ user hdfs จากนั้น จะทำการสร้างโฟลเดอร์ /hbase และโครงสร้างต่างๆสำหรับเก็บข้อมูลบนระบบไฟล์ HDFS ของ Hadoop แล้วจึงตั้งค่าให้บริการต่างๆทำงานอัตโนมัติ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/hbase เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น hbase-env.sh ซึ่งเป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำคัญๆที่จำเป็น เช่น JAVA_HOME และ HBASE_CONF_DIR เป็นต้น และไฟล์ hbase-site.xml เป็นต้น
  2. /usr/bin และ /usr/sbin เก็บไฟล์โปรแกรม hbase, start-hbase.sh และ stop-hbase.sh
  3. /usr/share/doc/hbase เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ HBase
  4. /usr/share/hbase เป็นโฟลเดอร์ที่เก็บโปรแกรม HBase
  5. /var/log/hadoop/hbase เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hbase ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา
เมื่อเสร็จสิ้นการติดตั้งแล้ว บริการต่างๆจะถูกสั่งให้ start ไว้แล้ว เราก็สามารถตรวจสอบระบบได้ว่ามีบริการต่างๆทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 3 บริการคือ
  1. hbase-zookeeper ชื่อที่แสดงคือ HQuorumPeer
  2. hbase-master ชื่อที่แสดงคือ HMaster เปิดเว็บดูได้ที่เว็บ http://localhost:60010
  3. hbase-regionserver ชื่อที่แสดงคือ HRegionServer เปิดเว็บดูได้ที่เว็บ http://localhost:60030
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ แต่หากไม่ครบถ้วน สามารถตรวจสอบข้อผิดพลาดได้ที่ log ไฟล์นะครับ

Start/Stop Service

หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • สำหรับ start บริการทั้งหมดคือ zookeeper master และ regionserver ตามลำดับ
sudo start-hbase
  •  สำหรับ stop บริการทั้งหมด
sudo stop-hbase
แต่หากต้องการ start/stop บริการทีละตัวก็สามารถทำได้ด้วยคำสั่ง
  • สำหรับ start บริการทีละตัว
sudo service ชื่อบริการ start
  • สำหรับ stop บริการทีละตัว
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ HBase นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-3 และเวลา stop ก็ควรย้อนลำดับกลับ 3-1

Usage

การใช้งานหลักๆคือคำสั่ง hbase หากสั่งโดยไม่ใส่ค่าใดๆจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hbase [<options>] <command> [<args>]
Options:
  --config DIR    Configuration direction to use. Default: ./conf
  --hosts HOSTS   Override the list in 'regionservers' file
Commands:
Some commands take arguments. Pass no args or -h for usage.
  shell           Run the HBase shell
  hbck            Run the hbase 'fsck' tool
  hlog            Write-ahead-log analyzer
  hfile           Store file analyzer
  zkcli           Run the ZooKeeper shell
  upgrade         Upgrade hbase
  master          Run an HBase HMaster node
  regionserver    Run an HBase HRegionServer node
  zookeeper       Run a Zookeeper server
  rest            Run an HBase REST server
  thrift          Run the HBase Thrift server
  thrift2         Run the HBase Thrift2 server
  clean           Run the HBase clean up script
  classpath       Dump hbase CLASSPATH
  mapredcp        Dump CLASSPATH entries required by mapreduce
  version         Print the version
  CLASSNAME       Run the class named CLASSNAME
คำสั่งที่ใช้ประจำคือคำสั่ง hbase shell เพื่อเข้าไปจัดการฐานข้อมูล รายละเอียดการใช้งานอื่นๆสามารถศึกษาเพิ่มเติมได้จาก document ที่ /usr/share/doc/hbase/docs นะครับ

วันเสาร์ที่ 14 มิถุนายน พ.ศ. 2557

Hadoop 1.x Debian Re-Package

นานมาแล้ว ผมได้เคยเขียนถึงปัญหาในการติดตั้ง Hadoop 1.x บน Ubuntu โดยใช้ Debian Package ซึ่งตอนนั้นผมเองก็ได้แก้ปัญหาหลายๆอย่างไปเรียบร้อยแล้ว และได้จัดการ repackage ใหม่ คือทำไฟล์ .deb ขึ้นมาใหม่ที่แก้ไขแล้ว แต่ผมก็ไม่ได้เผยแพร่ให้ใครใช้ เพราะไม่แน่ใจว่าจะมีใครต้องการบ้าง จนมาถึงวันนี้ ผมต้องการให้นักศีกษาของผมได้นำไปใช้ จึงคิดว่าน่าจะเขียนแนะนำไว้ตรงนี้เลยจะดีกว่า จึงเป็นที่มาของบันทึกนี้

Download

ไฟล์ที่ได้ทำการแก้ไขแล้ว สามารถดาวโหลดได้ที่ Google Drive (md5sum)

Installation

เมื่อดาวโหลดมาแล้ว สำหรับผู้ที่ใช้ GUI จะสามารถ Double-Click ที่ไฟล์และทำการติดตั้งได้เหมือนโปรแกรมอื่นๆตามปกติ แต่สำหรับผู้ที่ใช้ command-line interface สามารถติดตั้งได้ด้วยคำสั่ง
sudo dpkg -i hadoop_1.2.1-SNORM_amd64.deb
โปรแกรมติดตั้งจะทำการสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs ขึ้นมา โดยแบ่งหน้าที่ให้ hdfs ใช้จัดการกับระบบไฟล์ HDFS ส่วน mapred ใช้จัดการกับ job และ task นอกจากนี้ ไฟล์และโฟลเดอร์ที่ติดตั้งลงในเครื่องมีดังนี้
  1. /etc/default/hadoop-env.sh เป็นไฟล์สำหรับตั้งค่าสภาพแวดล้อมสำหรับรัน hadoop ซึ่งตัวแปรสำคัญที่จำเป็น เช่น JAVA_HOME และ HADOOP_CONF_DIR เป็นต้น
  2. /etc/hadoop เป็นโฟลเดอร์ที่เก็บ configuration ไฟล์ต่างๆ เช่น core-site.xml และ mapred-site.xml เป็นต้น
  3. /usr/share/doc/hadoop เป็นโฟลเดอร์ที่เก็บเอกสาร คู่มือของ Hadoop
  4. /usr/share/hadoop เป็นโฟลเดอร์ที่เก็บโปรแกรม hadoop
  5. /var/lib/hadoop เป็นโฟลเดอร์ที่เก็บข้อมูลของ hadoop (ระบบไฟล์ HDFS)
  6. /var/log/hadoop เป็นโฟลเดอร์ที่เก็บ log ไฟล์ของ hadoop ใช้ตรวจสอบการทำงานต่างๆหากมีปัญหา

Setup Single-Node Mode

เมื่อติดตั้งเสร็จแล้ว จะยังไม่สามารถใช้งานได้ทันที เนื่องจากเราจะต้องทำการตั้งค่า Configuration อีกหลายอย่าง รวมทั้งการ Format ระบบไฟล์ HDFS ขึ้นมาก่อน (เสมือนการ Format Harddisk) ซึ่งหากยังไม่คุ้นเคยกับ Hadoop มากนัก ผมขอแนะนำให้ใช้ค่า default คือการตั้งค่าให้ Hadoop ทำงานในโหมด Single Node (ทำงานอยู่บนเครื่องเดียว) โดยใช้คำสั่งดังนี้
sudo hadoop-setup-singlenode.sh
คำสั่งนี้จะแสดงหัวข้อให้เลือกว่าจะทำอะไรบ้าง นั่นคือ
  1. ถามว่าจะใช้ค่า default ของ single-node หรือไม่
  2. ถามว่าจะ format HDFS หรือไม่
  3. ถามว่าจะให้สร้างโครงสร้าง directory ต่างๆบน HDFS ด้วยหรือไม่
  4. ถามว่าจะให้รัน Hadoop ด้วยเลยหรือไม่
  5. ถามว่าจะให้ตั้งค่าให้รัน Hadoop เมื่อ reboot เครื่องด้วยหรือไม่
ให้ตอบ y ทั้งหมดเลย และเนื่องจากในข้อ 4 ระบุให้รัน Hadoop เลย เมื่อเสร็จสิ้นการ setup นี้แล้ว ดังนั้น เมื่อเสร็จสิ้นการ setup เราก็สามารถตรวจสอบระบบได้ว่า มี Hadoop ทำงานอยู่หรือไม่ ซึ่งทำได้ด้วยคำสั่ง
sudo jps
ซึ่งเป็นคำสั่งตรวจสอบ process ของโปรแกรมภาษา Java ทำงานคล้ายกับคำสั่ง ps ของ Unix นะครับ โดยผลลัพธ์จะต้องปรากฏชื่อบริการที่รันอยู่ทั้งหมด 4 บริการคือ
  1. hadoop-namenode ชื่อที่แสดงคือ NameNode เปิดเว็บดูได้ที่เว็บ http://localhost:50070
  2. hadoop-datanode ชื่อที่แสดงคือ DataNode
  3. hadoop-jobtracker ชื่อที่แสดงคือ JobTracker เปิดเว็บดูได้ที่เว็บ http://localhost:50030
  4. hadoop-tasktracker ชื่อที่แสดงคือ TaskTracker
หากมีบริการครบถ้วน แสดงว่าการติดตั้งสำเร็จ

Start/Stop Service

หากเลือกให้บริการต่างๆทำงานอัตโนมัติตอนเปิดเครื่องเลย (ตอบ y ข้อ 5) เราก็ไม่จำเป็นต้องสั่งให้บริการทำงานด้วยตัวเองแต่อย่างใด แต่หากมีปัญหา ต้องการหยุดบริการเพื่อแก้ไขปัญหา และสั่งให้ทำงานใหม่ สามารถสั่งได้ด้วยคำสั่งดังนี้
  • Start Services
sudo service ชื่อบริการ start
  • Stop Services
sudo service ชื่อบริการ stop
สำหรับชื่อบริการของ Hadoop นั้น ใช้ชื่อจากหัวข้อที่แล้วนะครับ และบริการเหล่านี้ควรจะ start ตามลำดับที่เรียงไว้ 1-4 และเวลา stop ก็ควรย้อนลำดับกลับ 4-1

นอกจากนี้ ผมได้เขียน script สำหรับ start/stop ไว้เพื่อให้สะดวกต่อการใช้งานไว้ด้วย คือคำสั่ง start-hadoop และ stop-hadoop ซึ่งสามารถเรียกใช้ได้เลย

Hadoop File System

เมื่อบริการทุกอย่างทำงานได้เรียบร้อยแล้ว และได้ Format HDFS เรียบร้อยแล้ว ซึ่งจะสามารถเข้าไปจัดการไฟล์ต่างๆในระบบได้ด้วยคำสั่ง hadoop แต่เนื่องจากตอนที่เรา Format และมีการเตรียมโครงสร้างไฟล์ต่างๆไว้ในเบื้องต้นนั้น โปรแกรม hadoop-setup-singlenode.sh ได้ใช้ user hdfs เป็นผู้สร้างโครงสร้างไฟล์ทั้งหมด ทำให้สิทธิ์ในการเข้าถึงไฟล์และโฟลเดอร์ต่างๆเป็นของ hdfs ดังนั้น เราควรจะใช้ user hdfs นี้จัดการ ซึ่งสามารถทำได้หลายแบบ เช่น ใช้คำสั่ง
sudo su hdfs
เป็นการเปลี่ยนไปใช้ user hdfs  เสมือนว่าเรา login ด้วย hdfs เมื่อเสร็จงานแล้ว เราจะต้องสั่ง exit เพื่อกลับออกมาเป็น user เดิม

หรืออีกวิธีหนึ่งคือใช้คำสั่ง sudo -u hdfs นำหน้าคำสั่งที่ต้องการทุกครั้ง ซึ่งหากพิมพ์คำสั่ง
sudo -u hdfs hadoop
โดยไม่ระบุค่าใดๆ โปรแกรมจะแสดงข้อความแนะนำการใช้งานดังนี้
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
  namenode -format     format the DFS filesystem
  secondarynamenode    run the DFS secondary namenode
  namenode             run the DFS namenode
  datanode             run a DFS datanode
  dfsadmin             run a DFS admin client
  mradmin              run a Map-Reduce admin client
  fsck                 run a DFS filesystem checking utility
  fs                   run a generic filesystem user client
  balancer             run a cluster balancing utility
  oiv                  apply the offline fsimage viewer to an fsimage
  fetchdt              fetch a delegation token from the NameNode
  jobtracker           run the MapReduce job Tracker node
  pipes                run a Pipes job
  tasktracker          run a MapReduce task Tracker node
  historyserver        run job history servers as a standalone daemon
  job                  manipulate MapReduce jobs
  queue                get information regarding JobQueues
  version              print the version
  jar <jar>            run a jar file
  distcp <srcurl> <desturl> copy file or directories recursively
  distcp2 <srcurl> <desturl> DistCp version 2
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
                       Hadoop jar and the required libraries
  daemonlog            get/set the log level for each daemon
 or
  CLASSNAME            run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
คำสั่งที่มักใช้บ่อยก็คือ fs ซึ่งจะใช้สำหรับจัดการไฟล์บนระบบ HDFS และมีคำสั่งย่อยซึ่่งจะคล้ายๆกับคำสั่งของ Unix เช่น ls,  mv, cp, chmod, chown ฯลฯ เป็นต้น โดยเมื่อเราสั่ง hadoop fs โดยไม่ระบุค่าใดๆ จะแสดงข้อความแนะนำคำสั่งของ fs ดังนี้
 Usage: java FsShell
           [-ls <path>]
           [-lsr <path>]
           [-du <path>]
           [-dus <path>]
           [-count[-q] <path>]
           [-mv <src> <dst>]
           [-cp <src> <dst>]
           [-rm [-skipTrash] <path>]
           [-rmr [-skipTrash] <path>]
           [-expunge]
           [-put <localsrc> ... <dst>]
           [-copyFromLocal <localsrc> ... <dst>]
           [-moveFromLocal <localsrc> ... <dst>]
           [-get [-ignoreCrc] [-crc] <src> <localdst>]
           [-getmerge <src> <localdst> [addnl]]
           [-cat <src>]
           [-text <src>]
           [-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]
           [-moveToLocal [-crc] <src> <localdst>]
           [-mkdir <path>]
           [-setrep [-R] [-w] <rep> <path/file>]
           [-touchz <path>]
           [-test -[ezd] <path>]
           [-stat [format] <path>]
           [-tail [-f] <file>]
           [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
           [-chown [-R] [OWNER][:[GROUP]] PATH...]
           [-chgrp [-R] GROUP PATH...]
           [-help [cmd]]
Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|jobtracker:port>    specify a job tracker
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
เช่น หากเราต้องการแสดงรายชื่อไฟล์และโฟลเดอร์ต่างๆที่โฟลเดอร์ root เหมือนคำสั่ง ls / สามารถสั่งได้ดังนี้
sudo -u hdfs hadoop fs -l /
หากต้องการอัพโหลดไฟล์จากเครื่องเข้าสู่ระบบ สามารถใช้คำสั่ง -put เช่น
sudo -u hdfs hadoop fs -put local.txt /tmp/hdfs.txt
หมายถึงการอัพโหลดไฟล์ชื่อ local-test.txt จากเครื่องของเรา เข้าสู่ระบบที่โฟลเดอร์ /tmp โดยเปลี่ยนเป็นชื่อ hdfs.txt เป็นต้น
หากต้องการดาวโหลดไฟล์จากระบบมาที่เครื่อง สามารถใช้คำสั่ง -get เช่น
sudo -u hdfs hadoop fs -get /tmp/hdfs.txt hdfs2.txt
หมายถึงการดาวโหลดไฟล์ชื่อ hdfs.txt ที่โฟลเดอร์ /tmp จากระบบมาสู่เครื่อง โดยเปลี่ยนชื่อเป็น hdfs2.txt เป็นต้น
sudo -u hdfs hadoop fs -rm /tmp/hdfs.txt
หมายถึงการลบไฟล์ /tmp/hdfs.txt บนระบบ เป็นต้น ส่วนคำสั่งอื่นๆก็ใช้งานลักษณะเดียวกัน

วันเสาร์ที่ 8 กุมภาพันธ์ พ.ศ. 2557

HBase Installation

หลังจากที่ผมได้ทำการติดตั้ง 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 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 ประเภทคือ
  1. master (HMaster) เป็นบริการหลักของ HBase ซึ่งจะคอยตรวจสอบการทำงานของ regionserver โดยปกติแล้วจะทำงานอยู่บน NameNode ของ Hadoop
  2. regionserver (HRegionServer) เป็นบริการที่ทำหน้าที่ดูแลและจัดการข้อมูลภายใน region นั้นๆ โดยปกติแล้วจะทำงานอยู่บน DataNode ของ Hadoop
  3. 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 มีไฟล์ต่างๆดังนี้
  1. 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 อยู่แล้ว เราอาจจะไม่กำหนดก็ได้)
  2. 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 เป็นต้น

อ้างอิง

  1. สมชัย หลิมศิโรรัตน์, Hadoop 1.x Installation on Ubuntu
  2. The Apache Software Foundation, MapReduce Tutorial
  3. The Apache Software Foundation, HDFS Architecture Guide
  4. The Apache Software Foundation, HBase
  5. The Apache Software Foundation, The Apache HBase™ Reference Guide

วันพุธที่ 15 มกราคม พ.ศ. 2557

Hadoop 1.x Installation on Ubuntu

เมื่อประมาณเกือบๆ 1 ปีที่ผ่านมา ผมได้ติดตั้ง Hadoop รุ่น 1.1.2 บน Ubuntu 12.04 LTS เรียบร้อยไปแล้ว ซึ่งตอนนั้นมีปัญหาในการติดตั้งบางอย่าง แต่ผมก็ได้แก้ปัญหาไปแล้ว แต่มาเมื่อสัปดาห์ก่อน ผมต้องการติดตั้ง Hadoop บนอีกเครื่องหนึ่ง ทำให้ผมต้องมารื้อฟื้นความจำว่าปัญหาเก่าๆที่เคยแก้ไปนั้น ผมทำอย่างไร แต่นึกเท่าไหร่ก็นึกไม่ออกสักที ไฟล์เก่าๆที่เคยบันทึก หรือ เขียนสคริปท์ไว้ ตอนนี้ก็ไม่รู้เก็บไว้ที่ไหนแล้ว เนื่องจากผมมีการ backup ไฟล์ไว้หลายที่ กระจัดกระจายกันไป ไม่มีเวลามาจัดให้เข้าที่เข้าทางสักที (ดูเหมือนจะเป็นปัญหาคลาสสิกสำหรับคนไอทีเลยก็ว่าได้ ใครมีไอเดียดีๆที่ช่วยแก้ปัญหานี้ได้น่าจะทำโปรแกรมขายได้นะครับ) ครั้งนี้ผมจึงอาศัยการบันทึกไว้ที่บล็อกนี้แทน และหวังว่าจะเป็นประโยชน์สำหรับบางคนที่ติดปัญหาเดียวกัน

Hadoop Version

รุ่นของ Hadoop ที่เมื่อก่อนผมเลือกใช้ คือ 1.1.2 ตอนนั้น น่าจะเป็นรุ่นใหม่ที่ stable ที่สุดแล้ว แต่ปัจจุบันนี้ มีรุ่นที่เป็น stable อยู่ 2 รุ่น เนื่องจากมีการแตกรุ่นออกเป็น 1.x และ 2.x โดยรุ่น stable ของ 1.x คือ 1.2.1 ส่วนรุ่น stable ของ 2.x คือ 2.2.0 ครับ
  • 1.x stable -> 1.2.1 (1 Aug, 2013)
  • 2.x stable -> 2.2.0 (15 Oct, 2013)
ทีแรกผมจะทดลองติดตั้ง 2.x แต่ก็เกรงว่า โปรแกรมเก่าจะใช้งานไม่ได้ ประกอบกับ เมื่อเข้าไปดาวโหลดไฟล์แล้ว ปรากฏว่า ไม่มี Debian Package ให้ดาวโหลด ผิดกับ 1.2.1 ที่มี Package ทั้งแบบ Debian (.deb) RedHat(.rpm) และ Binary(.tar.gz) รวมทั้งมีทั้งสถาปัตยกรรมแบบ i386 และ x86_64 ให้ครบหมด ผมจึงตัดสินใจดาวโหลด 1.2.1 มาลง ซึ่งก็พบว่าปัญหาเดิมที่พบใน 1.1.2 ยังไม่ได้รับการแก้ไข

Why Debian Package?

ระบบปฏิบัติการ Ubuntu นั้น มีพื้นฐานมาจาก Debian ดังนั้น Package สำหรับติดตั้งโปรแกรมจึงเป็นแบบ Debian ซึ่งสำหรับใครที่ติดตั้งด้วย Binary และทำตามคำแนะนำในเว็บไซต์ต่างๆ ก็ทำได้ครับ แต่จะไม่เหมือนกับ Debian Package ที่มีการวางระบบไฟล์ ไม่ว่าจะเป็น Configuration Library Script และอื่นๆไว้ในแบบของ Debian มีการกำหนดสิทธิ์ในการเข้าถึงไฟล์ต่างเหล่านี้อย่างเป็นระบบและเพื่อความปลอดภัยสูง ไม่ให้เกิดช่องโหว่ได้ ดังนั้น เราจึงควรทำตามที่กำหนดไว้จะดีที่สุด แต่สำหรับการทดลอง ทดสอบ หรือใช้พัฒนาโปรแกรมโดยเราใช้เองคนเดียว การติดตั้งแบบ Binary ก็จะสะดวกกว่ามากครับ เพราะทุกอย่างจะรวมอยู่ในโฟลเดอร์เดียวหมด แตกไฟล์มาก็แทบจะใช้ได้เลย

Users/Groups are not created during installation

เมื่อนำไฟล์ .deb มาติดตั้ง โดยปกติเมื่อ double-click ที่ไฟล์ โปรแกรม Package Installer จะทำงาน เปิดหน้าต่างมาให้เราติดตั้ง ซึ่งเป็น GUI ทำให้สะดวกมาก แต่จะทำให้เราไม่ทันได้สังเกตข้อความแจ้งเตือนต่างๆ จึงเข้าใจว่าติดตั้งเสร็จเรียบร้อยแล้ว แต่พอไปใช้งานก็จะมีปัญหา ซึ่งถ้าเราติดตั้งด้วยคำสั่ง
sudo -E dpkg -i hadoop_1.2.1-1_x86_64.deb

หมายเหตุ:

ที่กำหนด option -E ไว้ เพื่อให้มีการนำค่า JAVA_HOME ที่กำหนดไว้มาใช้ตอนติดตั้ง

ปัญหาแรกที่เราจะพบเมื่อติดตั้ง คือข้อความ
Selecting previously unselected package hadoop.
(Reading database ... 336159 files and directories currently installed.)
Unpacking hadoop (from .../hadoop_1.2.1-1_x86_64.deb) ...
groupadd: GID '123' already exists
Setting up hadoop (1.2.1) ...
chown: invalid group: `root:hadoop'
ซึ่งปกติแล้ว จะเป็นขั้นตอนการสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs โดยสามารถตรวจสอบได้ ด้วยการเปิดดูไฟล์ preinst ซึ่งเป็นสคริปท์ที่จะถูกรันหลังจากที่มีการแตกไฟล์(Unpacking)เรียบร้อยแล้ว ซึ่งสคริปท์นี้เขียนไว้ตายตัวคือ
getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/groupadd -g 123 -r hadoop
หมายความว่าให้สร้าง group ชื่อ hadoop โดยกำหนดให้มี GID เป็น 123 ซึ่งถ้าหากในเครื่องของเรามี GID 123 อยู่แล้ว ก็จะเกิด error GID '123' already exists นั่นเอง ข้อผิดพลาดนี้ได้มีการรายงานไว้แล้วตั้งแต่รุ่น 1.0.3 แต่ยังไม่ได้รับการแก้ไข สาเหตุของปัญหานี้เกิดจากการใช้คำสั่ง groupadd ซึ่งปกติแล้ว บนระบบ Debian จะมีอีกคำสั่งหนึ่งคือ addgroup ซึ่งทำงานคล้ายกัน groupadd จะเป็นคำสั่งระดับล่าง ส่วน addgroup จะเป็นคำสั่งระดับบน ซึ่งถ้าเราไม่กำหนด GID คำสั่ง addgroup จะหาค่าที่เหมาะสมตามระบบของ Debian มาให้แทน ดังนั้น คำสั่งนี้ควรจะแก้เป็น
getent group hadoop 2>/dev/null >/dev/null || /usr/sbin/addgroup --system hadoop
แต่เนื่องจากเราได้ติดตั้งไฟล์ไปแล้ว จึงแก้ไขด้วยการสั่งเองภายหลังจากที่แตกไฟล์เรียบร้อยแล้ว ดังนี้
/usr/sbin/addgroup --system hadoop
/usr/sbin/adduser --shell /bin/bash --no-create-home --system --ingroup hadoop --home /var/lib/hadoop/mapred mapred
/usr/sbin/adduser --shell /bin/bash --no-create-home --system --ingroup hadoop --home /var/lib/hadoop/hdfs hdfs
ซึ่งจะสร้าง group ชื่อ hadoop และ user ชื่อ mapred และ hdfs ขึ้นมา

Configuration Files

ก่อนที่เราจะเริ่ม start Hadoop จะมี config ไฟล์ที่ต้องแก้ไขต่างๆ ซึ่งตามคำแนะนำใน Document ของ Hadoop 1.2.1 จะระบุชื่อไฟล์ในโฟลเดอร์ conf แต่ Debian Package จะย้ายไปอยู่ที่ /etc/hadoop โดยมีไฟล์ต่างๆที่ต้องแก้ไขดังนี้
  1. hadoop-env.sh
    • กำหนดค่า JAVA_HOME ใหม่ให้ถูกต้อง สำหรับค่า default ที่กำหนดไว้คือ /usr/lib/jvm/java-6-sun แต่เนื่องจากบน Ubuntu จะใช้ OpenJDK เป็นหลัก ผมจึงเปลี่ยนค่าให้เป็น /usr/lib/jvm/default-java ซึ่งจะใช้ default JDK ที่ติดตั้งไว้ โดยปกติแล้ว Ubuntu 12.04 LTS จะใช้ OpenJDK 6 ซึ่งน่าจะเข้ากันได้ดี แต่เนื่องจากผมมีโปรแกรมบางตัวที่ใช้ Java 7 จึงเปลี่ยนมาใช้ OpenJDK 7 (หวังว่าจะไม่มีปัญหา)
    • หากต้องการเปลี่ยนค่า environment สามารถใช้คำสั่ง update-hadoop-env.sh ได้ โดยสั่ง
    • sudo -E bash /usr/sbin/update-hadoop-env.sh --prefix=/usr --bin-dir=/usr/bin --sbin-dir=/usr/sbin --conf-dir=/etc/hadoop --log-dir=/var/log/hadoop --pid-dir=/var/run/hadoop
  2. master/slave
    • master ไฟล์ จะเก็บรายชื่อเครื่องที่ทำหน้าที่เป็น NameNode ซึ่งจะเป็นเครื่องแม่ และสามารถเป็น JobTracker TaskTracker และ DataNode ได้ด้วย
    • slave ไฟล์ จะเก็บรายชื่อเครื่องที่ทำหน้าที่เป็น DataNode และเป็น TaskTracker ได้ด้วย
    • ถ้าติดตั้งในโหมด Single-Node ทั้งสองไฟล์จะมีค่าเป็น localhost
  3. *-site.xml
    • core-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ NameNode เช่น fs.default.name เป็นค่า URL ของเครื่อง NameNode ที่ Hadoop ในเครื่องนั้นๆจะติดต่อด้วย โดยค่า default ใน Debian Package กำหนดไว้เป็น hdfs://localhost:8020 แต่เว็บอื่นๆมักกำหนดค่าตัวอย่างไว้ที่พอร์ต 9000 หรือ 9001 ซึ่งจะต้องระวังการกำหนดค่าตรงนี้ให้ดี เพราะหากชนกับบริการอื่นๆที่มีอยู่ในเครื่อง NameNode ก็จะไม่สามารถ start ได้ ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ core-default.xml
    • hdfs-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ HDFS ว่าจะมีการจัดแบ่งข้อมูลของระบบอย่างไร โดยเฉพาะค่า dfs.replication ซึ่งเป็นจำนวนการทำซ้ำข้อมูล จำนวนนี้ไม่ควรเกินจำนวน DataNode ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ hdfs-default.xml
    • mapred-site.xml เป็นไฟล์ที่เก็บค่าเกี่ยวกับ JobTracker ค่า default ต่างๆของไฟล์นี้ สามารถดูได้จากไฟล์ mapred-default.xml

Operation Mode

ระบบ Hadoop จะประกอบไปด้วยบริการ 4 ประเภทคือ
  1. NameNode เป็นบริการหลัก ทำหน้าที่ค้นหาและจัดการบริการอื่นๆในระบบ
  2. JobTracker ทำหน้าที่จัดคิวการทำงาน
  3. TaskTracker ทำหน้าที่ประมวลผล Map-Reduce หรืองานอื่นๆ
  4. DataNode ทำหน้าที่จัดการข้อมูลในระบบ HDFS (Hadoop Distributed File System)
ซึ่งบริการทั้ง 4 ประเภท สามารถทำงานอยู่บนเครื่องๆเดียวได้ (Single-Node โหมด) หรือจะแบ่งเป็นเครื่อง 2 กลุ่ม คือ master ซึ่งสามารถมีบริการทั้ง 4 ประเภทในเครื่องเดียว หรือ slave ซึ่งจะมีบริการเฉพาะ TaskTracker และ DataNode เท่านั้น เพื่อแบ่งหรือกระจายการประมวลผลและข้อมูลของระบบออกไปยังเครื่องลูกจำนวนมากๆ โดยการติดตั้งระบบ เราสามารถเลือกติดตั้งให้ทำงานได้ 3 โหมดคือ
  1. Local (Standalone)
    • การทำงานจะอยู่บนเครื่องเดียว และไม่เป็นเครือข่าย
    • โหมดนี้เป็น default ของโปรแกรม หากยังไม่มีการตั้งค่าใดๆ
    • เหมาะกับการทดสอบและ debug มากกว่า
  2. Pseudo-Distributed (Single-Node)
    • การทำงานจะอยู่บนเครื่องเดียว แต่เป็นเครือข่าย
    • สามารถตั้งค่าต่างๆได้ง่ายด้วยโปรแกรม hadoop-setup-single-node.sh
    • เหมาะกับการใช้งานเบื้องต้น และพร้อมที่จะขยายไปเป็น Fully-Distributed โหมด
  3. Fully-Distributed (Multi-Node)
    • การทำงานจะเป็นเครือข่ายหลายเครื่องสมบูรณ์แบบ
    • สามารถปรับแก้ไฟล์บางไฟล์จาก Pseudo-Distributed โหมด กลายเป็น Fully-Distributed โหมดได้ทันที
    • เหมาะกับการใช้งานเต็มรูปแบบ รองรับภาระงานเพิ่มขึ้นโดยเพิ่มจำนวนเครื่องได้

Setup Single-Node Mode

หลังจากที่เราติดตั้ง Debian Package เรียบร้อยแล้ว ไฟล์ hadoop-env.sh จะถูกตั้งค่า environment ไว้เรียบร้อยแล้ว แต่หากค่าต่างๆยังไม่ถูกต้อง เช่นค่า JAVA_HOME ควรแก้ไขให้ถูกต้องเสียก่อนนะครับ จากนั้นเราจะต้องตั้งค่าไฟล์ *-site.xml ให้ครบถ้วน ก่อน ซึ่งขึ้นอยู่กับโหมดการใช้งานที่เราต้องการ โดยปกติแล้วถ้าเป็น Standalone โหมด ก็ไม่ต้องแก้ไขอะไร แต่ส่วนใหญ่แล้ว เราจะไม่ใช้โหมดนี้ เราจะใช้โหมด Single-Node มากกว่า ซึ่งค่าต่างๆที่ต้องกำหนด สามารถศึกษาได้จาก document ซึ่งผมจะไม่ขอกล่าวในที่นี้นะครับ แต่เราก็มีวิธีที่ง่ายกว่านั้น เนื่องจากมีสคริปท์ช่วยอำนวยความสะดวกให้แล้วคือ hadoop-setup-single-node.sh โดยมีลำดับของการทำงานคือ
  1. ตั้งค่า config ต่างๆ
  2. ทำการ Format NameNode (เหมือนเรา Format ฮาร์ดดิสก์นะครับ)
  3. จัดเตรียมโครงสร้างของไฟล์ในระบบ HDFS
  4. start บริการต่างๆของ Hadoop ซึ่งก็คือ NameNode DataNode JobTracker และ TaskTracker
  5. ตั้งค่าสำหรับให้บริการต่างๆ start อัตโนมัติเมื่อบู๊ตเครื่อง
เมื่อรัน hadoop-setup-single-node.sh แล้วตอบ y ทั้งหมด คือเลือกใช้ค่า default ทั้งหมด ผลปรากฏว่า มีปัญหาเกี่ยวกับ permission ของโฟลเดอร์ /var/hadoop/log/root เกิดขึ้นตอนรัน JobTracker และ TaskTracker ซึ่งมีข้อความตัวอย่างดังนี้

* Starting Apache Hadoop Job Tracker server hadoop-jobtracker                                      chown: changing ownership of `/var/log/hadoop/root': Operation not permitted
starting jobtracker, logging to /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out
/usr/sbin/hadoop-daemon.sh: line 137: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
head: cannot open `/var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out' for reading: No such file or directory
/usr/sbin/hadoop-daemon.sh: line 147: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
/usr/sbin/hadoop-daemon.sh: line 148: /var/log/hadoop/root/hadoop-root-jobtracker-SLOffice.out: Permission denied
                                                                                             [fail]
สาเหตุ เกิดจาก JobTracker และ TaskTracker จะถูกรันโดย user ชื่อ mapred แต่โฟลเดอร์ /var/log/hadoop/root ถูกสร้างขึ้น เพราะเราสั่งรัน hadoop-setup-single-node.sh ด้วย root ซึ่งตอนรัน NameNode และ DataNode จะรันโดย user ชื่อ hdfs ทำให้มีการเปลี่ยนสิทธิ์ของ /var/log/hadoop/root ให้เป็นของ hdfs:hadoop ด้วย chmod มีค่าเป็น 755 พอ mapred จะมาเปลี่ยน จึงเปลี่ยนไม่ได้ ผมจึงแก้ไขด้วย chmod ให้เป็น 775 แทน

Start/Stop Service

การสั่ง start/stop บริการต่างๆของ Hadoop ความจริงแล้ว จะมีสคริปท์ให้เรียกใช้ โดยเฉพาะคำสั่ง start-all.sh และ stop-all.sh ซึ่งจะไปเรียก start-dfs.sh/start-mapred.sh และ stop-dfs.sh/stop-mapred.sh อีกทีหนึ่ง โดย dfs นั้นจะมีบริการ NameNode และ DataNode อยู่ ส่วน mapred จะมี JobTracker และ TaskTracker ครับ ดังนั้น เราจึง start ได้ด้วยคำสั่ง
sudo start-all.sh
และ stop ด้วยคำสั่ง
sudo stop-all.sh
แต่ถ้าหากเรากำหนดให้ hadoop-setup-single-node.sh ติดตั้ง service ให้ start/stop Hadoop อัตโนมัติตอน boot/shutdown เครื่อง เราก็สามารถสั่ง start ได้ด้วยคำสั่ง
sudo service hadoop-xxx start
และ stop ได้ด้วยคำสั่ง
sudo service hadoop-xxx stop
โดยมีสคริปท์สำหรับบริการต่างๆอยู่ที่ /etc/init.d/hadoop-xxx คือ
  • hadoop-namenode
  • hadoop-datanode
  • hadoop-jobtracker
  • hadoop-tasktracker
  • hadoop-secondarynamenode (ปกติจะไม่ start อัตโนมัติ)
และคำสั่งทั้งหมดนั้น จริงๆแล้วจะไปเรียกคำสั่ง hadoop-daemon.sh อีกทีหนึ่ง ซึ่งสามารถเรียกใช้ได้เช่นกัน มีรูปแบบคือ
hadoop-daemon.sh [start/stop] [ชื่อบริการ]
เช่น
hadoop-daemon.sh start namenode

หมายเหตุ:

หาก start ด้วยวิธีใด ให้ stop ด้วยวิธีที่คู่กัน

Startup Checking

จากการตรวจสอบการทำงานด้วยคำสั่ง jps จะพบว่ามีเพียง NameNode DataNode และ TaskTracker รันอยู่ แต่ JobTracker ไม่มี ผมจึงเข้าไปตรวจสอบ log ไฟล์ของ JobTracker ที่โฟลเดอร์ /var/log/hadoop พบข้อความผิดพลาดคือ
WARN org.apache.hadoop.mapred.JobTracker: Failed to operate on mapred.system.dir (hdfs://localhost:8020/mapred/mapredsystem) because of permissions.
WARN org.apache.hadoop.mapred.JobTracker: Manually delete the mapred.system.dir (hdfs://localhost:8020/mapred/mapredsystem) and then start the JobTracker.
WARN org.apache.hadoop.mapred.JobTracker: Bailing out ...
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=WRITE, inode="":hdfs:supergroup:rwxr-xr-x
สาเหตุก็คือ เนื่องจากขั้นตอนที่ 3 ของ hadoop-setup-single-node.sh นั้น จะสร้างโฟลเดอร์ /tmp และ /usr ไว้ใน HDFS เท่านั้น จะไม่มีโฟลเดอร์ /mapred แต่เนื่องจากใน mapred-site.xml ได้กำหนดค่า mapred.system.dir ไว้ที่ /mapred/mapredsystem จึงทำให้ JobTracker พยายามที่จะเขียนข้อมูลไปที่นั่น แต่ก็ทำไม่ได้ และจบการทำงานไป วิธีการแก้ไขที่มีคนแนะนำไว้ก็คือ ให้ตั้งค่า mapred.system.dir ไปไว้ใน /tmp แทน โดยให้อิงกับค่า hadoop.tmp.dir ซึ่งจะต้องแก้ไขในไฟล์ mapred-site.xml ดังนี้
<property>
<name>mapred.system.dir</name>
<value>${hadoop.tmp.dir}/mapred/mapredsystem</value>
<final>true</final>
</property>
เมื่อแก้ไขเสร็จแล้ว สั่ง start JobTracker ใหม่ ก็จะพบปัญหาทำนองเดียวกันกับค่า mapred.job.tracker.history.completed.location จึงแก้ไขให้เป็น
<property>
<name>mapred.job.tracker.history.completed.location</name>
<value>${hadoop.tmp.dir}/mapred/history/done</value>
</property>

Web Interface

เมื่อแก้ไขข้อผิดพลาดต่างๆ และ start บริการต่างๆได้หมดแล้ว ก็สามารถเปิดดู NameNode ผ่านเว็บได้ที่ URL http://localhost:50070 ส่วน JobTracker เปิดดูได้ที่ http://localhost:50030

อ้างอิง