Day: October 27, 2017

  • 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

    1. ไปเลือก setup script จาก https://conda.io/miniconda.html
    2. ในการนี้ ขอให้ทำในสิทธิ์ของ root
      sudo su
      cd
    3. Download script
      wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh
    4. จากนั้น ใช้คำสั่งต่อไปนี้ เพื่อติดตั้ง conda ลงไปใน /opt/conda และ เลือกใช้ค่า default
      bash Miniconda2-latest-Linux-x86_64.sh -p /opt/conda -b
    5. ติดตั้ง scikit-learn package ซึ่งจะติดตั้ง package อื่นๆที่จำเป็นสำหรับ spark.ml เข้ามาด้วย
      /opt/conda/bin/conda install scikit-learn -y
    6. ทำขั้นตอน 3-6 กับ “ทุกๆ node” ใน Hadoop Cluster

    ต่อไปตั้งค่า Zeppelin ให้สามารถใช้งาน conda แทน python เดิม

    1. เปิด Zeppelin ขึ้นมา
    2. คลิก Interpreter > ค้นหา spark

      แล้วคลิก edit
    3. จากนั้น หาเลื่อนหาค่า pyspark.python แล้วแก้ไขเป็น /opt/conda/bin/python แล้วคลิก save
    4. จากนั้นก็จะสามารถใช้งาน spark.ml ได้แล้ว
  • 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