GCP #01 วิธีการสร้าง Virtual Machine บน Google Cloud Platform

ขั้นตอน มี Google Account ไปที่ https://console.cloud.google.com/start สำหรับคนที่ใช้ครั้งแรก ควรจะใช้สิทธิ์ Free Trial 300 USD / 12 Month ในการใช้งาน จะต้องมี Billing Account โดยต้องกรอกข้อมูล บัตร Credit/Debit ซึ่งต้องเป็น VISA/MasterCard เท่านั้น และต้องไม่ใช่ Prepaid ด้วย https://cloud.google.com/billing/docs/how-to/payment-methods#add_a_payment_method เมื่อเสร็จแล้วจะได้ Credit อย่างนี้ ต่อไป สร้าง Virtual Machine กัน ไปที่ เมนู > Cloud Launcher จะเห็นได้ว่า ตอนนี้ระบบจะสร้าง “My First Project” ไว้ให้ ซึ่งเราสามารถ สร้าง Project ใหม่ก็ได้ แต่ตอนนี้ใช้อย่างนี้ไปก่อน ต่อไป จะลองสร้าง Ubuntu Server ขึ้นมาใช้งาน ในที่นี้จะสร้าง Ubuntu 14.04 พิมพ์ Ubuntu ในช่องค้นหา แล้ว เลือก Ubuntu 14.04 จากนั้น คลิก Launch on Compute Engine ตั้งชื่อตามต้องการ (ถ้าต้องการ) สามารถเลือก Zone และ Machine Type ได้ตามความเหมาะสม ซึ่งจะมีราคาแตกต่างกัน ค่าเริ่มต้น Machine Type: n1-standard-1 จะให้ 1 vCPU, 3.75 GB RAM และ 10 GB standard persistent disk หากต้องการ Disk เพิ่ม สามารถคลิก Change เพื่อเพิ่มได้​ (standard persistent disk จะราคาถูกกว่า ssd มาก) ต่อไป กำหนดเรื่องเของ Firewall ถ้าให้บริการ HTTP/HTTPS ก็คลิกเลือกได้เลย ในกรณีที่ต้องการกำหนดค่าอื่นๆ เช่น Disk, Network, SSH Key ให้คลิก “Management, disks, networking, SSH keys” เสร็จแล้วกดปุ่ม Create รอสักครู่ ก็จะได้ VM มาใช้งานแล้ว ในที่นี้ จะได้ External IP ซึ่งใช้ในการติดต่อจาก Internet มา แต่หากมีการ Restart/Stop IP address นี้ก็จะเปลี่ยนไป (การ Fix มีค่าใช้จ่ายนิดหน่อย) และ การติดต่อไปยัง VM ก็สามารถทำได้ โดยการคลิก SSH ซึ่งสามารถเข้าถึงได้จาก Console นี้ หากต้องการใช้งานจาก Client อื่นก็ทำได้ แต่ต้องกำหนด SSH Key กันนิดหน่อย ซึ่งจะกล่าวในภายหลัง เพิ่มเติม ในกรณีต้องการเปิด Port เพิ่มที่ไม่ใช่ HTTP/HTTPS ให้คลิกที่ Menu > Network Services > Firewall Rules แล้วกำหนดค่าตามต้องการ โดยการ Create Firewall Rule หวังว่าจะเป็นประโยชน์ครับ

Read More »

Ambari #08 ปรับแต่ง pyspark ให้สามารถใช้งาน spark.ml ได้ ด้วย conda package management

เราสามารถใช้งาน Spark ในด้าน Machine Learning ด้วย pyspark แต่ปัญหาอยู่ที่ว่า python ที่ติดตั้งบน Ubuntu 14.04 นั้น ไม่มี package ที่จำเป็นต้องใช้ ได้แก่ numpy, scipy, scikit-learn, matplotlib ซึ่งขั้นตอนการติดตั้ง ก็จะยุ่งยาก เพราะต้อง compile code เองด้วย แต่ปัจจุบัน มีเครื่องมือที่เรียกว่า “conda” ทำหน้าที่ติดตั้ง package ที่ต้องการได้สะดวก ในที่นี้ จะเลือกใช้ python 2.7 และ จะติดตั้งลงไปใน /opt/conda ขั้นตอนการติดตั้ง conda ไปเลือก setup script จาก https://conda.io/miniconda.html ในการนี้ ขอให้ทำในสิทธิ์ของ root sudo su cd Download script wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh จากนั้น ใช้คำสั่งต่อไปนี้ เพื่อติดตั้ง conda ลงไปใน /opt/conda และ เลือกใช้ค่า default bash Miniconda2-latest-Linux-x86_64.sh -p /opt/conda -b ติดตั้ง scikit-learn package ซึ่งจะติดตั้ง package อื่นๆที่จำเป็นสำหรับ spark.ml เข้ามาด้วย /opt/conda/bin/conda install scikit-learn -y ทำขั้นตอน 3-6 กับ “ทุกๆ node” ใน Hadoop Cluster ต่อไปตั้งค่า Zeppelin ให้สามารถใช้งาน conda แทน python เดิม เปิด Zeppelin ขึ้นมา คลิก Interpreter > ค้นหา spark แล้วคลิก edit จากนั้น หาเลื่อนหาค่า pyspark.python แล้วแก้ไขเป็น /opt/conda/bin/python แล้วคลิก save จากนั้นก็จะสามารถใช้งาน spark.ml ได้แล้ว

Read More »

Ambari #07 เปรียบเทียบความเร็วของการ Query ระหว่าง MySQL กับ Hive

จากบทความก่อนหน้า Ambari #05 การดึงข้อมูลเข้าจาก MySQL เข้าสู่ Hive ด้วย Sqoop ได้นำเข้าข้อมูล Mail Log จาก MySQL ซึ่งมีขนาด 27 GB มีข้อมูลประมาณ 12 ล้าน Record ต่อไปจะเปรียบเทียบ การ Query ข้อมูลจาก  Hive ซึ่งทำงานอยู่บน Hadoop Cluster กับ MySQL Server Spec MySQL Server: 1 Node x CPU 40 Core x RAM 8 GB Hive: 7 Data Node x CPU 4 Core x RAM 4 GB Query: use mailscanner; select from_domain,count(*) from maillog group by from_domain having from_domain like ‘%.com’; ซึ่ง from_domain เป็น Field ที่ไม่มีการทำ index ผลการทดสอบ MySQL: ใช้เวลา 5 นาที 23.90 วินาที = 329.90 วินาที   Hive: ใช้เวลา 92.754 วินาที อนึ่ง : Hive ที่ใช้งานนั้น ทำงานบน  Execution Engine ชื่อ Tez ซึ่งทำงานทั้งหมดบน Memory หากใช้งาน Hive ที่มากับ Apache โดยตรง จะใช้งาน MapReduce ซึ่งจะใช้เวลานานกว่ามาก (ยังไม่ได้ปรับแต่งให้ดีนัก)   แต่อย่างไรก็ดี Hive ไม่ได้ออกแบบมาใช้ทดแทน RDBMS เช่น MySQL/Oracle แต่เหมาะสำหรับการทำงานแบบ Data Warehouse มากกว่า ส่วนเหตุที่ MySQL แม้จะมีจำนวน Core มาก แต่ด้วยข้อจำกัด (โดย Default) ให้การ Group By นั้น จะใช้งานได้แค่ 1 Core เท่านั้น ! [1] แต่เมื่อมองในมุมของ Hive สามารถนำเครื่องคอมพิวเตอร์ทั่วไป (Commodity Hardware) มารวมๆกันได้ ก็ทำให้สามารถขยายระบบได้แบบ Scale Out ก็น่าจะเป็นทางเลือกที่น่าสนใจ Reference [1] https://dev.mysql.com/doc/refman/5.5/en/innodb-performance-thread_concurrency.html  

Read More »

Ambari #06 การใช้งาน Zeppelin เพื่อเรียกข้อมูลจาก MySQL

ขั้นตอนการปรับแต่งให้ Zeppelin เชื่อมต่อกับ  MySQL ในที่นี้ จะเชื่อมต่อไปยัง MySQL Server: ที่ your.mysql.server โดยมี Username/Password เป็น root/123456 และจะใช้ Database ชื่อ employees Download https://dev.mysql.com/downloads/connector/j/ จากนั้นให้ Unzip จะได้ไฟล์ mysql-connector-java-5.1.44-bin.jar (Version อาจจะแตกต่างกัน) แล้วนำไปไว้ใน /usr/hdp/current/spark2-client/jars *** ของทุก Nodes *** จาก Ambari Web UI เลือก Zeppelin Notebook > Quick Links > Zeppelin UI ที่ Zeppelin UI ให้ Login ด้วย admin/admin แล้วคลิก Admin > Interpreter คลิก Create กรอกข้อมูลต่อไปนี้ Interpreter Name: employees Interpreter Group: jdbcแล้วเพิ่ม default.driver:  com.mysql.jdbc.Driver default.url:       jdbc:mysql://your.mysql.server:3306/employees default.user: root default.password: 123456ในส่วนของ Dependency ให้กำหนด artifact: mysql:mysql-connector-java:5.1.44 แล้วกดปุ่ม Save สร้าง Notebook ใหม่ ชื่อ mydatabase แล้วเลือก Default Interpreter เป็น employees แล้วคลิก Create Note จากนั้น ก็จะสามารถส่ง Query ต่างได้ รวมถึง แสดง Graph ที่น่าสนใจได้

Read More »

Ambari #05 การดึงข้อมูลเข้าจาก MySQL เข้าสู่ Hive ด้วย Sqoop

Apache Hive เป็นระบบ Data Warehouse ซึ่งสร้างอยู่บน Hadoop ใช้สำหรับการวิเคราะห์ข้อมูล โดยจุดเด่นคือการใช้คำสั่งภาษา SQL ในการเรียกข้อมูล ทั้งที่อยู่ในรูปแบบของ Database และไฟล์บน Hadoop ได้ เหมาะสำหรับการเก็บข้อมูลขนาดใหญ่มากๆ เช่น การเก็บข้อมูลที่ Rotate ออกจากฐานข้อมูลหลักอย่าง MySQL ก็นำมาเก็บไว้ใน MySQL เพื่อใช้วิเคราะห์ต่อไป ในการดึงข้อมูลจาก MySQL จะแบ่งเป็น 2 ส่วน คือ Full Backup คือการนำข้อมูลทั้งหมดจาก MySQL มาเก็บไว้ใน Apache Hive Incremental Backup คือการดึงเฉพาะข้อมูลที่เพิ่มขึ้นมาเก็บไว้ใน Apache Hive แต่ในบทความนี้ จะแนะนำการทำแบบ Incremental Backup ซึ่งในครั้งแรกจะทำ Full Backup และครั้งต่อๆไป จะทำ Incremental Backup เลย Incremental Backup sqoop ออกแบบมาให้สามารถ Run คำสั่งให้ทำงานทันทีก็ได้ หรือ จะสร้างเป็น Job เอาไว้ เพื่อใช้งานภายหลังก็ได้ ในที่นี้จะสร้างแบบ Job เพราะให้สะดวกในการทำ Incremental Backup การสร้าง Sqoop Job ใช้คำสั่ง sqoop job –create JobName — import … ในส่วนที่จะบอก sqoop ให้ทำงานแบบ incremental backup ต้องตามด้วย Options –incremental append –check-column your_primary_key ในตัวอย่างต่อไปนี้ จะสร้าง sqoop job ชื่อ maillog-incremental ใช้คำสั่งต่อไปนี้ เพื่อดึงข้อมูลทั้งหมดจาก your.mysql.server ใน Database: mailscanner จาก Table: maillog โดยสมมุติใช้ username/password เป็น root/123456 แล้วนำมาใส่ใน Hive Database: mailscanner เพิ่มเติมคือ ให้เก็บไว้ในรูปแบบ Paquet File และ กำหนดให้ใช้ Field: timestamp เป็น Key เพื่อแบ่งงานเพื่อดึงข้อมูลแบบ Parallel ในที่นี้กำหนดให้แบ่งออกเป็น 10 ส่วนพร้อมๆกัน UPDATE: sqoop job จะไม่ยอมให้ใส่ password ตรงๆ แต่จะต้องสร้างไฟล์ password เก็บไว้ใน hdfs และต้องเป็น mode 400 ให้ทำคำสั่งต่อไปนี้ก่อน echo -n “123456” > mysqlpassword.txt hdfs dfs -put mysqlpassword.txt mysqlpassword.txt hdfs dfs -chmod 400 mysqlpassword.txt แล้วจึงสร้าง sqoop job ด้วยคำสั่งต่อไปนี้ sqoop job –create maillog-incremental — import –connect jdbc:mysql://your.mysql.server:3306/mailscanner –username root –password-file /user/hdfs/mysqlpassword.txt –table maillog –hive-database mailscanner –as-parquetfile –hive-import –split-by timestamp -m 10 –incremental append –check-column timestamp เมื่อสร้าง sqoop job เสร็จแล้ว สามารถเรียกดูได้ด้วยคำสั่ง sqoop job –list ดูรายละเอียดการทำงานได้ด้วย คำสั่ง

Read More »