Category: Automation System

  • From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful

    จาก Kaggle – วิธีการใช้ Logistic Regression บนข้อมูล Iris เราได้ Model มาแล้ว แต่ จะนำสู่ Production ได้อย่างไร ?

    ใน Python มี Object Serialization ทำให้สามารถเก็บ Object ที่สร้างขึ้น ไปไว้ในไฟล์ ซึ่ง มีให้ใช้หลายตัว ได้แก่

    1. pickle
    2. cpickle
    3. joblib

    มีคนทำการทดสอบความเร็ว พบว่า cpickle เร็วสุด (https://stackoverflow.com/questions/12615525/what-are-the-different-use-cases-of-joblib-versus-pickle) แต่ในที่นี้ จะใช้ joblib เพราะน่าจะเหมาะกับงานที่ต้องมีการ Load Data ขนาดใหญ่ ใช้งานร่วมกันหลาย Process (เท่าที่เข้าใจครับ)

    การสร้างไฟล์ .pkl บน kaggle ดังนี้

    1. เพิ่มคำสั่งต่อไปนี้ แล้ว กดปุ่ม commit and run ด้านบนขวา
      from sklearn.externals import joblib
      joblib.dump(model, 'myiris.pkl')
    2. กดปุ่ม รูป << ด้าน ซ้ายบน เพื่อกลับไป หน้า Kernel ของเรา คลิกที่ Output จะเห็นไฟล์ ที่เพิ่งสร้าง ให้คลิก Download ไปเก็บไว้ใน Folder ที่จะใช้งาน Productioin

    ต่อไป จะเป็นขั้นตอนการติดตั้ง และการใช้ Flask ซึ่งเป็น Python Microframework  และ ใช้ Flask RESTful เพื่อสร้าง REST API

    1. ใช้คำสั่งต่อไปนี้ ติดตั้ง flask และ flask-resetful
      pip install flask flask-restful
    2. จากนั้น เข้าไปใน folder ที่เราวางไฟล์ myiris.pkl ไว้ แล้ว สร้างไฟล์ iris.py มี Code ดังนี้
      from flask import Flask, request
      from flask_restful import Resource, Api, reqparse
      from sklearn.externals import joblib
      import pandas as pd
      #from sklearn.linear_model import LogisticRegression
      
      app = Flask(__name__)
      api = Api(app)
      
      # Model
      model = joblib.load('myiris.pkl')
      class Iris(Resource):
          def get(self):        
              return { "greeting":"Hello From IRIS Dataset"}
          def post(self):
              parser = reqparse.RequestParser()
              parser.add_argument('sl')
              parser.add_argument('sw')
              parser.add_argument('pl')
              parser.add_argument('pw')
              args = parser.parse_args()        
              x = pd.DataFrame([[ args['sl'],args['sw'], args['pl'],args['pw'] ]] ,\
                  columns=['sepal_length', 'sepal_width', 'petal_length', 'petal_width'])
              result = model.predict(x)
              return {"result": result[0]}, 201
      api.add_resource(Iris, "/iris")
      app.run(debug=True)
      
    3. จากนั้น ไปที่ Command Prompt พิมพ์คำสั่งต่อไปนี้ เพื่อเรียก Flask ขึ้นมาทำงาน โดยรับ Request ที่ Port 5000
      python iris.py

      ได้ผลดังนี้

    4. หากใช้ Web Browser ติดต่อไปยัง http://localhost:5000/iris จะได้ผลดังนี้
    5. แต่ถ้าใช้ Postman ติดต่อไปยัง http://localhost:5000/iris แล้วส่งตัวแปร ความกว้าง ความยาว ของกลีบดอก ผ่าน POST ไป จะได้ผลการ Classification มาว่าเป็น Species อะไร ดังนี้
    6. จากตัวอย่างนี้ แสดงให้เห็นว่า เราสามารถสร้าง Model จากข้อมูลขนาดใหญ่ แล้วนำออกมาเป็น Pickle แล้วใช้ Flask RESTFul เพื่อรับ Request แล้วตอบกลับเป็น ผลการ Classification ได้ หรือ Prediction ต่าง ๆ ได้

    เดี๋ยวค่อยมาลงรายละเอียดเรื่อง วิธีการใช้งาน Flask และ การใช้ Machine Learning แบบต่าง ๆ กัน

  • สร้าง Hadoop และ Spark Cluster เพื่องานด้าน Data Science ด้วย Google Cloud Dataproc + Datalab

    จาก Ambari #01: ติดตั้ง Ambari Server , Ambari #02 ติดตั้ง Ambari Agent , Ambari #04 การสร้าง Hadoop ด้วย Ambari บน AWS และ GCP #01 วิธีการสร้าง Virtual Machine บน Google Cloud Platform จะเห็นได้ว่า ก็ยังมีความยุ่งยากอยู่ อีกทั้ง หากต้องการใช้ PySpark ก็ต้องตามติดตั้ง Python Packages ต้องปรับค่ามากมาย และหากต้องการขยายระบบ ก็มีงานต้องทำอีกเยอะ

    ในบทความนี้ จะแนะนำอีกวิธีหนึ่ง คือ การใช้งาน Google Cloud Dataproc ซึ่งจะทำให้เราได้ใช้ Hadoop + Spark Cluster ซึ่งได้รับการทดสอบเป็นอย่างดี อีกทั้งยังสามารถเลือกใช้ Spark รุ่นต่างๆได้อย่างง่ายได้ ทำให้สามารถโฟกัสไปยัง Data และ กระบวนทำ Machine Learning ได้เต็มที่

    1. ไปที่ Google Cloud Console เพื่อเลือก Project ที่จะทำงานด้วย และเปิดช้งาน Cloud Dataproc และ Compute Engine APIs และ ในที่นี้ จะมี project-id คือ kx-dataproc-01 (สามารถสร้างในชื่อที่ต้องการเองได้)
      https://console.cloud.google.com/
    2. เปิดใช้งาน Google Cloud Dataproc
      https://console.cloud.google.com/dataproc/
    3. เปิด GCLOUD COMMAND
    4. ในที่นี้ จะสร้าง Cluster ชื่อ mycluster ใน project-id ชื่อ kx-dataproc-01 แล้วให้ copy คำสั่งต่อไปนี้ลงไปใน gcloud command แล้วกดปุ่ม Enter
      gcloud dataproc clusters create mycluster --project kx-dataproc-01 --initialization-actions gs://dataproc-initialization-actions/datalab/datalab.sh
    5. ใช้เวลาประมาณ 5 นาที ก็จะได้ Hadoop + Spark Cluster ที่มี 1 Master และ 2 Workers
      ซึ่ง Master จะชื่อว่า mycluster-m
      และ Workers จะชื่อ mycluster-w-0 และ mycluster-w-1
    6. ต่อไป ทำ SSH Tunnel จาก Master คือ mycluster-m Port 8080 ออกมา โดยพิมพ์คำสั่งต่อไปนี้
      gcloud compute ssh mycluster-m --project kx-dataproc-01 --zone=asia-southeast1-a -- -4 -N -L 8080:mycluster-m:8080

      โดย
      –project ไว้สำหรับระบุชื่อ project-id
      –zone ไว้ระบุ Zone ที่ Cluster อยู่
      — ไว้เป็นตัวคั่น (separator) ว่าหลังจากนี้เป็นคำสั่งของ ssh
      -4 บอกว่า ติดต่อด้วย IPv4
      -N บอกว่า ไม่ต้องเปิด Shell ของเครื่อง Master
      -L บอกว่า จะ Forward Port 8080 ไปยังเครื่อง mycluster-m ที่ port 8080

    7. จากนั้น เปิด Web Preview on port 8080
    8. ก็จะได้ Google Cloud Datalab ซึ่งติดต่อกับ Hadoop+Spark ที่อยู่บน Google Cloud Dataproc ได้แล้ว

    Reference:

    https://cloud.google.com/dataproc/docs/tutorials/dataproc-datalab

  • การทดสอบแบบอัตโนมัติ ด้วย Robot framework กับ Selenium Library (ตอนที่ 2 การใช้งาน)

    มาลุยกันต่อในตอนที่ 2 กันค่ะ อันดับแรกต้องทำการติดตั้ง Selenium WebDriver กันก่อน สามารถไปดาวน์โหลดได้ที่ https://www.seleniumhq.org/download/ เมื่อติดตั้งเรียบร้อยแล้วเรามาทำความรู้จักโครงสร้างหลักใน Robot Framework กันค่ะ

    ในส่วนของ Setting จะเป็นการกำหนด Library ในที่นี้จะใช้ Selenium2Lirary

    ในส่วนของ Keyword จะใช้ในกรณีที่เราต้องการที่จะสร้าง Keyword ของเราขึ้นมาใช้งานเอง ซึ่งจะใช้ได้เฉพาะในไฟล์นี้เท่านั้น

    ในส่วนของ Variables คือการกำหนดตัวแปร สำหรับการใช้งาน

    ในส่วนของ Test Cases คือส่วนของการเขียน Test Cases ซึ่งสิ่งสำคัญในส่วนนี้คือ ชื่อ Test Cases ถ้าไม่มีการตั้งชื่อให้กับ Test Cases ก็จะไม่สามารถ Run คำสั่งทั้งหมดในไฟล์นี้ได้

    ***โครงสร้างที่สำคัญในการ Run Test Case คือ Setting และ Test Cases ซึ่งในการสร้างไฟล์สำหรับ Test ด้วย Robot ทุกครั้ง จะต้องมี 2 ส่วนนี้ มิฉะนั้น ก็จะไม่สามารถทำงานได้ ส่วน Keywords กับ Variables อาจจะมีหรือไม่มีก็ได้

    จาก Test case ตัวอย่างต้องการจะค้นหา Google ด้วยคำว่า hello world โดยเปิดผ่าน Google Chrome เมื่อเขียนคำสั่งเรียบร้อยแล้ว ก็ Save ไฟล์เป็น Text ธรรมดา ตัวอย่างจะบันทึกชื่อเป็น test.robot ดังรูป

    จากนั้นเรามา Run การทดสอบแบบอัตโนมัติกันค่ะ เปิด Command Prompt ขึ้นมาค่ะ

    ผลลัพธ์จะแสดงอัตโนมัติ ดังรูปค่ะ

    สามารถจะดู Log และ Report จากการทดสอบได้ดังรูป

    เห็นมั๊ยค่ะว่าการใช้งานไม่ยุ่งยากเลย แถมมี log มี report ให้ดูด้วยนะเออ ครั้งนี้เป็นการใช้งานเบื้องต้น เดี๋ยวตอนหน้าจะนำเสนอการใช้งานคำสั่งในรูปแบบอื่น ๆ กันบ้างนะคะ อย่าลืมติดตามกันหล่ะ 

  • การทดสอบแบบอัตโนมัติ ด้วย Robot framework กับ Selenium Library (ตอนที่ 1 การติดตั้ง)

    วันนี้จะมาเล่าเรื่องการทดสอบแบบ Automate ด้วย Robot framework ค่ะ Robot framework ก็คือการทดสอบการทำงานของระบบที่สร้างขึ้น ให้ง่ายและรวดเร็วด้วยการทำ Automate Testing ซึ่งจุดขายของมันคือ Robot Framework สามารถ Test data , executes test cases ออกมาเป็น report และ logs ได้

    Robot Framework implement มาจาก ภาษา Python ดังนั้นเราก็ต้อง install Python กันก่อน โดย Dowloadที่ https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi  ติดตั้งง่าย ๆ มี Next คลิก Next 

    เมื่อติดตั้งเสร็จแล้วมาลองใช้คำสั่งใน Command line ดังรูป ถ้าได้ผลลัพธ์ดังรูปแสดงว่าเราติดตั้ง Python เรียบร้อยแล้วค่ะ

    ต่อไปก็ทำการ Download get-pip.py โดย Download ได้ที่ https://bootstrap.pypa.io/get-pip.py จากนั้นเปิด Command line ใช้คำสั่งเพื่อติดตั้ง pip เรียกจากที่ไฟล์เก็บอยู่ ดังรูป

    Set Environment Variables ไปที่ This PC คลิกขวา à Properties à Advanced system settings à Environment Variables คลิก New ดังรูป จากนั้นคลิกปุ่ม OK

    ที่ Path ทำการ Double click ขึ้นมา จากนั้น New เพิ่มดังรูป

    จากนั้นเปิด Command line พิมพ์คำสั่งเพื่อติดตั้งส่วน library ที่จำเป็นในการทดสอบ คำสั่งดังนี้

    เมื่อเราลงเสร็จ ลองใช้ คำสั่ง pip freeze จะเห็นว่า มันมี library ตามที่เราติดตั้ง ดังรูป

    Tools หรือ IDE ที่จะใช้ในการเขียน Robot Framework จะเลือกเอาตามที่ถนัดเลยค่ะ บทความครั้งหน้าเราจะมาลองใช้งานกันค่ะ

  • วิธีใช้ Google Sheets เป็นฐานข้อมูล เพื่อการเฝ้าระวังระบบ โดยการใช้งานผ่าน Google API Client Library for Python

    ต่อจาก

    1. วิธีการใช้ Google Sheets เป็นฐานข้อมูล
    2. การใช้งาน Google Drive API ด้วย Google Client Library for Python
    3. วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    คราวนี้ ใครมีข้อมูลที่เกิดขึ้นในเซิร์ฟเวอร์ภายในองค์กร แล้วต้องการส่งไปเขียนเก็บไว้ใน Google Sheets แบบต่อท้าย (Append)

    เช่น ในตัวอย่างนี้ วัดระยะเวลาการโอนย้ายข้อมูล เปรียบเทียบระหว่าง rsync เพื่อสำรองข้อมูลไปไว้ในเครื่องเซิร์ฟเวอร์สำรองที่ต่างวิทยาเขต กับ การนำไปเก็บไว้ใน Google Drive ตามวิธีการที่กล่าวไว้ใน วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    ผมได้เขียนโค๊ดเอาไว้ที่ https://github.com/nagarindkx/google.git
    สามารถโคลนไปใช้งานได้ (ช่วย Reference กันด้วยนะครับ)

    ขั้นตอนการใช้งานมีดังนี้

    1. ใช้คำสั่ง
      git clone https://github.com/nagarindkx/google.git
      cd google
    2. ติดตั้ง python, pip, google-api-python-client ตามที่เขียนไว้ใน การใช้งาน Google Drive API ด้วย Google Client Library for Python และสร้างโปรเจคใน Google Developer Console เปิดใช้งาน Google Sheets API, สร้าง Credentials > OAuth Client ID แล้ว download JSON มาไว้ในชื่อว่า client_secret.json
    3. รูปแบบคำสั่งคือ
      $ python append2gsheet.py --help
      
      usage: append2gsheet.py [-h] [--auth_host_name AUTH_HOST_NAME]
                                   [--noauth_local_webserver]
                                   [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
                                   [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                                    --data DATA --sheetid SHEETID [--range RANGE]
                                   [--value-input-option VALUEINPUTOPTION]
      
      optional arguments:
       -h, --help show this help message and exit
       --auth_host_name AUTH_HOST_NAME
         Hostname when running a local web server.
       --noauth_local_webserver
         Do not run a local web server.
       --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
         Port web server should listen on.
       --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
         Set the logging level of detail.
       --data DATA CSV format
       --sheetid SHEETID Google Sheets ID
       --range RANGE Simply Sheet Name like 'Sheet1!A1'
       --value-input-option VALUEINPUTOPTION
         Optional: [RAW,USER_ENTERED]
    4. สิ่งที่ต้องมี คือ Google Sheets ที่สร้างไว้แล้ว ให้สังเกตที่ URL
      ตัวข้อความที่อยู่หลัง https://docs.google.com/spreadsheets/d/ จะเป็น “Sheet ID” ซึ่งจะใช้ในตัวแปร “sheetid” ในขั้นต่อไป
    5. ในแต่ละ Google Sheets จะประกอบด้วย หลาย Sheet ในที่นี้ จะเขียนลง Sheet ที่ชื่อว่า “Data” ซึ่งจะใช้ในตัวแปร “range” ในขั้นต่อไป
    6. ตัวอย่างการใช้งาน เมื่อระบบทำการสำรองข้อมูล จับเวลา ก็จะทำการส่งข้อมูลไปเก็บในลักษณะ CSV อย่างนี้ส่งไป เช่น
      20180129-12,37.0188,27.5338,943.7682,902.7372

      ซึ่งประกอบด้วย 5 ฟิลด์ คือ วันเวลาที่วัด และ ข้อมูล เป็นจำนวนวินาที อีก 4 ฟิลด์
      วิธีการส่งคำสั่งในการใช้งาน ครั้งแรก ต้องใส่  –noauth_local_webserver ด้วย

      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver
      

      จะได้ผลดังนี้

      ให้เอา URL ไปเปิดบนเว็บ Browser ที่สามารถยืนยันตัวตนกับ Google ได้ ผลดังนี้

      แล้วก็ให้การอนุมัติ

      ก็จะได้ Verification Code อย่างนี้

      เอาไปใส่

      สำเร็จ และ ผลที่ได้

    7. แต่จะเห็นว่า ข้อมูล ตัวเลขที่ใส่เข้ามา จะถูกแปลงเป็นข้อความ ซึ่ง สามารถแก้ไขได้ด้วยการใส่ –value-input-option USER_ENTERED
      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver --value-input-option USER_ENTERED

      ผลที่ได้คือ คือ บรรทัดล่าง จะได้ชนิดเป็น Numeric มาเลย

    8. เมื่อเก็บผลเรียบร้อยแล้ว สามารถดูเป็น Chart แบบ Realtime ได้

    เผื่อเป็นประโยชนครับ

  • วิธีทำ Password-less SSH บน Ubuntu

    ในการทำงานกับ Server Cluster ขนาดใหญ่ ซึ่งประกอบด้วย Ubuntu Server จำนวนมาก หากต้องแก้ไขระบบทั้งหมด โดยการ Secure Shell หรือ SSH เข้าไปทีละเครื่อง “โดยต้องเป็น root ด้วย” จะเป็นงานที่ใช้เวลาอย่างมาก เค้าจึงมีระบบที่เรียกว่า Password-less SSH โดยการแลกเปลี่ยน Public Key แทนที่จะต้อง Login ด้วย Username/Password

    และเนื่องจาก Ubuntu โดย Default ไม่มีการสร้าง root password (มี root แต่ไม่มี password –> ก็เลย Login ไม่ได้ด้วย Password) ซึ่งก็ดีในเรื่องของ Security แต่ทำให้การทำงานยุ่งยากนิดหน่อย

    บทความนี้จะกล่าวถึงวิธีการทำ Password-less SSH รวมไปถึง การที่ไม่ต้องถาม Known Host ในครั้งแรกที่เข้าใช้งานด้วย โดยระบบจะประกอบด้วย server01 เป็นเครื่องที่จะสั่งการเครื่อง server02 … serverNN ในสิทธิ์ root และในระบบนี้ ทุกเครื่องมี user ชื่อ mama ซึ่งมีสิทธิ์ sudo

    ที่เครื่อง server01

    1. ใช้คำสั่งต่อไปนี้ เพื่อสร้าง Public/Private rsa key pair
      ssh-keygen

      จะได้ผลดังนี้

      ซึ่งจะได้ไฟล์มา 2 file อยู่ใน directory: ~/.ssh
      – id_rsa
      – id_rsa.pub

    2. เพื่อไม่ให้การ SSH ไปยังเครื่องใหม่ๆ มีการถาม Known Host แบบนี้ แล้วก็ต้องคอยตอบ yes ทุกเครื่องไป

      ก็ให้สร้างไฟล์ .ssh/config ว่า (วิธีนี้จะมีผลเฉพาะ mama เท่านั้น) หรือสร้างใน /etc/ssh/ssh_config เพื่อให้มีผลทั้งระบบ

      Host *
       StrictHostKeyChecking no
       UserKnownHostsFile=/dev/null
    3. จากนั้น ให้เอาไฟล์ Public Key คือ  .ssh/id_rsa.pub  ไปยังเครื่องปลายทาง ในที่นี้คือ server02 (ใช้วิธี scp ไปยัง mama@server02)
      scp .ssh/id_rsa.pub mama@server02:~

      ในครั้งแรกนี้ ยังต้องใส่ Password ของ mama บนเครื่อง server02 อยู่
      จากนั้น ไปดำเนินการต่อใน server02

    ที่เครื่อง server02

    1. ใน home directory ของ mama บน server02 จะมีไฟล์ id_rsa.pub อยู่ ลองตรวจสอบโดยใช้คำสั่ง
      ls -l /home/mama/id_rsa.pub
    2. เปลี่ยนเป็น root ด้วยคำสั่ง
      sudo su

      แล้ว เข้าไปใน root home directory ด้วยคำสั่ง

      cd
    3. สร้าง directory .ssh และ สร้างไฟล์ .ssh/authorized_keys โดยนำข้อมูลในไฟล์ /home/mama/id_rsa.pub มาต่อท้าย
      mkdir .ssh
      cat /home/mama/id_rsa.pub >> .ssh/authorized_keys
    4. เพื่อความปลอดภัย ตั้งค่า Permission ให้ถูกต้อง
      chmod 700 .ssh
      chmod 600 .ssh/authorized_keys

     

    จากนั้น ลองทดสอบ ssh จาก mama บน server01 ไปยัง root บน server02

    ssh root@server02

    ก็จะไม่มีการถาม Password และ ไม่ถาม Known Host อีก

    หลังจากนี้ สามารถ clone เครื่อง server02 ไปเป็นเครื่องต่างๆได้เลย

  • วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    Google Drive File Stream จริงๆแล้วก็คือการเปิดให้ PC ทั้ง Windows และ Mac สามารถ Map Drive จาก Google Drive มาเป็น G:\ หรืออะไรทำนองนั้น แต่ปัจจุบัน (September 2017) บน Windows Server ซึ่งใช้ Secure Boot จะไม่สามารถติดตั้ง Client ได้ และ Ubuntu Server ก็ยังไม่มีตัวติดตั้ง ดังนั้น ในภาพของผู้ดูแลระบบ ไม่สามารถใช้ความสามารถนี้ได้ … โดยตรง

    ส่วนใน Windows Desktop ทั่วไปก็จะติดตั้งได้ แม้ว่า จากคำโฆษณา จะบอกว่าผู้ใช้สามารถใช้งานได้ แม้พื้นที่บน Local Drive ไม่เยอะ แต่เอาเข้าจริง ด้วยความสามารถที่จะใช้งาน Offline ได้บ้าง ทำให้ Client ต้อง Cache ไฟล์ที่ใช้งานด้วยเช่นกัน และหาก upload ไฟล์ขนาดใหญ่ จาก Local Drive ไปเก็บใน G:\ ข้างต้น ก็จะทำให้ต้องเสียพื้นที่ในขนาดเท่าๆกันไปด้วย เช่น ใน Local Drive มีไฟล์ที่จะ Backup ขึ้นไป ขนาด 1 GB บน C:\ เมื่อทำการ Copy ไปยัง G:\ ก็จะเสียพื้นที่อีก 1 GB ด้วยเช่นกัน

    ทางออกก็คือ ใช้ความสามารถของ Google Client Library ทำการ Upload ไฟล์ขึ้นไปโดยตรง เท่าที่ทดลองมา จะไม่ได้ Cache บน Local Drive ทำให้สามารถ Upload ไฟล์ขนาดใหญ่ได้ โดยไม่เสียพื้นที่เพิ่มแบบ Client ข้างต้น

    วิธีการใช้งาน Python เพื่อ Upload File ขึ้น Google Drive File Stream

    1. ผมเขียน Code เอาไว้ ชื่อ upload2gdrive.py ไว้บน GitHub (https://github.com/nagarindkx/google) สามารถดึงมาใช้งานได้โดยใช้คำสั่ง
      clone https://github.com/nagarindkx/google.git
      cd google
    2. สร้าง Project, Credential ตาม “ขั้นที่ 1” ในบทความ การใช้งาน Google Drive API ด้วย Google Client Library for Python ซึ่งจะได้ไฟล์ Client Secret File มา ให้แก้ไขชื่อเป็น “client_secret.json” แล้ว นำไปไว้ใน directory “google” ตามข้อ 1
    3. วิธีใช้คำสั่ง
      ดูวิธีใช้

      python upload2gdrive.py --help

      Upload ไฟล์ จาก /backup/bigfile.tar,gz

      python upload2gdrive.py --file /backup/bigfile.tar.gz

      บน Windows ก็สามารถใช้งานได้ ด้วยคำสั่ง

      python upload2gdrive.py --file D:\backup\bigfile.tar.gz

      หากต้องการระบุตำแหน่ง Folder บน Google Drive ที่ต้องการเอาไฟล์ไปไว้ ให้ระบุ Folder ID

      python upload2gdrive.py --file /backup/bigfile.tar.gz ----gdrive-id xxxxxxxbdXVu7icyyyyyy

      หากต้องการระบุ Chunk Size (ปริมาณข้อมูลที่จะแบ่ง Upload เช่น ไฟล์ 1 GB หากกำหนด Chunk Size เป็น 100MB โปรแกรมจะแบ่งข้อมูลเป็น 10 ส่วน — ขนาดที่เล็กที่สุดคือ 1 MB และค่า Default คือ 100 MB)

      python upload2gdrive.py --file /backup/bigfile.tar.gz ----gdrive-id xxxxxxxbdXVu7icyyyyyy --chunk-size 100
    4. ผลการทำงานจะประมาณนี้

      ใน Google Drive ที่กำหนด ก็จะมีไฟล์ปรากฏอยู่

    หวังว่าจะเป็นประโยชน์ครับ

    PS: ในบทความต่อไป จะมาอธิบายว่า เขียนขึ้นมาได้อย่างไร โปรดติดตามชม

  • การใช้งาน Google Drive API ด้วย Google Client Library for Python

    ในบทความนี้ จะแนะนำวิธีการเขียน Python เพื่อติดต่อกับ Google Drive API ทาง Google Client Library ซึ่ง จะใช้ REST v2 [1] เนื่องจาก ใน REST v3 ยังหาทางแสดง Progress ไม่ได้ (หากได้แล้วจะมา Update นะ)

    สิ่งต้องมี

    1. Python 2.6 ขึ้นไป
    2. PIP Package Management Tool
    3. เครื่องต้องต่อ Internet ได้
    4. แน่นอน มี Google Account

    ขั้นที่ 1: เปิดใช้ Drive API

    เปิด URL https://console.cloud.google.com แล้วคลิก Select a project

    จากนั้นคลิกปุ่ม + เพือสร้าง Project

    ตั้งชื่อ Project แล้วคลิก Save

    เลือก Project ที่สร้างขึ้น เลือก API Library ที่ต้องการ ในที่นี้คือ Google Drive API

    แล้วคลิก Enable

    จากนั้น Create Credentials

    เลือกชนิดเป็น OAuth Client ID แล้วกรอกข้อมูลดังนี้

    สร้าง Consent Screen

    เลือก Application Type เป็น Web Application, ระบุ Name (จะแสดงตอนขอ Permission) แล้วตั้งค่า URL ทั้ง 2 อันเป็น http://localhost:8080

     

    และ สุดท้าย คลิก Download

    ก็จะได้ไฟล์ JSON มา ส่งนี้จะเรียกว่า “Client Secret File”  ให้เก็บไฟล์ไว้ใน Directory เดียวกันกับที่ต้องการจะเขียน Python Code โดยสามารถแก้ไขเปลี่ยนชื่อ เช่น ตั้งเป็น client_secret.json

    ขั้นที่ 2: ติดตั้ง Google Client Library

    ติดตั้งด้วย pip ตามคำสั่งต่อไปนี้

    pip install --upgrade google-api-python-client

    ขั้นที่ 3: เขียน Code เพื่อติดต่อ Drive API

    จาก Python Quickstart [1] เป็นการเริ่มต้นที่ดีมาก เราสามารถนำ Code มาเป็นจุดเริ่มต้นได้ โดยตัวอย่างจะทำการติดต่อไปยัง Google Drive แล้ว List รายการของไฟล์ 10 อันดับแรกออกมา

    ตัวอย่างที่ Google ให้มา จะอ้างอิงไปยัง Credentials Path ไปยัง directory “.credentials” ใน “Home Directory” ของผู้ใช้ แต่ในตัวอย่างที่จะแสดงต่อไปนี้ ได้แก้ไขให้ “Client Secret File” อยู่ที่ directory เดียวกับ python file และเมื่อทำการ Authorization แล้วก็จะได้ “Credential File” มาเก็บไว้ที่เดียวกัน

    Code ต้นฉบับ สามารถดูได้จาก https://developers.google.com/drive/v2/web/quickstart/python ในที่นี้จะเปลี่ยนเฉพาะส่วนที่ต้องการข้างต้น และ เขียน Comment เพื่ออธิบายเพิ่มเติมเป็นภาษาไทย (ซึ่งไม่สามารถเขียนลงไปใน Python Code ได้) โดยตั้งชื่อไฟล์ว่า listfile.py

    from __future__ import print_function
    ...
    # การกำหนด SCOPES ต้องสอดคล้องกับบริการที่เราจะใช้งาน
    SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'
    
    # แก้ไข Client Secret File ให้สอดคล้องกับไฟล์ที่ได้จาก ขั้นตอนที่ 1
    CLIENT_SECRET_FILE = 'client_secret.json'
    # แก้ไข Application Name ตามต้องการ
    APPLICATION_NAME = 'Drive API Python Quickstart'
    
    ...
    def get_credentials():
    ...
     # ไม่ใช้
     # home_dir =os.path.expanduser('~')
     
     # เดิม อยู่ใน os.path.join(home_dir, '.credentials')
     # แก้ไขให้อยู่ที่ Current Working Directory เดียวกันเลย
     credential_dir = os.getcwd()
     ...
     # เดิม os.path.join(credential_dir,'drive-python-quickstart.json')
     # ตั้งชื่อ Credential ตามต้องการ 
     credential_path = os.path.join(credential_dir,'drive_credential.json')
    ...
    
    def main():
    ...
     credentials = get_credentials()
     http = credentials.authorize(httplib2.Http())
    
     # ตรงนี้สำคัญ จะต้องเลือกใช้ REST Version ที่ต้องการ
     # ในที่นี้ ใช้ REST v2
     service = discovery.build('drive', 'v2', http=http)
     
     # ส่วนของการเขียน Code
     # ตัวอย่างนี้ เรียกใช้ files().list()
     # โดยตั้งค่า maxResults เป็น 10 ก็คือ เรียกเฉพาะ 10 รายการแรก
     # อ้างอิงจาก https://developers.google.com/drive/v2/reference/files/list
     results = service.files().list(maxResults=10).execute()
    
     # จาก อ้างอิง จะเห็นได้ว่า files().list() นั้น Return หรือ Response
     # items[] ซึ่งมี element เป็น รายการของไฟล์
     items = results.get('items', [])
     
     # ตรวจสอบว่ามีไฟล์หรือไม่
     if not items:
       print('No files found.')
     else:
       # หากมีไฟล์อยู่
       print('Files:')
       # loop เพื่อแสดงไฟล์ที่มีอยู่ ในที่นี้ จะไม่เกิน maxResults ข้างต้น
       for item in items:
         # แสดงฟิลด์ title และ id
         # เพิ่มเติม .encode('utf-8') ด้วย
         print('{0} ({1})'.format(item['title'].encode('utf-8'), item['id']))
    
    if __name__ == '__main__':
     main()

    ขั้นที่ 4: Run

    ตอนนี้ใน Directory จะมีไฟล์

    • client_secrets.json
    • listfile.py

    ใช้คำสั่ง

    python listfile.py

    หากเป็นการ Run ครั้งแรก ซึ่งจะยังไม่มีไฟล์ drive_credential.json โปรแกรมก็จะทำตาม “flow” โดย ถ้า run command line บนเครื่องที่มี X Window ก็จะเปิด Web Page ไปยัง Google เพื่อ Authorization

    และเปิด Web นี้ ให้คลิกเลือก Account ที่จะติดต่อด้วย

    หน้า Consent Screen คืออย่างนี้ คลิกอนุญาต

    ผลที่ได้

    Reference:

    [1] https://developers.google.com/drive/v2/web/quickstart/python

     

  • Ambari #02 ติดตั้ง Ambari Agent

    ต่อจาก Ambari #01: ติดตั้ง Ambari Server

    ในบทความนี้ จะขอนำเสนอการติดตั้ง Ambari version 2.5.1 จาก HortonWorks ซึ่งจะทำงานกับ Hortonworks Data Platform (HDP)  2.6 โดยติดตั้งบน Ubuntu 16.04 ในส่วนของ “Ambari Agent” [2]

    1. ติดตั้ง Ubuntu 16.04 Server 64bit
    2. สิ่งที่สำคัญมากคือ FQDN หรือการอ้างชื่อเต็มของ host ดังนั้น ในไฟล์ /etc/hosts บรรทัดแรกต้องเป็น Fully Qualified Domain Name เช่น (ห้ามเป็น localhost เด็ดขาด) และถ้าจะให้ดี ควรมี DNS Record บน Name Server ด้วย
      127.0.0.1       ambari02.example.com ambari02
      192.168.1.122   ambari02.example.com ambari02

      ต้องทดสอบใช้คำสั่ง

      hostname -f

      แล้วได้ชื่อ FQDN ถึงจะใช้งานได้

    3. ตั้งค่า Ambari Public Repository
      sudo su
      wget -O /etc/apt/sources.list.d/ambari.list http://public-repo-1.hortonworks.com/ambari/ubuntu16/2.x/updates/2.5.1.0/ambari.list
      apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD
      apt-get update -y
      sudo dpkg --configure -a
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
      apt-cache showpkg ambari-server
    4. ติดตั้ง Ambari Agent
      apt-get install -y ambari-agent
    5. แก้ไขไฟล์
      /etc/ambari-agent/conf/ambari-agent.ini

      ให้ระบบ hostname ไปยัง ambari server ในที่นี้คือ ambari01.example.com

      hostname=ambari01.example.com
      ...
      run_as_user=ambari
    6. เนื่องจากเป็นการติดตั้งแบบ non-root จึงต้องทำการแก้ไข visudo ด้วย
      โดยเพิ่มบรรทัดต่อไปนี้เข้าไป

      # Ambari Customizable Users
      ambari ALL=(ALL) NOPASSWD:SETENV: /bin/su hdfs *,/bin/su ambari-qa *,/bin/su ranger *,/bin/su zookeeper *,/bin/su knox *,/bin/su falcon *,/bin/su ams *, /bin/su flume *,/bin/su hbase *,/bin/su spark *,/bin/su accumulo *,/bin/su hive *,/bin/su hcat *,/bin/su kafka *,/bin/su mapred *,/bin/su oozie *,/bin/su sqoop *,/bin/su storm *,/bin/su tez *,/bin/su atlas *,/bin/su yarn *,/bin/su kms *,/bin/su activity_analyzer *,/bin/su livy *,/bin/su zeppelin *,/bin/su infra-solr *,/bin/su logsearch *
    7. Start Ambari Agent
      ambari-agent start