#chuyencuasys.com

“DevOps is bullshit”

[Virtualization ] Docker Ecosystem November 5, 2017

Kết quả hình ảnh cho docker

 

I.Tổng quan về docker

I.1 Khái niệm về docker

Docker là một hệ thống mã nguồn mở, hỗ trợ đóng gói và tự động triển khai phần mềm trong các container. Nó cung cấp một cách nhanh, gọn để tạo môi trường hoạt động cho phần mềm, giảm thiểu rủi ro giữa dev và ops khi developper phát triển trên cùng một môi trường như môi trường vận hành, giúp dễ dàng tự động hóa và tăng tốc chu trình phát triển phần mềm (dev, test, deploy…).

Ưu điểm:

  •  Triển khai ứng dụng nhanh chóng : container bao gồm các yêu cầu tối thiểu để chạy của ứng dụng , làm giảm kích thước của chúng và cho phép chúng được triển khai nhanh chóng .
  •  Khả năng di chuyển linh động : một ứng dụng và tất cả các phụ thuộc của nó có thể được gói vào một container duy nhất , độc lập với các phiên bản máy chủ của Linux kernel , phân phối nền tảng , hoặc mô hình triển khai.Container này có thể được chuyển sang một máy chạy Docker, và được thực hiện mà không hề có vấn đề tương thích hay không.
  •  Kiểm soát phiên bản và tái sử dụng.
  •  Dễ dàng chia sẻ : với Docker Hub hoặc 1 public Registry việc chia sẻ container rất dễ dàng thực hiện và thân thiện với mọi người kể cả developer, tester, admin system.
  •  Nhẹ và chi phí tối thiểu : Docker image thường rất nhỏ , tạo điều kiện cho việc kiểm thử và giảm thời gian để triển khai các ứng dụng mới container.

I.2 Khi nào sử dụng docker

  • Tách biệt các cài đặt cho từng ứng dụng, không gây ảnh hưởng lẫn nhau.
  • Xây dựng môi trường làm việc mà không quá tốn nhiều thời gian cho việc cài đặt.
  • Đồng nhất môi trường phát triển.
  • Đóng gói môi trường thực thi một cách nhỏ gọn kèm theo cho dự án.

I.3 Kiến trúc của Docker

Docker sử dụng kiến trúc client-server:

  • Client: Là bộ công cụ ở dạng dòng lệnh dùng để pull/push/search các templates dựng sẵn từ registry công cộng hoặc riêng một tổ chức nào đó thông qua Restful API và tập hợp các lệnh khác để tương tác với container.
  • Server: chạy trên nền hệ điều hành của máy chủ dưới dạng một daemon, chịu trách nhiệm cho các tác vụ như đóng gói, thực thi, tải về container image.

I.4 Các thành phần của docker

Docker được tạo bởi 3 phần chính : Container, Image, Registry

  • Container: dùng để tách biệt ứng dụng và các thành phần thưc thi của ứng dụng đó với các container khác trên cùng 1 máy chủ và với chính máy chủ chứa container đó.
  • Image: là các template dựng sẵn đã chứa đủ các thành phần của môi trường thực thi cần cho ứng dụng và được dùng để tạo các container. Chẳng hạn một image chứa hệ điều hành Ubuntu đã cài đặt sẵn Apache và ứng dụng web
  • Registry : Là kho chứa images. Người dùng có thể tạo ra các images của mình và tải lên đây hoặc tải về các images được chia sẻ (Docker Hub)

Hình 1.1 Mô hình tương tác giữa các thành phần docker

 

Docker Daemon

 Như thế hiện trên hình vẽ , Docker daemon chạy trên các máy host. Người dùng sẽ  không tương tác trực tiếp với các daemon, mà thông qua Docker Client.

Docker Client

Là giao diện người dùng của Docker, nó cung cấp cho người dùng giao diện dòng lệnh và thực hiện phản hồi với các Docker daemon.

Docker images

Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.

Docker Container

Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.

I.5 Sự khác nhau giữa Docker và Máy Ảo

Hình 1.2 Mô hình docker và máy ảo

  • Cùng xét mô hình kiến trúc của VM: Mỗi ứng dụng được ảo hóa bao gồm chính ứng dụng đấy và cũng chứa các phụ thuộc của nó giống như bên container. Tuy nhiên bên VM sẽ kèm theo thêm 1 guest OS. Điều này dẫn tới việc đóng gói ứng dụng được ảo hóa sẽ có dung lượng lên tới hàng GB.
  • Khác với container là chia sẻ host OS đồng nghĩa với việc các container sẽ có OS giống nhau thì với máy ảo, mỗi một VM có thể có OS khác so với các VM khác và thậm trí OS của các VM hoàn toàn có thể khác với host OS.
  • Xét về tính linh hoạt: Nếu như bạn muốn bảo trì máy host, với container thì khi bảo trì mà buộc phải khởi động lại máy thì đồng nghĩa với việc hoạt động của các container có trong máy đó sẽ bị gián đoạn. Tuy nhiên với VM, bạn hoàn toàn có thể di chuyển các VM có trong máy cần được bảo dưỡng sang tạm các máy tính khác. Điều này giúp ứng dụng có trong các VM hoạt động mà không bị gián đoạn.
  • Xét về tính an toàn: Với container, do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy
  • Sử dụng Docker tạo và xóa container nhanh, dễ dàng, trong khi Virtual Machine yêu cầu cài đặt đầy đủ và sử dụng nhiều tài nguyên của máy để thực thi việc cài đặt đó
  • Container ưu điểm là lightweight, có thể chạy nhiều container hơn VM khi triển khai trên cùng một máy chủ. Container bật tắt nhẹ nhành, nhanh chóng
  •  VM có thể migrate giữa các máy chủ trong lúc chạy. Container thì phải dừng hẳn thì mới migrate được.
  •  Hypervisor có thời gian khởi động trung bình là 20s, thay đổi phụ thuộc vào tốc độ của ổ đĩa.
  •  Containers khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.

I.6 Quy trình thực thi của một hệ thống sử dụng Docker.

Như hình vẽ trên , một hệ thống Docker được thực thi với 3 bước chính :

Build -> Push -> Pull,Run

a, Build.

Đầu tiên chúng ta sẽ tạo một dockerfile, trong dockerfile này chính là code của chúng ta.

Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine.

Sau khi build ta sẽ thu được Container, trong Container này chứa bộ thư viện và ứng dụng của chúng ta.

b, Push.

Sau khi có được Container, chúng ta thực hiện push Container này lên đám mây và lưu trữ ở đó.Việc push này có thể thực hiện qua môi trường mạng Internet.

c, Pull, Run

Giả sử một máy tính muốn sử dụng Container chúng ta đã push lên đám mây (máy đã cài Docker Engine) thì bắt buộc máy phải thực hiện việc Pull container này về máy. Sau đó thực hiện Run Container này.

II.Cấu trúc của một Docker File

II.1 Docker File

  Dockerfile là 1 file text chứa các lệnh thực thi để build 1 image cho docker. Với dockerfile chúng ta có 1 phương tiện để build các image 1 cách tự động và share với nhau 1 cách dễ dàng, 1 team của 1 dự án có thể dung dockerfile để tạo các môi trường dev và test đồng nhất với nhau

 II.2 Cấu trúc tập lệnh của một Docker File

    + FROM <image>

    Đây là lệnh phải có với bất kỳ 1 dockerfile nào, và phải nằm ở line đầu tiên của file

    Mục đích của lệnh là set image làm cơ sở để từ đó tạo nên image muốn build

    Ví dụ: FROM ubuntu:12.04

    =>Nếu image cơ sở này không tồn tại trong local thì docker sẽ tự pull image này từ Docker Hub

    + MAINTAINER <name>

     Lệnh dùng để set tác giả của image, có thể có hoặc không

    + RUN <command>

       Lệnh dùng để thực thi 1 command trên hệ thống(của image)

    + CMD <command>

      Trong 1 dockerfile chỉ có thể có 1 lệnh CMD. Lệnh này để tạo command được thưc thi khi khởi chạy image

    + ADD <src> <dest>

     Lệnh dùng để copy file từ remote hoặc local file được chỉ định ở <src> vào path trên container được chỉ đinh ở <dest>

   + EXPOSE <port> [<port>]

Lệnh dùng để chỉ định rằng containner của image sẽ listen trên các port nào đó trong khi chạy

III. Một số tập lệnh làm việc với Docker ( Docker Engine)

+Pull một image từ Docker Hub
 $ docker pull {image_name}

+Liệt kê các images hiện có
 $ docker images

+Xóa một image
 $ docker rmi {image_id/name}

+Liệt kê các container đang chạy
 $ docker ps
 $ docker ps -a #Liệt kê các container đã tắt

+Xóa một container
 $ docker rm -f {container_id/name}

+Đổi tên một container
 $ docker rename {old_container_name} {new_container_name}

+Khởi động một container
 $ docker start {new_container_name}
 $ docker exec -it {new_container_name} /bin/bash

+Tạo mới một container, đồng thời khởi động với tùy chọn cổng và volume
 $ docker run –name {container_name} -p {host_port}:{container_port} -v {/host_path}:{/container_path} -it {image_name} /bin/bash

+Xem các thay đổi trên container
 $ docker diff {container_name}

+Commit các thay đổi trên container và image
 $ docker commit -m “message” {container_name} {image_name}

+Save image thành file .tar
 $ docker save {image_name} > {/host_path/new_image.tar}

+Tạo một image mới từ file .tar
 $ cat musashi.tar | docker import – {new_image_name}:latest

+Xem lịch sử các commit trên image
 $ docker history {image_name}

+Khôi phục lại images từ IMAGE_ID
 $ docker tag {iamge_id} {image_new_name}:{tag}

+Build một image từ container
$ docker build -t {container_name} .
Dấu . ở đây có thể hiểu là Dockerfile đang nằm trong thư mục hiện tại.

Tham khảo phần demo tạo 1 Docker file & container qua link github sau:

https://github.com/lieunn/docker-lamp

IV. Docker Storage

Volume trong Docker

=>Volume trong Docker được dùng để chia sẻ dữ liệu cho container. Để sử dụng volume trong docker dùng cờ hiệu (flag) -v trong lệnh docker run.

Có thể sử dụng Volume trong Docker trong những trường hợp sau

  • Chia sẻ giữa container và container.
  • Chia sẻ giữa container và host.
  • Sử dụng volume để gắn (mount) một thư mục nào đó trong host với container.

Sử dụng volume để chia sẻ dữ liệu giữa host và container

Trong tình huống này thư mục trên máy host (máy chứa container) sẽ được mount với một thư mục trên container, dữ liệu sinh ra trên thư mục được mount của container sẽ xuất hiện trên thư mục của host.

* Có 2 chế độ chia sẻ volume trong docker, đó là read-write (rw) hoặc read-only (ro). Nếu không chỉ ra cụ thể thì mặc định sử dụng chế độ read-write. Ví dụ chế độ read-only, sử dụng tùy chọn ro.

$ docker run -it -v $(pwd)/bindthis:/var/www/html/webapp:ro ubuntu bash

Các lưu ý về volume trong Docker

  • Đường dẫn trong cờ hiệu -v phải là đường dẫn tuyệt đối, thường dùng $(pwd)/ten_duong_dan để chỉ đúng đường dẫn.
  •  Có thể chỉ định việc mount giữa thư mục trên host và thư mục trên container ở các chế độ read-wirte hoặc read-only, mặc định là read-write.
  •  Để chia sẻ volume dùng tùy chọn –volumes-from

Sử dụng Docker với một số storage khác

=>Nhu cầu về lưu trữ data ngày càng tăng => cần 1 giải pháp storage hợp lý, có thể kể đến Ceph, Glusterfs, Openfiler ….

=> Có thể xây dựng một hệ thống storage ceph, gluster tách riêng sau đó sẽ mount các volume share tương ứng về volume local trên docker container

  Hình 3.1.Mô hình lưu trữ Ceph-Docker

Như hình trên thì ta sẽ xây dựng một hệ thống ceph cluster  chứa các volume cần share, client sẽ xây dựng 2 host docker để map volume share về local và mount vào các docker container

+ Một số bài viết tham khảo:

http://hustcat.github.io/run-docker-on-ceph/

https://hub.docker.com/r/ceph/rbd-volume/

https://hub.docker.com/r/jsafrane/glusterfs-mounter

V. Network Docker

  1. Cấu trúc của Virtual Bridge

Network của docker được quản lý thông qua một virtual bridge gọi là docker0. Mục đích của việc này là để tạo ra một network độc lập, tách biệt với môi trường khác.

Khi chúng ta khởi động docker deamon (thông qua sudo service docker startchẳng hạn) thì những step dưới đây sẽ diễn ra:

+ Virtual bridge docker0 sẽ được tạo ra=>Docker tự dộng tìm ra một khoảng ip range còn trống từ trong route của máy host=>Chọn ra random một khoảng ip bất kì=>Assign khoảng ip đó cho docker0

Sau đó khi chúng ta khởi động một container bất kì, thì container đó sẽ được assign những thứ dưới đây:

+ veth (Virtual Eithernet) interface gắn với docker0

+ một ip bất kì trong range mà docker0 vừa thu được ở trên

  1. Networking giữa các container với nhau

Để kiểm soát việc các container có làm việc được với nhau hay không, chúng ta thông qua parameter -icc của docker daemon.

+ Khi -icc = true thì container có thể nói chuyện được với nhau.

+ Khi -icc = false thì các container sẽ bị tách biệt với nhau

Ngoài ra để public một port nào đó ra ngoài chúng ta cũng phải chỉ định EXPOSE <port> trong Dockerfile hoặc là –expose <port> khi khởi động container.

Cụ thể hơn, để các container nói chuyện được với nhau, docker0 sử dụng một tính năng gọi là –link. Khi khởi động một container nào đó chúng ta phải chỉ định –link containerName:containerAlias , nhờ đó mà service trong container đó sẽ tìm thấy service muốn kết nối đến thông qua biến môi trường.

  1. Kết nối từ network ở ngoài vào container

Để kết nối từ network ở ngoài vào container thì chúng ta phải mapping port của máy host với port mà container expose thông qua docker0.
Ví dụ chúng ta muốn map port 8080 của máy host vào port 80 của docker , sử dụng apache container:

$ ID=$(docker run -d -p 8080:80 tcnksm/apache)

caad0cfc2a0

Chúng ta có thể kiểm tra mapping như sau

$ docker ps

CONTAINER ID        IMAGE                  COMMAND                CREATED              STATUS              PORTS                  NAMES

caad0cfc2a03        tcnksm/apache:latest   /usr/sbin/apache2 -D   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   elegant_thompson

$ docker port $ID 80

0.0.0.0:8080

$ ID=$(docker run -d -p 80 tcnksm/apache)

$ docker port $ID 80

0.0.0.0:49156

$ curl `docker port $ID 80`

Hello, docker

4. Bridge network trong Docker

Về native, docker hỗ trợ 3 loại network:

[[email protected] ~]# docker network ls

NETWORK ID          NAME                DRIVER

f163f5a13de0        bridge              bridge

4cf5b3a8120b        host                host

d33d2260ad2c        none                null

=>Mặc định, docker dùng bridge network. Khi cài đặt docker, bạn sẽ thấy một interface docker0 trên host. Khi khởi chạy một container trong host, một interface mới đại diện cho nó sẽ được sinh ra trên host:

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether 02:42:f1:59:1a:46 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.1/16 scope global docker0

       valid_lft forever preferred_lft forever

    inet6 fe80::42:f1ff:fe59:1a46/64 scope link

       valid_lft forever preferred_lft forever

92: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP

    link/ether de:bf:41:5b:54:f6 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet6 fe80::dcbf:41ff:fe5b:54f6/64 scope link

    valid_lft forever preferred_lft forever

=>Có thể xem ip của docker container qua:

[[email protected] ~]# docker inspect 992f2635e59f | grep IPAddr

            “SecondaryIPAddresses”: null,

            “IPAddress”: “172.17.0.2”,

            “IPAddress”: “172.17.0.2”,

Tất cả các container đều nhận host làm gateway.Do các container đều dùng host làm gateway nên bridge network cho phép:

+ Container trên cùng host giao tiếp với nhau được

+ Container có thể gửi packet ra bên ngoài host được.

=>Để đảm bảo host forward được IP thì cần cấu hình NAT và cho phép ip forward.

Trên host cấu hình ip forward:
vi /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1
sysctl -p

[[email protected] Docker_Centos6]# docker run -it -p 81:80 image_name
ở đây port trong container 80 sẽ được map đến 81 trong host.

Có thể tham khảo chi tiết hơn ở link sau:

http://kipalog.com/posts/Co-ban-ve-docker-network

VI. Docker-Compose

Compose là công cụ giúp định nghĩa và khởi chạy multi-container Docker applications. Trong Compose, chúng ta sử dụng Compose file để cấu hình application’s services. Chỉ với một câu lệnh, lập trình viên có thể dễ dàng create và start toàn bộ các services phục vụ cho việc chạy ứng dụng.

  • Compose là một công cụ tuyệt vời không chỉ dùng cho development, testing, staging environments, mà còn ứng dụng trong CI workflows. Việc sử dụng Docker Compose được tóm lược trong 3 bước cơ bản sau:
  • Khai báo app’s environment với Dockerfile.
  • Khai báo các services cần thiết để chạy app trong docker-compose.yml.
  • Run docker-compose up và Compose sẽ start và run app.

Setup Docker-Compose tham khảo qua link github sau:

https://github.com/lieunn/docker-compose

VII. Docker-Swarm

Docker swarm là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể “nhìn” nó như duy nhất một virtual Docker Engine.

  • Trong phiên bản v1.12.0, Docker Swarm là một tính năng được tích hợp sẵn trong Docker Engine.

Trong phần này, tôi sẽ tạo ra 1 cụm cluster gồm 1 manager và 2 worker chạy dịch vụ web-server.

  • node manager sẽ là node quản lý cluster.
  • node worker là các node chạy dịch vụ. Nếu mà node worker die thì node manager sẽ run container trên chính nó.

Tham khảo mô hình setup sau:

  • https://github.com/lieunn/summary-docker/blob/master/docs/docker-swarm.md
  • https://asciinema.org/a/94625 ( deploy production)

VIII. Monitoring Docker

Giám sát tình trạng trên docker host

Có thể tham khảo bài viết sau:

https://github.com/monitoringartist/zabbix-docker-monitorin

http://logz.io/blog/docker-monitoring-dockercon-2016/

https://stefanprodan.com/2016/a-monitoring-solution-for-docker-hosts-containers-and-containerized-services/

Tìm hiểu về Docker Containers và Azure Container Service (Phần 1)

https://blog.nimbleci.com/2016/08/17/how-to-set-up-and-deploy-to-a-1000-node-docker-swarm/

https://www.vishnu-tech.com/blog/

https://viblo.asia/p/cac-van-de-ve-docker-tren-production-DzVkpmMwvnW

Docker cho người mới bắt đầu (P1)

https://blog.topdev.vn/su-dung-docker-va-ca-docker-compose-cho-du-an-django/

https://viblo.asia/p/tai-sao-nen-dua-docker-lam-chuan-khi-phat-trien-MdZkAYBakox

2 Comments on [Virtualization ] Docker Ecosystem
Categories: Tài liệu

Hazelcast IMDG In-Memory Data Grid November 4, 2017

1> Đôi nét về Hazelcast.

  •  Hazelcast là một mạng lưu trữ dữ liệu trên bộ nhớ Ram (in-memory data grid). Hazelcast đưa ra cài đặt của các interface trong Java như: Map, Queue, Excecutor Service, Lock… Nó được thiết kế rất nhẹ và dễ sử dụng.
  • Hazelcast được cài đặt bằng ngôn ngữ Java, client hỗ trợ các ngôn ngữ Java, C/C++, C# , Python…
  • Hazelcast cũng có thể được xem như một giao thức lưu đệm (memcache protocol).
  • Hazelcast sử dụng cơ chế mạng ngang hàng, không có master và slave. Tất cả các node lưu số lượng dữ liệu như nhau, và xử lý bằng nhau.
  • Hazelcast lưu trữ mọi thứ trên Ram (in-memory). Nó được thiết kế để thực thi rất nhanh các thao tác đọc và cập nhật (read/update) dữ liệu.
  • Hazelcast lưu các bản sao (backup) của mỗi mảnh dữ liệu trên các node khác nhau. Khi một node bị lỗi, dự liệu trên node đó sẽ được khôi phục lại từ bản sao (bản backup) và cụm Hazelcast vẫn hoạt động bình thường, không có thời gian ngừng hoạt động (downtime = 0).
  •  Sharding(các mảnh dữ liệu) trong Hazelcast được gọi là các Partition. Mặc định Hazelcast có 271 partition. Các partition được phân tán trên tất cả các node của cụm. Hazelcast cũng tạo bản backup của các partition và phân tán chúng trên các node.

2> Một số Use Case Hazelcast.

  • Application scaling
  • Cache-as-a-service
  • Cross-JVM communication and shared storage
  • Distributed cache, often in front of a database
  • In-memory processing and Analytics
  • In-memory computing
  • Internet of Things infrastructure
  • Key-value database
  • Memcached alternative with a protocol compatible interface[4]
  • Microservices infrastructure
  • NoSQL data store
  • Spring Cache
  • Web Session clustering

3> Kiến trúc Client-Server  Hazelcast.

  • Hazelcast cung cấp một kiến trúc phân mảnh & phân tán dữ liệu qua  cluster node.

+ Hazelcast IMDG  có những đặc điểm sau:

  • Dữ liệu được lưu trữ trên RAM.
  • Nhiều bản sao được lưu trữ trên nhiều node để auto-recovery dữ liệu  trong trường hợp một hoặc nhiều node fail.
  • Mô hình dữ liệu hướng đối tượng và là kiểu dữ liệu không quan hệ(non-relational).
  • Resource có thể được tự động thêm hoặc gỡ bỏ để tăng lượng CPU và RAM.
  • Dữ liệu có thể được duy trí từ một hazelcast node  đến một cơ sở dữ liệu quan hệ hoặc NoSQL.
  • Một Java API Map có thể truy xuất vào kho dữ liệu phân tán key-value.

HAZELCAST EMBEDDED ARCHITECTURE

HAZELCAST CLIENT-SERVER ARCHITECTURE

4> Setup Hazelcast Cluster.

Mô hình 3 node:

  • Node 01: IP 192.168.175.128
  • Node 02: IP 192.168.175.129
  • Management: IP 192.168.175.130

Step 1: Download Hazelcast 3.9

Link: https://hazelcast.org/download/archives/

Step 2: Install hazelcast-3.9

$  unzip hazelcast-3.9.zip

$ cp -R hazelcast-3.9 /build

Step 3: Configuration, Start & Stop Node01 (192.168.175.128)

$ cd /build/hazelcast-3.9

$ vim hazelcast.xml

– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>[email protected]#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.128</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>

$ cd /build/hazelcast-3.9/bin

$ chmod +x *.sh

$ ./start.sh => check port default 5701 is listen and join cluster (member list)

Step 4: Configuration, Start & Stop Node02 (192.168.175.129)

$ cd /build/hazelcast-3.9

$ vim hazelcast.xml

– update management-center data
– update multicast data
– update tcp-ip data
<group>
<name>sandbox</name>
<password>[email protected]#1234</password>
</group>
<management-center enabled=”true”>http://192.168.175.130:8080/mancenter</management-center>
<network>
<port auto-increment=”true” port-count=”100″>5701</port>
<outbound-ports>
<!–
Allowed port range when connecting to other nodes.
0 or * means use system provided port.
–>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled=”false”>
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
<tcp-ip enabled=”true”>
<interface>192.168.175.129</interface>
<member-list>
<member>192.168.175.128</member>
<member>192.168.175.129</member>
</member-list>
</tcp-ip>
<aws enabled=”false”>

$ cd /build/hazelcast-3.9/bin

$ chmod +x *.sh

$ ./start.sh => check port default 5701 is listen and join cluster (member list)

Step 5:  Start & Stop Node Management (192.168.175.130)

$ wget https://download.hazelcast.com/management-center/management-center-3.9.zip

$ unzip management-center-3.9.zip

$ cp -R management-center-3.9 /build

$ cd /build/management-center-3.9/bin/

$ chmod +x startManCenter.sh

$ ./startManCenter.sh ( listen port default is 8080)

Acess link Web UI: http://IP:8080/mancenter

5> Một số link tham khảo

https://hazelcast.com/resources/benchmark-redis-vs-hazelcast-original/

http://www.tothenew.com/blog/caching-what-why-and-how-with-hazelcast/

https://hazelcast.org/download/archives/

 

No Comments on Hazelcast IMDG In-Memory Data Grid
Categories: Tài liệu

[Configuration Management] ANSIBLE TOOL September 23, 2017

Chào các bạn!

Là dân system chắc là các bạn cũng đã từng nghe nhắc nhiều đến cụm từ “Configuration Management” hoăc cứ google là ra hàng tá bài viết liên quan.

Vâng! Configuration Management (CM) có thể hiểu là công cụ hỗ trợ, cấu hình, cài đặt hệ thống một cách tự động. Có rất nhiều công cụ như Ansible, Chef, Puppet, Saltstack … Loạt bài viết này sẽ không tập trung vào việc so sánh các công cụ CM mà chỉ hướng dẫn bạn cách cài đặt và sử dụng Ansible.

1. Ansible là cái gì?

Ansible  có thể hiểu nôm na là  công cụ  dùng để quản lý cài đặt, cấu hình hệ thống một cách tập trung và cho phép thực thi câu lệnh điều khiển.

2. Ansible có những tính năng gì hay ho ?

+ Dự phòng tài nguyên (provisioning)

+ Quản lý cấu hình (configuration management)

+ Triển khai ứng dụng (app deployment)

+ Giao hàng liên tục (continous delivery)

+ Bảo mật và tuân thủ (security and compliance)

+ Điều phối (orchestration).

3. Đặc điểm của Ansible

+ Không cần cài đặt phần mềm lên các agent, chỉ cần cài đặt tại master.
+ Không service, daemon, chỉ thực thi khi được gọi
+ Cú pháp dễ đọc, dễ học, dễ hiểu

 4. Ansible playbook thì sao?

Ansible playbook giúp chúng ta tổ chức công việc của mình theo nhiều cách. Trong hình thức trực tiếp nhất, chúng ta có thể làm việc với các module của Ansible sử dụng công cụ dòng lệnh “ansible” và file inventory.

4.1. Inventory

File inventory giúp Ansible biết các server mà nó cần kết nối sử dụng SSH, thông tin kết nối nó yêu cầu, và tùy chọn các biến gắn liền với các server này. File inventory có định dạng là INI. Trong file inventory, chúng ta có thể chỉ định nhiều hơn một máy chủ và gom chúng thành nhiều nhóm.

Ex: file inventory hosts.ini như sau

[webservers]
192.168.175.129
192.168.175.130

4.2 Task (nhiệm vụ)

Một khái niệm quan trọng khác là các task. Mỗi task của Ansible chứa một tên, một module để gọi, các tham số của module, và tùy chọn các điều kiện trước và sau. Chúng cho phép chúng ta gọi các module Ansible và truyền thông tin tới các task kế tiếp.

4.3 Vars (Các biến)

Biến hữu dụng cho việc tái sử dụng thông tin chúng ta cung cấp hoặc tập hợp. Chúng ta có thể định nghĩa biến trong các file inventory, các file YAML hoặc trong các playbook.

4.4 Playbook

Ansible playbook được viết bằng cú pháp YAML . Nó có thể chứa nhiều hơn một play. Mỗi play chứa tên của các nhóm máy chủ để kết nối tới và các nhiệm vụ nó cần thực hiện. Nó cũng có thể chứa các biến/các role/các handler, nếu đã định nghĩa.

Ex: cấu trúc của một playbook

                     hosts: dbservers

                        gather_facts: no

                      vars:

                         who: World

                      tasks:

                          – name: say hello

                             debug: msg=”Hello {{ who }}”

                           – name: retrieve the uptime

                            command: uptime

Trong playbook trên, chúng ta đã nói rằng Ansible sẽ thao tác trên các server đã được định nghĩa trong nhóm máy chủ “dbservers”. Chúng ta đã tạo một biến gọi là “who” và sau đó chúng ta định nghĩa các nhiệm vụ của chúng ta. Chú ý rằng trong nhiệm vụ đầu tiên nơi chúng ta in ra một thông điệp debug, chúng ta đã sử dụng biến “who” và Ansible in “Hello World”  ra màn hình. Trong nhiệm vụ thứ 2, chúng ta nói với Ansible kết nối tới mỗi máy chủ và sau đó thực thi lệnh “uptime”.

5. Hướng dẫn cài đặt và tổ chức một ansible playbook

5.1 Cài đặt.

Việc cài đặt ansible khá là đơn giản:

         Trên CentOS:
$ yum install epel-release
$ yum install ansible
        Trên Ubuntu:
Cấu hình PPA, cài đặt:
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
Trên các phiên bản Ubuntu cũ, gói software-properties-common có tên khác là python-software-properties

5.2 Viết một playbook cho việc triển khai các dịch vụ

Ở đây mình đã  có viết một playbook cho việc deploy các dịch vụ như nginx, mongodb, redis, postgresql.

             Mô hình deploy:

+ node master ( 192.168.75.128): cài  đặt ansible tool

+ node deploy services (192.168.75.129 & 192.168.75.130): các dịch vụ như nginx, mongodb, redis, postgresql sẽ được deploy trên 2 node này

Các bạn có thể tham khảo playbook qua link github sau:

https://github.com/lieunn/ansible-services/tree/master/roles

+  Trên node master thực thi lệnh sau để tiến hành deploy services:

                    [[email protected]:]# ansible-playbook -i ansible-services/deployment ansible-services/analytics.yml

Cấu trúc tổ chức thư mục playbook:

[[email protected]:~]# ll /build/ansible-services
-rw-r–r–. 1 root root 65 Sep 20 05:55 analytics.yml
-rw-r–r–. 1 root root 28 Sep 15 08:12 deployment
-rw-r–r–. 1 root root 19 Sep 23 08:47 README.md
drwxr-xr-x. 6 root root 4096 Sep 20 05:34 roles
[[email protected]:~]# ll /build/ansible-services/roles/
total 16
drwxr-xr-x. 7 root root 4096 Sep 16 07:48 mongodb
drwxr-xr-x. 7 root root 4096 Sep 16 06:13 nginx
drwxr-xr-x. 6 root root 4096 Sep 20 05:34 postgres
drwxr-xr-x. 6 root root 4096 Sep 20 04:11 redis
[[email protected]:~]# ll /build/ansible-services/roles/mongodb/
total 20
drwxr-xr-x. 2 root root 4096 Sep 16 07:54 files
drwxr-xr-x. 2 root root 4096 Sep 16 09:09 handlers
drwxr-xr-x. 2 root root 4096 Sep 16 09:13 tasks
drwxr-xr-x. 2 root root 4096 Sep 16 08:09 templates
drwxr-xr-x. 2 root root 4096 Sep 16 08:36 vars

 

Một số nguồn tham khảo:

https://techmaster.vn/posts/33717/su-dung-ansible-vo-postgresql

https://congcan.wordpress.com/tag/saltstack/

http://blog.vccloud.vn/configuration-management/

https://tech.fpt.com.vn/cicdcqm-giai-phap-toan-dien-nang-cao-chat-luong-du/

2 Comments on [Configuration Management] ANSIBLE TOOL
Categories: Tài liệu

LÀM THẾ NÀO ĐỂ BIẾT MÌNH ĐANG ĐI ĐÚNG CON ĐƯỜNG September 4, 2017

Chào các bạn!

Đang trong kỳ nghỉ lễ quốc khánh 2/9 chắc là các bạn cũng có những trải nghiệm thú vị cùng bạn bè hoặc gia đình, riêng mình thì kỳ nghĩ lễ này cũng ko có plan đi đây đi đó nên rảnh rổi sinh nông nổi, ngồi viết vài câu chuyện tản mạn chia sẻ cùng các bạn, gọi là cho đỡ tẻ nhạt bớt trong kỳ nghỉ lễ này :v. Tiếp nối những seri linh ta linh tinh trước đó về chuyện đời chuyện nghề của 1 system admin, hôm này mình tiếp tục cùng bàn luận về topic nho nhỏ ” làm thế nào để biết mình đang đi đúng con đường ” theo cách nghĩ khách quan của bản thân mình thôi nha các bạn :-).

Ngược dòng xa xôi chút về những năm cuối cấp 3, thời điểm mà ai ai cũng có những lựa chọn riêng về  ngành nghề vs ước mơ sẽ theo đuổi, có người thì đã định hướng từ trước, có người thì cũng chả biết nên theo ngành nghề nào cứ tham khảo ý kiến ai đó, bạn bè or người quen rồi chọn trường theo, kiểu như mông lung như một trò đùa =)).

Chặng đường tiếp theo sau đó có lẽ là cánh cổng ĐH nơi bước đầu hiện thực hóa những hoài bảo, một chương mới trên con đường sự nghiệp được mở ra, ở đó thứ cho bạn có lẽ là những hành trang về nghề nghiệp để bước vào đời từ kiến thức chuyên môn của từng ngành nghề, kiến thức xã hội, mối quan hệ….

Sau khi có được tấm bằng ĐH (cử nhân, kỹ sư…) ai cũng đi tìm cho mình một công việc theo đúng chuyên môn được đào tạo, nhưng cuộc sống mà đâu phải lúc nào cũng theo ý ta, có bạn thì làm đúng chuyên môn, còn có bạn thì lại rẽ theo hướng khác. Nói về mình thì định hướng trước đó là làm về quản trị mạng, hệ thống nên sau khi tốt nghiệp ra trường cũng rán tìm một công việc có liên quan, nhưng những ngày đầu vì kiến thức, kỹ năng, kinh nghiệm làm việc ko nhiều nên cũng ít công ty nào để ý tới, thời điểm đó cũng rải CV như phát tờ rơi :v miễn là có một công việc để làm.

Sau những tháng ngày ròng rã tìm kiếm cv, chạy đi PV như là chạy show :v cũng chỉ tìm được ở những vị trí lèn tèn như Monitor, Vận hành hệ thống, thoạt nghe thì có chút dính líu tới chuyên môn nhưng vào làm thì chẳng có gì nhiều đâu các bạn, thao tác chính chủ yếu là các phím Crl  + C + V =)), Snipping Tool, theo dõi mấy cái biểu đồ màu mè hoa lá hẹ, các dòng log error đỏ lòm, có bất thường gì thì la lên cho các sếp mà thời đó đúng nghĩ là kiếp cầm ca (làm theo ca đó các bạn =)) ), dĩ nhiên là công việc khá chán rồi nhưng cũng gọi là có công việc để kiếm cơm qua ngày là zui zui gồi.

Một khoảng thời gian sau đó mình tìm được 1 vị trí system theo đúng chuyên môn mình mong đợi, công việc trước đó khá chán nhưn bù lại  là có chút time rảnh nên mình cũng tự đào sâu kiến thức qua những bài LAB, hỏi han các bậc tiền bối đi trước mới có cơ may tìm được cv phù hợp sau này. Những chặng đường sau đó và cho đến bây giờ thì mình đều đảm nhận vị trí là 1 system admin, công việc hiện tại vẫn cho mình những niềm vui & lợi ích nhất định, đặc biệt vẫn còn đam mê với nghề cho nên cũng gọi là đang đi đúng con đường mà mình lựa chọn trước đó mặc dù cũng đã trải qua những tháng này đen tối trong sự nghiệp :v, đó là điều hiển nhiên ai cũng đã từng trải qua.

Vậy thì câu hỏi “Làm thế nào để biết mình đang đi đúng con đường”, con đường ở đây là con đường sự nghiệp( con đường lớn) nói chung và trong nghê IT nói riêng(con đường nhỏ),không ai dám chắc là mình chỉ làm một công việc đó suốt đời, có thể nghề này rồi lại nghề khác(hoàn cảnh đẩy đưa :v) nhưng nếu xét ở một phạm vi nào đó trong những ngành nghề chúng ta đã từng làm thì cái gọi là “đúng con đường” có thể hiểu là ở giai đoạn đó, nghề đó, công việc đó mang lại cho bản thân ta những niềm vui, sự thành công nhất định, một sự hưng phấn, bầu nhiệt huyết và cả sự đam mê trong công việc . IT cũng không ngoại lệ, một khi trải qua những khoảng thời gian trước đó cho đến thời điểm hiện tại trong cái nghề mà bạn đã chọn, nó không mang lại nhiều thành công cho bạn, không tạo được cho bạn hứng thú trong khi làm việc hay nói cách khác là cảm giác chán việc chán nghề thì bạn có thể cân nhắc cho mình những hướng đi, ngã rẽ mới , biết đâu được bạn lại gặt hái được nhiều thành công hơn ở những con đường mới đó thì sao.

Hãy phá vỡ mọi giới hạn của bản thân, hiện thực hóa những ý tưởng đang tồn tại trong đầu bạn,  biến điều không thể thành có thể. Chúc các bạn thành công!

No Comments on LÀM THẾ NÀO ĐỂ BIẾT MÌNH ĐANG ĐI ĐÚNG CON ĐƯỜNG
Categories: Linh tinh

HTTP LIVE STREAMING VIDEO August 25, 2017

I. Khái niệm

1. Streaming là gì ?

Streaming hay streaming media là một quá trình mà các định dạng truyền thông (như âm thanh, hình ảnh) được gửi tới người dùng và hiển thị ngay cả khi nó vẫn đang trong quá trình tải.

2. Live streaming là gì ?

+ Đây là một thuật ngữ nói về việc các nội dung, các dữ liệu media được thu lại, xử lý rồi truyền tải trực tiếp qua mạng Internet tới người nhận trong cùng một thời điểm.

+ Vì là một kỹ thuật được thực hiện theo thời gian thực, nên tùy vào từng trường hợp, từng hệ thống server mà khi nhận được dữ liệu, video chạy trên thiết bị của người dùng sẽ có độ trễ nhất định so với các tình huống thực tế đang xảy ra.
3. Streaming video hay video streaming nghĩa là gì?

Video streaming chính là một “dòng chảy” video. Các thông tin, dữ liệu của đoạn video này được luân chuyển liên tục, đều đặn từ nguồn gửi tới “đích” nào đó thông qua mạng Internet.

3.1 Streaming video các tác dụng gì?

Điểm nổi bật và rõ ràng nhất của Stream video chính là việc người dùng có thể xem các đoạn video clip, thậm chí là phim mà không cần phải download về máy, điều này tiết kiệm được rất nhiều thời gian so với trước đây.

3.2 Streaming video hoạt động thế nào?

Hình ảnh minh họa đơn giản các hoạt động của live stream

Có thể hiểu Streaming Video chính là việc chia nhỏ các file media thành từng frame, sau đó gửi những frame này vào bộ nhớ đệm của máy tính và hiển thị nội dung lần lượt của từng fame. Trong khi người dùng đang sử dụng dữ liệu của những tập tin này thì frame của những tập tin khác vẫn tiếp tục được tải về.

II. Kiến trúc tổng quan HTTP Live Streaming

Hình ảnh minh họa cho kiến trúc HTTP Streaming

1. Server component

Server sẽ yêu cầu một phương thức để mã hóa các dữ liệu media đầu vào ( audio/video), sau đó sẽ phân đoạn các dữ liệu đó thành các segment và lưu chúng dưới dạng file

Media Encoder

+ Bộ mã hóa dữ liệu media sẽ lấy các tin hiệu realtime từ thiết bị audio-video sau đó mã hóa, đóng gói và vận chuyển các data segment từ nguồn tới đích , chuẩn mã hóa phải hỗ trợ những định dạng dữ liệu từ các thiết bị phía client, ví dụ như chuẩn H.264 cho video & chuẩn HE-AAC /MP3cho audio.

+ Hiện tại đã hỗ trợ MPEG-2, một tiêu chuẩn mã hóa nén(thường được gọi tắt là chuẩn nén) trong bộ tiêu chuẩn MPEG dùng để mã hóa luồng dữ liệu hình có kết hợp với các thông tin về âm thanh. Phiên bản trước của MPEG-2 là MPEG-1. MPEG-1 được thiết kế để truyền và lưu trữ các nội dung phim ảnh có độ phân giải trung bình (576×724 điểm ảnh).

Stream Segmenter

+ Stream Segmenter là một luồng xử lý thông qua 1 stream server ( nginx hoặc third-party software), đọc các luồng stream từ mạng local và phân chia thành các tệp media có kích thước nhỏ hơn.

+ Stream Segmenter cũng tạo ra một tập tin chỉ mục có chứa tham chiếu tới các tệp tin media riêng lẻ. Mỗi lần phân đoạn hoàn thành một tệp phương tiện mới, tệp chỉ mục sẽ được cập nhật. Chỉ mục được sử dụng để theo dõi sự sẵn có và vị trí của các tệp phương tiện.

+ Các segment media được lưu dưới dạng tệp .ts (tệp luồng vận chuyển MPEG-2). Các tệp chỉ mục được lưu dưới định dạng .M3U8.

2. Distribution component

+ Distribution system có thể hiểu là một web server hoặc là một cụm web caching system (CDN) cung cấp các media files & index files cho client thông qua giao thức HTTP

3. Client Component

+ Các thiết bị phía client ( moblie/destop/browser) sẽ đọc các index files dựa trên các url được định danh bởi các stream, Index files sẽ chỉ định vị trí của các tệp media đã có sẵn. Đối với các stream được chọn , client sẽ tải xuống từng tệp media có sẵn, mỗi tệp chứa một phân đoạn liên tiếp của luồng dữ liệu. Khi đã có đủ số lượng dữ liệu đã tải về, client có thể xem nội dung hiển từ các dữ liệu đó.

III. Một số giao thức chính sử dụng trong streaming

TCP/IP

+ RTP (Real Time Transport Protocol)

Giao thức vận chuyển thời gian thực đặc tả một tiêu chuẩn định dạng gói tin dùng để truyền âm thanh và hình ảnh qua internet. Tiêu chuẩn này được khai báo trong RFC 1889. Nó được phát triển bởi nhóm Audio Video Transport Working và được ban hành lần đầu tiên vào năm 1996.

RTP và RTCP liên kết rất chặt chẽ với nhau – RTP truyền dữ liệu thực trong khi RTCP được dùng để nhận thông tin phản hồi về chất lượng dịch vụ.

+ RTSP (Real Time Streaming Protocol)

– RTSP là một giao thức ở tầng ứng dụng trong bộ các giao thức Internet (Internet Protocol Suite) để kiểm soát việc truyền dữ liệu theo thời gian thực. RTSP cung cấp một nền tảng mở rộng cho phép kiểm soát, truyền theo yêu cầu của dữ liệu thời gian thực, chẳng hạn như âm thanh và video.

RTSP được sử dụng để thiết lập và quản lý các phiên làm việc giữa các điểm truyền, phát tin đa phương tiện.

+ RTMP (Real Time Messaging Protocol)

RTMP (Real Time Messaging Protocol) là giao thức không công khai do Adobe phát triển và giữ bản quyền, được thiết kế cho ứng dụng thời gian thực, cho phép ứng dụng sử dùng video và âm thanh với tốc độ nhanh, hạn chế bị giật hình hoặc méo tiếng.

HTTP

+ Apple HLS – HTTP Live Streaming

– Là một chuẩn giao thức cho HTTP Live Streaming được phát triển bởi Apple dành cho các thiết bị iOS và Quick Time Player, hỗ trợ Android 3.0. HLS có thể triển khai trên hầu hết các máy chủ HTTP ( bao gồm cả Apache) hoặc một số máy chủ streaming thương mại như Adobe FMS và Wowza.

+ HDS – Adobe HTTP Dynamic Streaming

HTTP Dynamic Streaming được phát triển bởi Adobe như một sự thay thế cho giao thức RTMP của họ. HDS cho phép truyền trực tiếp trên HTTP tới bất kỳ thiết bị nào tương thích với Adobe Flash hoặc Air.

+ Microsoft Smooth Streaming

– Là một giao thức được phát triển bởi Microsoft dựa trên HTTP và chuẩn định dạng file mp4, bằng việc sử dụng các tài nguyên lưu trữ hiện có thông qua HTTP Caching.

+ DASH – Dynamic Adaptive Streaming over HTTP

Là một kỹ thuật streaming cho phép truyển tải các nội dung media chất lượng cao qua Internet. Tương tự như giải pháp HTTP Live Streaming (HLS) của Apple, MPEG-DASH hoạt động bằng cách chia nhỏ nội dung thành một chuỗi các phân đoạn tệp dựa trên HTTP, mỗi phân đoạn chứa một khoảng thời gian phát khác nhau

*Sự khác biệt giữa 2 giao thức HTTP và RTMP

Giao thức HTTP

Giao thức RTMP

Web server (Apache, Lighttpd, Nginx…)

Messaging server (Adobe Flash Media Server, Wowza Media Server, Red5…)

Sử dụng Web Browser

Sử dụng Flash player

Truyền văn bản thời gian ngắn (Phù hợp với web truyền thống)

Truyền dữ liệu thời gian thực/dài (Phù hợp với các file Media: Nhạc, Phim)

SOAP, XML

AMF

File .html, .js

File .swf, .as, .flv, .mp3

IV. Cài đặt & cấu hình một streaming server

1. Cài đặt Nginx và Nginx-RTMP

$ yum -y install gcc gcc-c++ make zlib-devel pcre-devel openssl-devel

$ cd /opt/source

$ wget http://nginx.org/download/nginx-1.10.1.tar.gz

$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

$ tar zxf nginx-1.10.1.tar.gz && unzip master.zip

$ cd nginx-1.10.1

$ ./configure –with-http_ssl_module –add-module=../nginx-rtmp-module-master

$ make && make install

2. Cài đặt FFmpeg

Tạo file repo /etc/yum.repos.d/dag.repo

$ vi /etc/yum.repos.d/dag.repo

Thêm nội dung sau vào file sau đó lưu lại

[dag]

name=DAG RPM Repository

baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag

gpgcheck=1

enabled=1

Để sử dụng DAG repository với công cụ yum, cần phải thêm DAG’s GPG key. Sử dụng lệnh sau để thêm GPG key cho DAG.

$ rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

Cài đặt FFmpeg

$ yum install ffmpeg ffmpeg-devel ffmpeg-libpostproc


3. Cấu hình Nginx-RTMP, FFmpeg và HLS

3.1 Cấu hình Streaming Video

Mở file cấu hình Nginx

$ vim /build/nginx/conf/nginx.conf

worker_processes auto;

events {

worker_connections 1024;

}

# RTMP configuration

rtmp {

server {

listen 1935; # Listen on standard RTMP port

chunk_size 4096;#Kích thước chunk tối đa để ghép kênh stream

#video on demand for flv files

application vod {

play /var/flvs;

}

# video on demand for mp4 files

application vod2 {

play /var/mp4s;

}

### Tạo một luồng HLS streaming là hls ###

application hls {

live on; # Bật luồng streaming “live”

record all;# Bật ghi hình video và audio streaming

record_path /streaming/rec; # Thư mục chứa các file ghi hình flv

record_suffix _recorded.flv;

record_unique on; # Khi bật chế độ này sẽ thêm thời gian vào tên các file ghi hình

meta copy; # gửi đúng bản sao dữ liệu từ nguồn tới đích

interleave on; # Chuyển đổi chế độ xen kẽ. Trong chế độ này dữ liệu âm thanh và video được truyền trên cùng một đoạn RTMP.

wait_key on; # Tạo một video stream với một khung chính

wait_video on; # Disable audio cho đến khi video frame đầu tiên được gửi đi

hls on; # Bật hls

hls_fragment_slicing aligned; # chế độ này nhằm tạo ra các fragment giống nhau trên các instance nginx khác nhau

hls_path /streaming/hls; # Thiết lập thư mục chứa HLS playlist và fragment

hls_nested on; # Bật chế độ nested. Ở chế độ này một thư mục con sẽ được tạo ra cho mỗi luồng stream. Các HLS playlist và fragment sẽ được tạo ra trong thư mục con đó

hls_fragment 10s; # Thiết lập chiều dài HLS fragment

hls_playlist_length 5m; # Thiết lập chiều dài HLS cho playlist

hls_sync 100ms; # Set ngưỡng đồng bộ hóa thời gian HLS , tính năng này giảm tình trạng nhiễu âm sau khi chuyển đổi từ độ phân giải thấp RTMP (1KHz) sang độ phân giải cao MPEG-TS (90KHz).

hls_continuous on;

hls_cleanup off; # cho phép giữ lại các segment file .ts và index file .m3u8

hls_variant _240 BANDWIDTH=220000;

hls_variant _360 BANDWIDTH=1500000;

hls_variant _480 BANDWIDTH=2110000;

hls_variant _720 BANDWIDTH=3110000;

}

#allows you to play your recordings of your live streams using a URL like “rtmp://my-ip:1935/vod/filename.flv”

application vod {

play /streaming/rec;

       }

   }

}
http {

sendfile off;

tcp_nopush on;

aio on;

directio 512;

default_type application/octet-stream;

error_log /build/nginx/logs/stream_error.log;

access_log /build/nginx/logs/stream_acess.log;

server {

listen 80;

server_name 192.168.10.2;

location /hls {

# Disable cache

add_header Cache-Control no-cache;

# CORS setup

add_header ‘Access-Control-Allow-Origin’ ‘*’ always;

add_header ‘Access-Control-Expose-Headers’ ‘Content-Length,Content-Range’;

add_header ‘Access-Control-Allow-Headers’ ‘Range’;

# allow CORS preflight requests

if ($request_method = ‘OPTIONS’) {

add_header ‘Access-Control-Allow-Origin’ ‘*’;

add_header ‘Access-Control-Allow-Headers’ ‘Range’;

add_header ‘Access-Control-Max-Age’ 1728000;

add_header ‘Content-Type’ ‘text/plain charset=UTF-8’;

add_header ‘Content-Length’ 0;

return 204;

}

# Server HLS fragments

types {

application/vnd.apple.mpegurl m3u8;

video/mp2t ts;

}

root /streaming/;

}

}

}

3.2 Cấu hình Encoding Video

Sử dụng module FFmpeg để encoding các live stream video về định dạng .flv và lưu ở thư mục /streaming/rec. Ta có thể tùy chỉnh các thông số như bitrate video, bitrate audio và độ phân giải.

Định dạng như sau: rtmp://ip-server:port/application-name/stream-name

  • -i: địa chỉ ứng dụng streaming.

  • -b: v bitrate video

  • -c: v bộ mã hóa hình ảnh

  • -s: độ phân giải

  • -f: định dạng xuất

  • -bufsize: kích thước bộ đệm

Thêm vào nội dung sau trong file nginx.conf mục application hls{} :

exec ffmpeg -i rtmp://192.168.10.2:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://192.168.10.2:1935/hls/$;

3.3 TEST luồng streaming video HLS

##Transfercode từ một stream video có dữ liệu đầu vào là chuẩn mp4 sang m3u8

$ ffmpeg -re -i rtmp://192.168.10.2/vod2/sample.mp4 -vcodec libx264 -acodec aac -f flv rtmp://192.168.10.2/hls

Các segment file .ts & index files .m3u8 được sinh ra sẽ lưu trữ vào thư mục hls chỉ định

## Tiến hành live stream từ index file

$ ffplay http://192.168.10.2/hls/index.m3u8

##Dữ liệu streaming được record lại sẽ ghi vào thư mục /streaming/rec với name file là _recorded.flv

## Bạn có thể xem lại video đã stream

$ ffplay rtmp://192.168.10.2/vod/_record.flv

***Mộ số link tham khảo ******

Hướng dẫn cài đặt Nginx RTMP Streaming

https://www.vultr.com/docs/setup-nginx-on-ubuntu-to-stream-live-hls-video

How to Live Stream Using FFmpeg

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/HTTPStreamingArchitecture/HTTPStreamingArchitecture.html

https://trac.ffmpeg.org/wiki/CompilationGuide/Centos

https://github.com/arut/nginx-rtmp-module/wiki/Directives

https://sites.google.com/site/embedded247/npcourse/tim-hieu-ky-thuat-video-streaming

 

 

1 Comment on HTTP LIVE STREAMING VIDEO
Categories: Tài liệu

[BIGDATA] Apache KafKa July 29, 2017

  1. Giới thiệu Apache Kafka

Kafka: hệ thống hàng đợi dữ liệu (message queue) phục vụ chức năng thu thập dữ liệu đầu vào (stream ingestion system).

Kafka là một hệ thống xử lý hàng đợi theo cơ chế publish-subscribe; Kafka còn hỗ trợ triển khai hệ thống thu thập log theo mô hình phân tán (distribute), phân chia (partition), và đồng bộ (replicate). Mã nguồn Kafka được thiết kế cho việc xử lý dữ liệu lớn khi đọc/ghi dữ liệu, giảm độ trễ trong quá trình truyền tải dữ liệu.

Kafka có thể hiểu là một hệ thống logging, nhằm lưu lại các trạng thái của hệ thống, nhằm phòng tránh mất thông tin.

 2. Kiến trúc tổng quan về Apache Kafka

  • Kafka lưu, phân loại message theo topics
  • Kafka sử dụng producers để publish message vào các topics ở trên
  • Kafka sử dụng consumers để subscribe vào topics, sau đó xử lý các message lấy được theo một logic nào đó
  • Kafka thường được chạy dưới dạng cluster, khi đó mỗi server trong đó sẽ được gọi là broker.

Topic

Topic có thể hiểu là một ngôn ngữ chung giữa producer (người nói) và consumer (người nghe, sử dụng).
Với mỗi topic, kafka sẽ duy trì thông qua partitioned log như dưới đây:

+ Mỗi partition là một chuỗi logcó thứ tự và không thể thay đổi (immutable).
+ Mỗi message trong partition sẽ có id tăng dần , gọi là offset
Về cách chọn partition number cho tốt, có thể tham khảo ở link : http://blog.confluent.io/2015/03/12/how-to-choose-the-number-of-topicspartitions-in-a-kafka-cluster/

+ Kafka cluster sẽ lưu lại mọi message đã được published, cho dù message đó đã được/chưa được sử dụng (consume). Thời gian lưu message có thể tuỳ chỉnh được thông qua log retention.

Một điểm thú vị là Consumer sẽ điều khiển những gì mình muốn đọc thông qua offset của message, hay thậm chí là thứ tự đọc. Consumer có thể reset lại vị trí của offset để re-process lại một vài message nào đó.

Producer

Như đã nói ở trên, producer nhằm mục đích chính là ném message vào topic. Cụ thể hơn là producer có nhiệm vụ là chọn message nào, để ném vào partition nào trong topic. Nhiệm vụ này rất quan trọng, giúp cho kafka có khả năng “scale” tốt.

Consumer

Thông thường thì một hệ thống messaging sẽ có 2 loại

  • Queue: Một message sẽ được xử lý bởi một consumer
  • Pub/Sub: Một message sẽ được xử lý bởi một vài consumer thích hợp, tuỳ theo topic

Ở kafka chúng ta có một khái niệm gọi là consumer group giúp chúng ta có thể làm được đồng thời cả 2 loại trên, rất thú vị. Việc subscribe một topic sẽ được thực hiện bởi consumer group. Mỗi một message sẽ được gửi cho duy nhất  một consumer instance trong một consumer group. Việc này dấn đến điều gì?

  • Nếu nhiều instance consumer có cùng group: chúng ta sẽ có một hệ thống queue
  • Nếu mỗi instance là một group, chúng ta sẽ có một hệ thống pub/sub

Kafka đảm bảo

  • Message được gửi bởi producer đến một topic partition nào đó sẽ được đảm bảo thứ tự , thông qua offset
  • Consumer instance sẽ nhìn thấy  message theo đúng thứ tự trong log

3. So sánh apache kafka với rabbitMQ

RabbitMQ
What it is? RabbitMQ is a solid, mature, general purpose message broker that supports several standardized protocols such as AMQP Apache Kafka is a message bus optimized for high-ingress data streams and replay
Primary use High-throughput and reliable background jobs, communication and integration within, and between applications. Build applications that process and re-process streamed data on disk
License Open Source: Mozilla Public License Open Source: Apache License 2.0
Written in Erlang Scala (JVM)
Client libraries Many mature libraries, including: Ruby, Python, Node.js, Clojure, Go, Java and C Many, including: Ruby, Python, Node.js and Java
Support for HA Yes Yes
Federated queues Yes No
Complex routing scenarios Yes No
Scaling strategies Mostly vertical Built from the ground up with horizontal scaling in mind
Hosted solution & Enterprise Support Available from CloudAMQP Available fromCloudKarafka

4. Cài đặt & cấu hình:

Có thể tham khảo document bên dưới

  • https://www.dropbox.com/s/9omnnckwiqeq6sd/KAFKA.docx?dl=0

5. Một số site tham khảo về các vấn đề Apache Kafka

  • https://dzone.com/articles/understanding-kafka-consumer-groups-and-consumer-l
  • https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Controller+Internals
  • https://anturis.com/blog/apache-kafka-an-essential-overview/
  • http://codingpearls.com/big-data/apache-spark/xay-dung-mot-realtime-dashboard-su-dung-spark-streaming-kafka-nodejs-va-mongodb.html

 

 

No Comments on [BIGDATA] Apache KafKa
Categories: Tài liệu

[BIGDATA] Apache SPARK

1.Giới thiệu về Apache Spark

   + Apache Spark là một framework mã nguồn mở tính toán cụm, được phát triển sơ khởi vào năm 2009 bởi AMPLab . Sau này, Spark đã được trao cho Apache Software Foundation vào năm 2013 và được phát triển cho đến nay.

+ Tốc độ xử lý của Spark có được do việc tính toán được thực hiện cùng lúc trên nhiều máy khác nhau. Đồng thời việc tính toán được thực hiện ở bộ nhớ trong (in-memories) hay thực hiện hoàn toàn trên RAM.

+ Spark cho phép xử lý dữ liệu theo thời gian thực, vừa nhận dữ liệu từ các nguồn khác nhau đồng thời thực hiện ngay việc xử lý trên dữ liệu vừa nhận được ( Spark Streaming).

+ Spark không có hệ thống file của riêng mình, nó sử dụng hệ thống file khác như: HDFS, Cassandra, S3,…. Spark hỗ trợ nhiều kiểu định dạng file khác nhau (text, csv, json…) đồng thời nó hoàn toàn không phụ thuộc vào bất cứ một hệ thống file nào.

 

+ Spark cho phép xây dựng và phân tích nhanh các mô hình dự đoán. Hơn nữa, nó còn cung cấp khả năng truy xuất toàn bộ dữ liệu cùng lúc, nhờ vậy ta không cần phải lấy mẫu dữ liệu – đòi hỏi bởi các ngôn ngữ lập trình như R. Thêm vào đó, Spark còn cung cấp tính năng streaming, được dùng để xây dựng các mô hình real-time bằng cách nạp toàn bộ dữ liệu vào bộ nhớ.

+ Khi có một tác vụ nào đó quá lớn mà không thể xử lý trên một laptop hay một server, Spark cho phép ta phân chia tác vụ này thành những phần dễ quản lý hơn. Sau đó, Spark sẽ chạy các tác vụ này trong bộ nhớ, trên các cluster của nhiều server khác nhau để khai thác tốc độ truy xuất nhanh từ RAM. Spark sử dụng API Resilient Distributed Dataset (RDD) để xử lý dữ liệu.

2. Kiến trúc Apache Spark

+ Spark có kiến trúc gồm một node master và nhiều node worker dưới sự điều khiển của  master. Spark Driver sẽ  liên hệ với master node để điều phối các worker node nơi có chứa các excutor đang thực thi job.

+ Master node chứa chương trình điều khiển (Spark Standalone / YARN/ MESSO), các worker node, chương trình lập lịch sẽ chịu trách nhiệm lập lịch cho các tác vụ và yêu cầu các worker node thực hiện. Mỗi worker bao gồm một hoặc một số Excutor thực hiện việc lưu trữ, đọc ghi khi xử lý dữ liệu. Mỗi excutor chịu trách nhiệm xử lý các task nhỏ riêng biệt bằng các luồng độc lập.

3. Quản lý bộ nhớ của Apache Spark

+ Xét về khía cạnh memory, Spark giải quyết các vấn đề vấn đề xung quanh định nghĩa Resilient Distributed Datasets (RDDs). RDDs hỗ trợ hai kiểu thao tác thao tác: transformations và action..Thao tác chuyển đổi(tranformation) tạo ra dataset từ dữ liệu có sẵn. Thao tác actions trả về giá trị cho chương trình điều khiển (driver program) sau khi thực hiện tính toán trên dataset.

+ Spark thực hiện đưa các thao tác RDD chuyển đổi vào DAG (Directed Acyclic Graph) và bắt đầu thực hiện. Khi một action được gọi trên RDD, Spark sẽ tạo DAG và chuyển cho DAG scheduler. DAG scheduler chia các thao tác thành các nhóm (stage) khác nhau của các task.

+ Mỗi Stage bao gồm các task dựa trên phân vùng của dữ liệu đầu vào có thể pipline với nhau và có thể thực hiện một cách độc lập trên một máy worker. DAG scheduler sắp xếp các thao tác phù hợp với quá trình thực hiện theo thời gian sao cho tối ưu nhất.

Ví dụ: các thao tác map sẽ được đưa vào cùng một stage do không xảy ra shuffle dữ liệu giữa các stage. Kết quả cuối cùng của DAG scheduler là một tập các stage. Các Stages được chuyển cho Task Scheduler. Task Scheduler sẽ chạy các task thông qua cluster manager (Spark Standalone/Yarn/Mesos). Task scheduler không biết về sự phụ thuộc của các stages. Nó chỉ chịu trách nhiệm thực hiện sắp xếp các task một cách tối ưu nhất.

+ Mỗi Worker bao gồm một hoặc nhiều Excutor. Các excutor chịu trách nhiệm thực hiện các task trên các luồng riêng biệt. Việc chia nhỏ các task giúp đem lại hiệu năng cao hơn, giảm thiểu ảnh hưởng của dữ liệu không đối xứng (kích thước các file không đồng đều).

4. Thành phần của Apache Spark

Thành phần trung gian của Spark là Spark Core: cung cấp những chức năng cơ bản nhất của Spark như lập lịch cho các tác vụ, quản lý bộ nhớ, fault recovery, tương tác với các hệ thống lưu trữ…Đặc biệt, Spark Core cung cấp API để định nghĩa RDD (Resilient Distributed DataSet) là tập hợp của các item được phân tán trên các node của cluster và có thể được xử lý song song.

Spark có thể chạy trên nhiều loại Cluster Managers như Hadoop YARN, Apache Mesos hoặc trên chính cluster manager được cung cấp bởi Spark được gọi là Standalone Scheduler.

  • Spark SQL cho phép truy vấn dữ liệu cấu trúc qua các câu lệnh SQL. Spark SQL có thể thao tác với nhiều nguồn dữ liệu như Hive tables, Parquet, và JSON.
  • Spark Streaming cung cấp API để dễ dàng xử lý dữ liệu stream,
  • MLlib Cung cấp rất nhiều thuật toán của học máy như: classification, regression, clustering, collaborative filtering…
  • GraphX là thư viện để xử lý đồ thị.
  • Một trong những lý do khiến Spark chạy nhanh hơn Hadoop MapReduce đó là ở mỗi tác vụ dữ liệu được nạp lên bộ nhớ và xử lý ở đó, những tác vụ sau có thể sử dụng dữ liệu nằm trên bộ nhớ thay vì phải đọc ghi liên tục vào HDFS như Hadoop MapReduce (xem minh họa phía dưới)

 Hadoop MapReduce

Spark

5.Tại sao nên sử dụng Apache Spark

  Những tính năng nổi bật

  • “Spark as a Service”: Giao diện REST để quản lí (submit, start, stop, xem trạng thái) spark job, spark context
  • Tăng tốc, giảm độ trễ thực thi job xuống mức chỉ tính bằng giây bằng cách tạo sẵn spark context cho các job dùng chung.
  • Stop job đang chạy bằng cách stop spark context
  • Bỏ bước upload gói jar lúc start job làm cho job được start nhanh hơn.
  • Cung cấp hai cơ chế chạy job đồng bộ và bất đồng bộ
  • Cho phép cache RDD theo tên , tăng tính chia sẻ và sử dụng lại RDD giữa các job
  • Hỗ trợ viết spark job bằng cú pháp SQL
  • Dễ dàng tích hợp với các công cụ báo cáo như: Business Intelligence, Analytics, Data Integration Tools

     Nhờ triển khai Coordination Framework Apache ZooKeeper – cung cấp giải pháp quản lý, điều phối giao tiếp giữa các hệ thống phân tán (distributed systems) – mà Spark Server được đảm bảo tính sẵn sàng (high availability) theo mô hình active – active (load-balancing)

  Những điểm sáng giá ngoài tốc độ tính toán nhanh của Spark

     Sự đơn giản: Một trong những chỉ trích thường gặp ở Hadoop đó là sự phức tạp trong qúa trình phát triển, mặc dù đây là một trong những phương pháp tính toán đơn gỉan và hiệu qủa gíup tăng tốc độ xử lý của hệ thống. Thay vì đòi hỏi người dùng phải hiểu rạch ròi về MapReduce và lập trình Java, Spark sinh ra để gíup mọi người tiếp cận với công nghệ tính toán song song dễ dàng hơn rất nhiều. Người dùng chỉ cần một vài kiến thức cơ bản về database cộng với lập trình Python hay Scala là có thể sử dụng được.

     Độc lập với các nhà cung cấp dịch vụ Hadoop: Hầu hết các nhà cung cấp dịch vụ Hadoop đều hỗ trợ Spark. Điều này có nghĩa Spark không phụ thuộc vào các nhà cung cấp này. Nếu bạn muốn thay đổi nhà cung cấp dịch vụ, ta chỉ cần đem hệ thống Spark qua nhà cung cấp mới mà không lo ngại việc mất mát thông tin.

+ Theo một so sánh, năm 2013 Hadoop sử dụng cluster bao gồm 2100 máymất 72 phút để sắp xếp 100 TB dữ liệu, trong khi Spark cần số lượng máy bằng 1/10 nhưng sắp xếp chỉ mất 23 phút. Trong nhiều trường hợp Spark có thể chạy nhanh hơn từ 30-50 lần so với Hadoop MapReduce.

Để thấy được bức tranh toàn cảnh về Spark, hãy cùng xem một số thống kê:

+ Trong các thư viện mà Spark cung cấp thì có 69% người dùng Spark SQL, 62% sử dụng DataFrames, Spark Streaming và MLlib + GraphX là 58%

Lập trình viên có thể viết các ứng dụng Spark bằng nhiều ngôn ngữ khác nhau. Năm 2014, 84% người dùng sử dụng Scala, trong khi Java và Python cùng là 38% (Người dùng có thể sử dụng nhiều hơn 1 ngôn ngữ trong các ứng dụng của mình). Đến năm 2015, Spark hỗ trợ thêm ngôn ngữ R, rất nhanh chóng có tới 18% người dùng R, Python cũng tăng lên 58%.

Năm 2015, Spark trở thành dự án mã nguồn mở sôi động nhất trong lĩnh vực dữ liệu lớn khi thường xuyên được cập nhật bởi hơn 800 lập trình viên từ 200 công ty trên khắp thế giới.

6. Một vài thống kê thú vị

  • 62% số người khảo sát dùng Spark với HDFS, 46% sử dụng với các hệ quản trị CSDL như Cassandra, HBase, Hive, Tachyon, 41% đang sử dụng với Kafka, và 29% đang sử dụng cùng Amazon S3.
  • Đối với hệ quản trị cluster, 56% đang chạy độc lập Spark, 42% sử dụng YARN, và 26% sử dụng Apache Mesos.
  • Đối với ngôn ngữ lập trình, 88% sử dụng Scala, 44% sử dụng Java, và 22% sử dụng Python.
  • Mức độ quan tâm của doanh nghiệp về Spark: 91% về tốc độ tính toán, 77% về việc dễ lập trình, 71% về việc dễ phát triển, 64% về các công cụ phân tích dữ liệu tiên tiến, 52% về real-time streaming.
  • Sử dụng Spark trên 206 hệ thống EC2 để sắp xếp 100TB dữ liệu chỉ tốn 23 phút. Trong khi đó, kỉ lục trước đây trên Hadoop sử dụng MapReduce trên 2,100 máy tính phải tiêu tốn 72 phút. Điều này có nghĩa rằng Spark sắp xếp dữ liệu nhanh gấp 3 lần Hadoop mà chỉ sử dụng ít hơn 10 lần số máy tính.

7. Một số hình ảnh tổng quan về hệ sinh thái BigData

8.Một số site tham khảo về Spark & cách cài đặt, triển khai.

  • https://tech.fpt.com.vn/apache-spark-nhan-to-cong-nghe-moi-trong-cuoc-cach-mang-du-lieu-lon/
  • http://datastrophic.io/core-concepts-architecture-and-internals-of-apache-spark/
  • http://backtobazics.com/big-data/6-steps-to-setup-apache-spark-1-0-1-multi-node-cluster-on-centos/
  • http://davidssysadminnotes.blogspot.com/2016/01/installing-spark-centos-7.html
  • https://mapr.com/blog/performance-tuning-apache-kafkaspark-streaming-system/
  • https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-tuning.html
  • http://codingpearls.com/big-data/apache-spark/cai-dat-apache-spark-cluster-tren-he-dieu-hanh-linux-ubuntu.html

 

No Comments on [BIGDATA] Apache SPARK
Categories: Tài liệu

[BigData] Hadoop July 27, 2017

    + Hadoop là một Apache framework mã nguồn mở được viết bằng java, cho phép xử lý phân tán (distributed processing).
    + Ý tưởng chính của Hadoop là việc chia nhỏ và lưu dữ liệu ở trên một nhóm nhiều máy tính, và khi muốn thao tác với dữ liệu chúng ta sẽ xử lý    ngay trên máy mà dữ liệu đó được lưu trữ, giúp tiết kiệm thời gian lấy dữ liệu ở nơi khác. Ngoài ra cấu trúc của Hadoop cũng giúp việc Scale hệ thống theo chiều ngang (Horizontal Scaling) trở nên dễ dàng.

2> Kiến trúc Hadoop

Hadoop framework gồm 4 module:

  • Hadoop Common: Đây là các thư viện và tiện ích cần thiết của Java để các module khác sử dụng. Những thư viện này cung cấp hệ thống file và lớp OS trừu tượng, đồng thời chứa các mã lệnh Java để khởi động Hadoop.
  • Hadoop YARN: Đây là framework để quản lý tiến trình và tài nguyên của các cluster.
  • Hadoop Distributed File System (HDFS): Đây là hệ thống file phân tán cung cấp truy cập thông lượng cao cho ứng dụng khai thác dữ liệu.
  • Hadoop MapReduce: Đây là hệ thống dựa trên YARN dùng để xử lý song song các tập dữ liệu lớn.

Có thể sử dụng sơ đồ sau để mô tả bốn thành phần có trong Hadoop framework:

 2.1 MapReduce

Hadoop MapReduce là một framework dùng để viết các ứng dụng xử lý song song một lượng lớn dữ liệu có khả năng chịu lỗi cao, xuyên suốt hàng ngàn cụm máy tính.

Thuật ngữ MapReduce liên quan đến hai tác vụ mà chương trình Hadoop thực hiện:

  • Map: đây là tác vụ đầu tiên, trong đó dữ liệu đầu vào được chuyển đổi thành tập dữ liệu theo cặp key/value.
  • Reduce: tác vụ này nhận kết quả đầu ra từ tác vụ Map, kết hợp dữ liệu lại với nhau thành tập dữ liệu nhỏ hơn.

Thông thường, kết quả input và output được lưu trong hệ thống file. Framework này sẽ tự động quản lý, theo dõi và tái thực thi các tác vụ bị lỗi.

MapReduce framework gồm một single master JobTracker và các slave  TaskTracker trên mỗi cluster-node. Master có nhiệm vụ quản lý tài   nguyên, theo dõi quá trình sử dụng tài nguyên và lập lịch quản lý các tác vụ trên slave , theo dõi chúng và thực thi lại các tác vụ bị lỗi. Những máy slave TaskTracker thực thi các tác vụ được master chỉ định và cung cấp thông tin trạng thái tác vụ (task-status) để master theo dõi.

JobTracker là một điểm yếu của Hadoop Mapreduce. Nếu JobTracker bị lỗi thì mọi công việc liên quan sẽ bị ngắt quãng.

  2.2 HDFS (Hadoop Distributed File System)

+ Hadoop có thể làm việc trực tiếp với bất kì hệ thống dữ liệu phân tán như Local FS, HFTP FS, S3 FS, và các hệ thống khác. Nhưng hệ thống   file thường được dùng bởi Hadoop là Hadoop Distributed File System (HDFS).

+ Hadoop Distributed File System (HDFS) dựa trên Google File System (GFS), cung cấp một hệ thống dữ liệu phân tán, được thiết kế để chạy trên các cụm máy tính lớn (gồm hàng ngàn máy tính) có khả năng chịu lỗi cao.

+ HDFS sử dụng kiến trúc master/slave, trong đó master gồm một NameNode để quản lý hệ thống file metadata và một hay nhiều slave DataNodes để lưu trữ dữ liệu thực tại.

Một tập tin với định dạng HDFS được chia thành nhiều block và những block này được lưu trữ trong một tập các DataNodes. NameNode định nghĩa ánh xạ từ các block đến các DataNode. Các DataNode điều hành các tác vụ đọc và ghi dữ liệu lên hệ thống file. Chúng cũng quản lý việc tạo, huỷ, và nhân rộng các block thông qua các chỉ thị từ NameNode.

HDFS cũng hỗ trợ các câu lệnh shell để tương tác với tập tin như các hệ thống file khác.

3. Hadoop hoạt động như thế nào?

Giai đoạn 1

Một user hay một ứng dụng có thể submit một job lên Hadoop (hadoop job client) với yêu cầu xử lý cùng các thông tin cơ bản:

  1. Nơi lưu (location) dữ liệu input, output trên hệ thống dữ liệu phân tán.
  2. Các java class ở định dạng jar chứa các dòng lệnh thực thi các hàm map và reduce.
  3. Các thiết lập cụ thể liên quan đến job thông qua các thông số truyền vào.

Giai đoạn 2

Hadoop job client submit job (file jar, file thực thi) và các thiết lập cho JobTracker. Sau đó, master sẽ phân phối tác vụ đến các máy slave để theo dõi và quản lý tiến trình các máy này, đồng thời cung cấp thông tin về tình trạng và chẩn đoán liên quan đến job-client.

Giai đoạn 3

TaskTrackers trên các node khác nhau thực thi tác vụ MapReduce và trả về kết quả output được lưu trong hệ thống file.

4. Ưu điểm của Hadoop

  • Hadoop framework cho phép người dùng nhanh chóng viết và kiểm tra các hệ thống phân tán. Đây là cách hiệu quả cho phép phân phối dữ liệu và công việc xuyên suốt các máy trạm nhờ vào cơ chế xử lý song song của các lõi CPU.
  • Hadoop không dựa vào cơ chế chịu lỗi của phần cứng fault-tolerance and high availability (FTHA), thay vì vậy bản thân Hadoop có các thư viện được thiết kế để phát hiện và xử lý các lỗi ở lớp ứng dụng.
  • Các server có thể được thêm vào hoặc gỡ bỏ từ cluster một cách linh hoạt và vẫn hoạt động mà không bị ngắt quãng.
  • Một lợi thế lớn của Hadoop ngoài mã nguồn mở đó là khả năng tương thích trên tất cả các nền tảng do được phát triển trên Java.

Một số site tham khảo về hadoop:

https://ongxuanhong.wordpress.com/2015/11/15/top-free-hadoop-tutorials/

https://ongxuanhong.wordpress.com/2015/08/17/nen-chon-hadoop-hay-spark-cho-he-thong-big-data/

http://saphanatutorial.com/hadoop-1-0-vs-hadoop-2-0/

http://phamquan.com/big-data/big-data-co-ban

http://www.corejavaguru.com/bigdata/index

How to Install and Configure Apache Hadoop on a Single Node in CentOS 7

https://www.edureka.co/blog/install-hadoop-single-node-hadoop-cluster

No Comments on [BigData] Hadoop
Categories: Tài liệu

Chuyện đời chuyện nghề của 1 system cùi bắp long dong ở nhiều cty :v July 16, 2017

Trong cái nghề SE/SO/SA mỗi anh em sẽ có những trải nghiệm khác nhau, những cách đánh giá khác nhau trong công việc mình đang làm, môi trường mình đang công tác, riêng đối với bản thân mình mặc dù là số năm kinh nghiệm xông pha trận mạc trong nghề này chưa gì là ghê gớm những cũng đã nhảy nhót qua 4-5 công ty, có tháng move 2-3 công ty.

Nghe đến đây chắc hẳn nhìn vào ai cũng có một cách nhìn riêng, có thể có người cho mình không chịu khó, không kiên trì trong công việc thấy khó là nản, có người đồng cảm hơn thì nghĩ chắc vì lí do nào đó mới off, thật sự mà nói khi lần đầu bước vào một công ty ta cũng không hề biết trước điều gì sẽ chờ ta ở đó, có thể mình đã tìm hiểu trước về công ty đó (chính sách, môi trường, công việc ….) qua bạn bè làm ở đó, qua các trang tin, qua sự PR của HR :v để có một niềm tin nhất định, ai cũng mong muốn một chỗ làm ổn định, salary ổn ổn, môi trường good, blabla các thứ.

Ok! Sau khi đã join vào một time, công việc lúc đầu suôn sẻ, môi trường ko đến nổi, nhân viên thân thiện,…. Thời điểm này bản thân sẽ thấy thoải mái và nghĩ có thể nơi đây là bến đỗ hợp lý bản thân không phải nghĩ ngợi gì nhiều chỉ cố gắng làm và làm. Thế rồi những time sau đó dự án nhiều kéo theo việc nhiều, time OT ngày càng tăng, khối lượng công việc càng lớn, sếp dí deadline, có những việc bản thân không biết phải xử lý( có thể còn gà quá mò hoài ko ra, tìm kiếm sự support cũng hạn chế), cho đến thời điểm gần deadline lại cuống lên thế là xì trét, áp lực tình trạng này kéo dài vài tháng  thế là chịu không thấu xin off ( lúc này đã tìm đường binh đến một chỗ khác) => đây có thể hiểu tùy vào năng lực + suy nghĩ của mỗi người ( nếu gặp người chuyên môn tốt, kinh nghiệm xử lý qua nhiều thì chuyện này chả là gì nhưng đối với mấy kẻ gà gà nếu công việc chỉ đơn độc xử lý 1 mình ko nhận được sự support thì rất dễ bức tóc :v & ra đi).

Sau khi off cty đầu tiên và qua cty tiếp theo gặp phải môi trường  Nhật thấy xưa giờ chưa quen kiểu làm việc khắt khe thế cảm thấy ngộp và lại off , rồi tiếp nối những tháng ngày đen tối đến một bến đỗ khác, ở môi trường này được cái time làm việc cũng dễ thở, không phải bị ép deadline nhưng giai đoạn đầu là thế,vào các time sau đó hệ thống lỗi triền miên, bản thân là ôm đồm nhiều thứ từ hệ thống Core đến hệ thống Game, kiêm luôn cả các việc lặt vặt khác mà lead vs sếp sai bảo, đỉnh điểm là hầu như trong 1 tháng tuần nào cũng OT, cuối tuần cũng phải OT, có hôm làm gần 24 tiếng, ngày ngày lên cty cũng bị ăn hành + ăn chửi từ lead, lúc làm việc thì ngồi cạnh bên giám sát, soi xét từng thao tác :v, những ngày dài sau đó chỉ suốt ngày là debug, fix lỗi, nghe chửi, nghe giáo huấn các kiểu :v

=> Lần này em nó off vì không hợp với cách làm việc với lead, không có một không gian + môi trường làm việc thoải mái.

Túm váy lại thì chuyện ở hay đi ở một công ty nó có nhiều yếu tố, mỗi môi trường có mỗi văn hóa vs quy trình làm việc khác nhau, quan trọng là bản thân có hòa hợp được vào môi trường đó hay không, cố gắng cố gắng trong công việc không là chưa đủ, có những thứ khi bạn join vào môi trường đó mới tường tận cảm nhận được, chẳng ai là  không muốn tìm được một môi trường tốt nhưng việc ra đi hay ở lại nó đến từ cả chính sự cố gắng của bạn + môi trường bạn đang làm, trải nghiệm nhiều công ty bản thân mình nghiệm ra ở môi trường nào cũng sẽ có cái mặt trái của nó, không nới nào đáp ứng hết được các mong muốn của bạn cùng lúc, được này sẽ mất kia (nhưng  được vs mất bản thân chấp nhận được) nhưng trước tiên bản thân bạn phải nổ lực hết mình việc còn lại để cty lo, lo không xong thì lúc đấy bạn biết phải làm gì rồi đấy :v.

No Comments on Chuyện đời chuyện nghề của 1 system cùi bắp long dong ở nhiều cty :v
Categories: Chuyện nghề