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 »

Spark #04 – Pyspark connect to MySQL

ในบทความนี้ จะกล่าวถึง การดึงข้อมูลจาก MySQL ผ่าน JDBC เพื่อนำมาใช้งานใน Spark ด้วยภาษา Python ซึ่งจะใช้ Library Pyspark ในขั้นตอนนี้ขอกล่าวเฉพาะวิธีการก่อน (รายละเอียดจะตามมาทีหลัง) สร้าง SparkSession ตั้งชื่อว่า myspark from pyspark.sql import SparkSession myspark = SparkSession \ .builder \ .appName(“Python Spark SQL basic example”) \ .config(“spark.some.config.option”, “some-value”) \ .getOrCreate() ติดต่อ MySQL และสร้าง View ชื่อ myuser myuser=myspark.read.jdbc(url=”jdbc:mysql://mysql/mysql”,table=”user”, properties={ ‘user’: ‘user1’, ‘password’: ‘123456’} ) myuser.createOrReplaceTempView(name=”myuser”) จากนั้นก็จะสามารถ Query ข้อมูลที่เก็บไว้มาใช้งานใน Spark ได้ myspark.sql(sqlQuery=”select user,host from myuser where user=’user1′”).show() ซึ่งต่อจากนี้ จะสามารถใช้ความสามารถของ Spark ซึ่งทำงานด้าน Distributed Computing ได้ดี มาปรับปรุงความเร็วในการ Query ที่ซับซ้อน เช่นการ JOIN ได้ โดยจะกล่าวในบทความต่อๆไป

Read More »

Fixed : KU$_RADM_FPTM_VIEW in invalid status

ฐานข้อมูลที่จะพบปัญหานี้ Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 OS เป็น CentOS 7.3 หรือ Oracle Enterprise Linux 7.3 ปัญหานี้ข้อสำคัญทำให้ export ข้อมูลไม่ได้ คือไม่สามารถสำรองข้อมูลได้ เข้าระบบด้วยผู้ใช้ oracle สร้างแฟ้ม fix.sql ด้วยคำสั่ง cat >>fix.sql<<EOF CREATE OR REPLACE NONEDITIONABLE TYPE “SYS”.”KU$_RADM_FPTM_T” as object ( vers_major char(1), /* UDT major version # */ vers_minor char(1), /* UDT minor version # */ numbercol number, /* number */ binfloatcol binary_float, /* binary float */ bindoublecol binary_double, /* binary double */ charcol char(1), /* fixed-size character */ varcharcol varchar2(1), /* variable-size character */ ncharcol nchar(1), /* fixed-size national character */ nvarcharcol nvarchar2(1), /* variable-size national character */ datecol date, /* date */ ts_col timestamp, /* timestamp */ tswtz_col timestamp with time zone, /* timestamp with time zone */ fpver number /* version of default fixed point values */ ) / CREATE OR REPLACE FORCE NONEDITIONABLE VIEW “SYS”.”KU$_RADM_FPTM_VIEW” OF “SYS”.”KU$_RADM_FPTM_T” WITH OBJECT IDENTIFIER (fpver) AS select ‘1’,’0′, numbercol, binfloatcol, bindoublecol, charcol, varcharcol, ncharcol, nvarcharcol, datecol,ts_col,tswtz_col, fpver from sys.radm_fptm$ where fpver=1 / EOF เชื่อมต่อกับฐานข้อมูลด้วย sqlplus ด้วยบัญชีผู้ใช้ / as sysdba ที่ prompt SQL> พิมพ์คำสั่ง @/home/oracle/fix.sql ก็จะแก้ปัญหาได้ จบ ขอให้สนุก ที่มา เว็บโดนปิดไปแล้ว

Read More »