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 »

การลบเมลล์ใน PSU Webmail

เคยเจอปัญหาว่า… มีคนทั้งนอกและในมอ. ส่งเมลล์เช้า @psu.ac.th แต่ไม่ได้รับเมลล์ (ปกติเช็คเมลล์ผ่าน google) เลยลองเข้า https://webmail.psu.ac.th ดูเพื่อที่จะเข้าไปลบเมลล์ เพราะระบบแจ้งว่าพื้นที่เมลล์เต็มแล้ว ก็ทำการลบ(ตามรูป) แต่ก็ไม่เป็นผล เหมือนว่าเมลล์ยังไม่ได้ถูกลบ และพื้นที่เมลล์ก็ยังคงเต็มอยู่เหมือนเดิม มาดูวิธีการลบเมลล์ในกล่อง Inbox กันครับ 1. select all 2. click ปุ่ม Delete 3. แล้วคลิกปุ่ม Expunge อีกครั้ง เมลล์จะถูกลบเป็นหน้าๆ ไป ก็ทำอย่างนั้นไปเรื่อยๆ จนกว่าจะหมด 4. Sign Out แล้วทำการ Sign in ใหม่อีกครั้ง 5. พื้นที่เก็บเมลล์ (Quota Usage) เหลือเยอะขึ้น   หวังว่าจะเป็นประโยชน์กับใครหลายๆคนหรือผู้ที่ประสบปัญหาเดียวกันนะครับ ^^ *** อย่าลืมหมั่นตรวจสอบ และลบเมลล์ออกบ้างนะครับเพื่อเคลียร์พื้นที่ในการจัดเก็บเมลล์

Read More »