ขั้นตอนการติดตั้ง Hadoop Cluster อย่างง่าย

Hadoop เป็น Framework สำหรับสร้างการประมวลผลแบบกระจาย (Distributed Processing) กับข้อมูลขนาดใหญ่ (Large Data Sets) สามารถเริ่มต้นจากทดสอบบนเครื่องคอมพิวเตอร์เครื่องเดียว ไปจนเป็นระบบ Cluster ได้[1] อธิบายง่ายๆได้ว่า Hadoop ประกอบด้วย ส่วนประมวลผลแบบกระจายเรียกว่า YARN (หรือ MapReduce) และ ส่วนเก็บข้อมูลแบบกระจายเรียกว่า HDFS (Hadoop Distributed File System) สำหรับการสร้าง Hadoop Cluster ในบทความนี้ใช้ Hadoop version 2.7.2 บน Ubuntu 16.04 โดย Cluster จะประกอบด้วย 1 Master และ N Slaves โดยจะใช้วิธีการสร้างเครื่องต้นฉบับ แล้ว Clone ไปเป็น Master/Slave ต่อไป 1.ขั้นตอนการสร้างตันฉบับสำหรับการ Clone 1.1. ติดตั้ง Ubuntu 16.04 ตามปรกติ สร้าง User คนแรกชื่อ mama 1.2. สร้างกลุ่มชื่อ hadoop sudo addgroup hadoop 1.3. สร้างผู้ใช้ชื่อ hduser อยู่ในกลุ่ม hadoop sudo adduser hduser –ingroup hadoop 1.4. ติดตั้ง Java sudo apt-get install default-jre openjdk-8-jdk-headless 1.5. ติดตั้ง hadoop wget http://www-us.apache.org/dist/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz tar -zxvf hadoop-2.7.2.tar.gz sudo mv hadoop-2.7.2 /usr/local/hadoop sudo mkdir /usr/local/hadoop/etc/hadoop/tmp sudo chown -R hduser.hadoop /usr/local/hadoop 1.6. เพิ่มตัวแปรใน /etc/environment HADOOP_HOME=/usr/local/hadoop HADOOP_PREFIX=/usr/local/hadoop JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 1.7. แก้ไขค่าใน .bashrc su hduser; cd ~ แล้วแก้ไข .bashrc โดยเพิ่มบรรทัดต่อไปนี้ ท้ายไฟล์ export HADOOP_HOME=/usr/local/hadoop export HADOOP_PREFIX=/usr/local/hadoop export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 2.ขั้นตอนการสร้าง Master (namenode) 2.1. Clone เครื่องต้นฉบับมา แล้วแก้ไข ip address, /etc/hosts, /etc/hostname ให้เหมาะสม โดยเครื่องนี้ต้อง Static IP เช่น 192.168.1.101 2.2. แก้ไข /usr/local/hadoop/etc/hadoop/core-site.xml ดังนี้ <configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.107.116:9000</value> </property> </configuration> 2.3. แก้ไข /usr/local/hadoop/etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property> </configuration> 2.4. แก้ไข /usr/local/hadoop/etc/hadoop/slaves โดยใส่ IP ของเครื่องที่จะเป็น Slave หรือ datanode ลงไป เช่น 192.168.1.102 ถึง 192.168.1.111 เป็นต้น 192.168.1.102 192.168.1.103 192.168.1.104 192.168.1.105 192.168.1.106 192.168.1.107 192.168.1.108 192.168.1.109 192.168.1.110 192.168.1.111  

Read More »

การตั้งค่า MaxRequestWorkers บน Apache ให้เหมาะสมกับจำนวนผู้ใช้

ปัญหาของ PSU Webmail ในช่วง 9-15 สิงหาคม 2559 ที่ผ่านมา คือ เมื่อเริ่มเข้าสู่เวลาราชการ ในวันทำการ พบว่า มีการตอบสนองที่ช้า บางครั้งต้องรอถึง 15-20 วินาที หรือ ผู้ใช้บางท่านแจ้งว่า Timeout ไปเลย หรือไม่ก็ใช้งานไปสักพัก ถูกดีดกลับมาหน้า Login ใหม่ แต่เมื่อพ้นเวลาราชการ พบว่าการตอบสนองก็เร็วขึ้นดังเดิม รวมถึงในช่วงวันหยุดก็เร็วอย่างที่ควรเป็น ขอบคุณทาง NetAdmin ที่ทำระบบตรวจสอบไว้ที่หน้า Data Center เพื่อตรวจจับความเร็วในการตอบสนองบริการ PSU Webmail ด้วย SmokePing ผลที่ได้เป็นดังภาพ จะเห็นว่า มีความหน่วงในการตอบสนอง เฉพาะในวันเวลาราชการเท่านั้น … ทำไม ??? ทำการตรวจสอบด้วยคำสั่ง ps aux |grep apache| wc -l เพื่อดูว่า มีจำนวน Apache อยู่กี่ Process พบว่า ในช่วงเวลาที่ระบบหน่วง มี Process เกือบคงที่ที่ 150 แต่ในช่วงที่ระบบทำงานได้เร็ว มีจำนวนประมาณ 50 process จากการศึกษา พบว่า Apache2 ที่ใช้ MPM Prefork นั้น จะจำกัดค่า MaxRequestWorkers ไว้ โดยหากไม่กำหนดค่าใดๆจะตั้งไว้ที่ 256 แต่เมื่อตรวจสอบในไฟล์ /etc/apache2/mods-enabled/mpm_prefork.conf พบว่า <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule> ทำให้เพดานของจำนวน Process ไปจำกัดที่ 150 ดังที่ตรวจสอบเบื้องต้น เมื่อมีผู้ใช้มากขึ้นกว่าเดิม จึงทำให้ Process ไม่เพียงพอต่อความต้องการ เป็นผลให้เกิดการหน่วงขึ้น จึงทำการแก้ไข MaxRequestWorkers เป็น 256 แล้ว Restart Apache ผลทำให้ จำนวน Apache Process ขึ้นไปถึง 200 Process และการตอบสนองเร็วขึ้นตามที่ควรเป็นดังภาพ (หลังเวลา 14:45) ทั้งนี้ การกำหนดจำนวน MaxRequestWorkers นั้น ต้องสัมพันธ์กับ RAM ของ Server ด้วย โดยมีสูตรคร่าวๆ คือ จำนวน RAM ในหน่วย MB หารด้วยขนาดของ Apache Process โดยเฉลี่ย เช่น มี RAM 4GB = 4 x 1024 = 4096 ขนาดเฉลี่ย Apache Process = 20 ดังนั้น MaxRequestWorkers = 4096/20 = 204 แต่จริงๆแล้ว ควรเผื่อ Memory ไว้ให้ OS และอื่นๆด้วย (อาจจะไม่เต็ม 4096) หากขยับค่า MaxRequestWorkers แล้วยังพบว่า จำนวน Process ยังขึ้นไปเต็มเพดานอยู่ ควรพิจารณาเพิ่ม Memory ด้วย ประมาณนี้ครับ UPDATE: ผลการปรับแก้ไข ทำให้ เวลาในการตอบสนอง จากที่หน่วง 10 วินาที เหลือ เพียง 50 มิลลิวินาที ดังภาพ  

Read More »

การเชื่อมต่อ Thunderbird กับ Google Mail (ทั้ง Gmail และ Google Apps)

ในอดีต Thunderbird และ Mail Client อื่นๆสามารถติดต่อกับ Google Mail ได้โดยตั้งค่า Mail Server ให้ถูกต้อง และ username/password ก็สามารถใช้งานได้ แต่ในปัจจุบัน Google หันไปใช้ระบบ OAuth 2.0 ซึ่งการ Authentication หรือการใส่ username/password ต้องทำที่ Google เท่านั้น รวมถึงการทำ 2-Step Verification ด้วย (การใส่ One-Time Password นอกเหนือจาก username/password เป็นต้น) ทำให้ Thunderbird และ Mail Client ที่ยังไม่รองรับ OAuth 2.0 ไม่สามารถใช้งานได้ แต่ทาง Google Mail ยังเปิดให้สามารถใช้งานได้ โดยแบ่งเป็น 2 กรณีคือ ใช้หรือไม่ใช้ 2-Step Verification โดยตรวจสอบได้จาก 0. วิธีตรวจสอบว่าใช้งาน 2-Step Verification หรือไม่ โดยการไปที่ https://myaccount.google.com/security หากไม่เปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้ หากเปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้ 1. ผู้ใช้ที่ไม่ได้เปิดใช้งาน 2-Step Verification ให้ไปที่ https://myaccount.google.com/security#connectedapps ภายใต้หัวข้อ Allow less secure apps ให้เปิดใช้งาน ดังภาพ 2. ผู้ใช้ที่เปิดใช้งาน 2-Step Verification ให้ไปที่ https://security.google.com/settings/security/apppasswords แล้วเลือก Mail และ Windows Computer แล้วคลิก Generate ดังภาพ จะได้ Password ที่ใช้ครั้งเดียวทิ้ง (ไม่ต้องไปจำ) ดังภาพ หากวันหลังต้องการเลิกใช้ ก็กดปุ่ม Revoke ภายหลังได้ จากนั้น เปิดให้ Google Account ใช้งาน IMAP ได้ โดยไปที่ https://mail.google.com/mail/u/0/#settings/fwdandpop แล้วคลิก Enable IMAP ดังภาพ แล้วคลิก Save Change ด้านล่าง สุดท้าย ที่ Thunderbird ให้ตั้งค่า Password: สำหรับคนที่ไม่ใช้ 2-Step Verification ให้ใส่ Password ของ Google Account เดิมลงไป ส่วนคนที่ใช้ 2-Step Verification ให้เอา Password ที่ได้มาใหม่ใส่ลงไปแทน Incoming IMAP เป็น imap.gmail.com และ SSL เป็น SSL/TLS Outgoing SMTP เป็น smtp.gmail.com และ SSL เป็น SSL/TLS อย่าลืม ใส่ username ให้มี @gmail.com หรือ @psu.ac.th ในกรณีใช้ PSU GAFE ด้วย แล้วคลิกปุ่ม Done ดังภาพ เท่านี้ก็สามารถใช้งาน Google Mail จาก Thunderbird ได้แล้ว

Read More »

เทคนิคการวัดความเร็วในการตอบอีเมลลูกค้า

ถ้ามี KPI ที่ต้องทำให้สำเร็จคือ “ร้อยละของปัญหาที่ตอบกลับลูกค้าภายใน 2 วันทำการ” แล้ว … ช่องทางที่รับปัญหาจากลูกค้าคือ ทางอีเมล (ในที่นี้เป็นบริการอีเมลบนระบบของ Google Mail หรือ Gmail) โดยการตอบกลับ คือ การ Reply กลับไปหาลูกค้า เวลาที่นับคือ นับตั้งแต่เวลาที่อีเมลเข้ามาถึง จนกระทั่งมีการตอบกลับไปหาลูกค้าทางอีเมลฉบับแรก สำหรับคนที่ใช้ Google Mail หรือ Gmail อยู่ สามารถใช้ Google Sheets ทำรายงานได้ ตามขั้นตอนต่อไปนี้ 1. ไปที่ drive.google.com (ให้ Login ด้วย Account ที่ต้องการด้วย) 2. สร้าง Google Sheets แล้วตั้งชื่อตามต้องการ เช่น Report 3. ไปที่เมนู Tools > Script Editor 4. ตั้งชื่อ Project ว่า report แล้ววางโค๊ดต่อไปนี้ลงไป   function reportResponseTime() { // ถ้าจะทำรายงานทั้ง Inbox ให้ uncomment บรรทัดต่อไปแทน //var threads = GmailApp.getInboxThreads(); // ถ้าจะทำรายงานเฉพาะ Lable ที่เตรียมไว้ ในที่นี้ใช้ Label “support-psuemail” var threads = GmailApp.search(‘label:support-psuemail ‘); for (var i = 0; i < threads.length; i++) { // วนลูปแต่ละ Thread if (threads[i].getMessageCount() > 1) { // สนใจเฉพาะ Thread ที่มีการตอบกลับเท่านั้น var messages = threads[i].getMessages(); // Subject ของอีเมล var d1= messages[0].getDate().getTime(); // เวลาที่อีเมลเข้ามา var d2= messages[1].getDate().getTime(); // เวลาที่ตอบกลับฉบับแรก var diff = (d2-d1)/(1000*60*60); // ระยะเวลาหน่วยเป็น ชั่วโมง // เขียนต่อท้าย Sheet ที่กำลังใช้งาน SpreadsheetApp.getActiveSheet().appendRow([messages[0].getSubject(), messages[0].getDate(), messages[1].getDate(), diff]) } } }     5. คลิก Run > reportResponseTime (หากมีหน้าจอ Consense ต่างๆขึ้นมาให้ Allow ไป) 6. ผลจะปรากฏใน Sheet ที่เปิดไว้ 7. จากนั้นสามารถเอาผลไปคำนวนต่อ เช่น ร้อยละของอีเมลที่ตอบสนองภายใน 48 ชั่วโมงหรือ 2 วัน เป็นต้น และสามารถตอบคำถามได้ว่า ทำไมบางฉบับใช้เวลาเกิน 48 ชั่วโมง (อาจจะเป็นเพราะติดเสาร์อาทิตย์เป็นต้น) *** กรุณาอ้างอิงด้วยนะครับ หากนำไปเผยแพร่ต่อ ***

Read More »

วิธีตรวจสอบเว็บไซต์ที่โดน Hack #18

ได้รับแจ้งจาก ThaiCERT ว่ามีเว็บไซต์ภายในโดเมนของมหาวิทยาลัย เผยแพร่ Code อันตราย ดังต่อไปนี้ จึงเข้าทำการตรวจสอบในเครื่องเว็บเซิร์ฟเวอร์ดังกล่าว พบการวางไฟล์ Backdoor ไว้ดังที่อธิบายใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17 แล้ว แต่ที่เห็นผิดปรกติ ก็เป็นใน access.log ของ Apache ซึ่งพบว่า มีการเรียกใช้ xmlrpc.php เป็นจำนวนมาก ดังภาพ จากการตรวจสอบ พบว่า xmlrpc.php เป็นช่องทางให้สามารถเรียกใช้ Function ต่างๆผ่านทาง HTTP และเป็นช่องทางให้ App ต่างๆสามารถติดต่อกับ WordPress ได้ แต่ก็เป็นช่องทางให้เกิดการเดารหัสผ่านจำนวนมากได้เช่นกัน (Brute Force Attack) โดยสามารถทดลอง ส่ง XML ที่มีโครงสร้าตามที่ API กำหนด เช่น wp.getUsersBlogs [1][2][3] สามารถดูจำนวน Blog ที่ User คนนั้นๆเขียนขึ้นมา แต่ ต้องระบุ username/password ซึ่งตรงนี้จะเป็นส่วนที่ทำให้เกิดการ Brute Force ได้ ด้วยคำสั่งต่อไปนี้ เป็นการเดารหัสผ่านไปยัง http://localhost/blog/xmlrpc.php echo “<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value> <string>admin</string></value></param>  <param><value><string>password</string></value></param></params></methodCall>” | POST http://localhost/blog/xmlrpc.php หากสำเร็จ จะได้คำตอบมาอย่างนี้ หากเป็น WordPress รุ่นต่ำกว่า 4.0 เปิดให้ใช้ system.multicall ซึ่งทำให้สามารถเดารหัสผ่านจำนวนมาก ใน 1 Request ทำให้ระบบตรวจจับได้ยาก ดังนั้น หากไม่จำเป็นต้องใช้ xmlrpc.php ก็สมควรปิดการใช้งานที่ระดับ Apache โดยสร้างไฟล์ /etc/apache2/conf-enabled/xmlrpc.conf มีข้อมูลเป็น <FileMatch “xmlrpc\.php$”> Order Deny,Allow Deny from All </FileMatch> จากนั้น Restart Apache ก็สามารถปิดการทำงานได้ Reference [1] http://www.hackingsec.in/2014/08/wordpress-xml-rpc-brute-force-attack.html# [2] http://blog.dewhurstsecurity.com/2012/12/11/introduction-to-the-wordpress-xml-rpc-api.html [3] https://codex.wordpress.org/XML-RPC_WordPress_API

Read More »