Lab: Load dữ liệu từ MongoDB trong Docker container

Với số lượng data connector phong phú, QlikView và Qlik Sense có thể kết nối và trích xuất dữ liệu từ hầu hết các hệ thống nghiệp vụ. Riêng với database, như trình bày trong bài viết Load dữ liệu từ database với Qlik ODBC Connector Package, Qlik Sense cung cấp khả năng kết nối trực tiếp với 17 loại database thông dụng (tính đến thời điểm viết bài) chỉ với cài đặt mặc định.

Với người học Qlik Sense, việc trải nghiệm và dùng thử các data connector có một trở ngại đáng kể: không có sẵn các database. Trừ khi bạn làm việc trong môi trường doanh nghiệp có sẵn các test database, bạn sẽ phải tự giả lập database cho riêng mình trong các bài lab. Nếu bạn chỉ có một máy tính cá nhân với Qlik Sense Desktop, sẽ có rất nhiều việc phải làm: cài phần mềm máy ảo như VirtualBox, tạo máy ảo, cài đặt và cấu hình database, cấu hình virtual network giữa máy thật và máy ảo, v.v. Nói chung là một quá trình đòi hỏi nhiều công sức và dễ sai sót.

Thật may mắn là với sự tiến bộ của công nghệ ảo hóa sử dụng container trong thời gian gần đây, bạn hoàn toàn có thể tạo nhanh một database chỉ với vài dòng lệnh đơn giản. Trong bài viết hôm nay, chúng ta sẽ thử xây dựng cơ sở dữ liệu MongoDB chạy trên một Docker container để thực hành sử dụng MongoDB connector trong Qlik Sense.

Docker là gì?

Docker là một công nghệ ảo hóa thế hệ mới sử dụng “container” thay vì máy ảo (virtual machine) như các phần mềm ảo hóa truyền thống. Với cách hiểu đơn giản nhất, bạn cũng có thể xem container là một loại máy ảo. Tuy nhiên, thay vì được cài đặt một hệ điều hành riêng như một máy tính hoàn chỉnh, container sử dụng chung tài nguyên hệ thống và tập lệnh hệ điều hành (OS kernel) với máy chủ. Vì vậy, các container thường rất nhẹ (vì không phải chứa hệ điều hành riêng), khởi động nhanh và chiếm dụng ít tài nguyên của máy chủ trong quá trình hoạt động.

Một lợi điểm đáng kể khác của container là nó được định nghĩa và đóng gói sẵn trong một file ảnh (image), bao gồm tất cả các phụ thuộc (dependency) mà phần mềm trong container yêu cầu. Vì vậy, khi cần triển khai nhanh một phần mềm như MongoDB, bạn có thê tải image tương ứng từ Docker Hub và tạo container từ image trong 1 câu lệnh duy nhất. Sau khi tạo, bạn có thể sử dụng container ngay lập tức mà không cần quan tâm đến việc cấu hình và cài đặt các thư viện cần thiết.

Do phạm vi hạn hẹp của bài viết, chúng ta sẽ không đi sâu vào các khái niệm chi tiết của Docker. Bạn có thể tham khảo thêm các tài liệu về Docker từ internet như website sau https://viblo.asia/p/docker-la-gi-va-lam-gi-gGJ592RGKX2

Lab: Load dữ liệu từ MongoDB trong Docker

Giao tiếp giữa Qlik Sense Desktop và các Docker được mô tả trong hình dưới đây. Qlik Sense Desktop và Docker được cài đặt trên cùng một máy tính cá nhân. Các database container (trong bài lab này là MongoDB, hoàn toàn tương tự với các database container khác) được cấu hình port binding để lắng nghe kết nối trên địa chỉ loopback (localhost) của máy chủ. ODBC Connector Package trong Qlik Sense tạo kết nối đến các database container qua localhost trên port tương ứng.

Yêu cầu phần mềm cho bài lab:

  • Qlik Sense Desktop phiên bản April 2019
  • Robo 3T (công cụ MongoDB client miễn phí, download tại https://robomongo.org/download). Việc cài đặt rất đơn giản, chỉ cần theo các bước trong installation wizard
  • Docker for Windows

P1. Cài đặt Docker for Windows

1. Download at Docker Desktop Installer.exe tại địa chỉ https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

2. Chạy file cài đặt với quyền Administrator. Theo các bước trong installation wizard với một số lưu ý sau:

  • Bỏ chọn “Use Windows container”
  • Cho phép Docker chạy Hyper-V khi được yêu cầu
  • Khởi động lại máy tính khi cài đặt hoàn tất

3. Sau khi cài đặt, mở “Turn Windows features on or off” từ start menu. Đảm bảo tính năng Hyper-V is đã được bật.

4. Chạy ứng dụng Docker Desktop for Windows. Chú ý biểu tượng Docker với thông báo “Docker Desktop is running” trong Windows task bar

5. Mở Windows Powershell, chạy câu lệnh sau:

docker version

Nếu Docker được cài đặt đúng, câu lệnh sẽ trả về phiên bản hiện tại của Docker

Nếu bạn gặp vấn đề trong quá trình cài đặt, kiểm tra hướng dẫn cài đặt tại địa chỉ https://docs.docker.com/docker-for-windows/install/

P2. Tạo MongoDB container

1. Tạo MongoDB container với câu lệnh sau (không ngắt dòng):

docker run -d --name mongotest -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=mongo mongo

Giải thích sơ lược câu lệnh như sau:

  • Lệnh docker run … mongo sẽ tạo một container từ image tên mongo. Trong lần đầu chạy lệnh này, Docker sẽ tự động tìm kiếm và tải về image mongo từ Docker Hub. Những lần chạy sau, Docker sẽ tạo container từ bản lưu của image đã có sẵn trong máy tính của bạn
  • Các tham số:
    • -d (–detach): Docker để container chạy background, không khóa command line để bạn có thể thao tác tiếp với các câu lệnh khác. Nếu không có option này, Power Shell hiện tại của bạn sẽ bị khóa đến khi container chạy xong
    • –name: Tên container
    • -p (–publish) : map port 27017 (port mặc định của MongoDB) trên container với port 27107 trên máy tính cá nhân của bạn. Nhờ tham số này, Docker có thể chuyển tiếp các yêu cầu từ Qlik Sense Desktop qua port 27017 trên máy chủ đến port 27107 trên MongoDB container và ngược lại.
    • -e (–env): Khởi tạo biến môi trường (environment variable) khi tạo container. Ở đây ta dùng 2 biến môi trường để lưu giữ username và password mặc định của MongoDB

2. Nếu câu lệnh trên trả về lỗi tương tự như “Error response from daemon: driver failed programming external connectivity”, bạn có thể right click biểu tượng Docker Desktop trong task bar > Restart… Chờ Docker khởi động lại và thử lại câu lệnh

3. Kiểm tra xem container có đang chạy hay không bằng lệnh sau:

docker container ps -a

4. Đảm bảo port binding hoạt động đúng bằng cách kiểm tra xem có process nào đang lắng nghe trên port 27107 trên máy tính của bạn không:

netstat -noa | findstr "27017"

P3. Insert dữ liệu vào MongoDB

1. Tải file ChicagoTaxiTrips.json tại đây và lưu vào một folder trên máy tính của bạn, ví dụ C:\Temp\Docker

2. Copy file json từ máy tính vào container:

docker cp "C:\Temp\Docker\ChicagoTaxiTrips.json" mongotest:/

3. Log in vào bash shell của MongoDB container:

docker exec -it mongotest /bin/bash

Với câu lệnh docker exec -it, con trỏ của console sẽ chuyển từ Powershell vào bash shell của container. Câu lệnh tiếp theo bạn nhập vào sẽ được xử lý bởi container thay vì Windows.

4. Kiểm tra xem file json đã được copy vào container chưa:

ls -la

5. Vẫn ở trong bash shell của container, import file JSON vào MongoDB với câu lệnh sau (không ngắt dòng):

mongoimport -u "mongoadmin" -p "mongo" --authenticationDatabase "admin" --db TestDB --collection taxi --type json --file ChicagoTaxiTrips.json

Câu lệnh trên import các json object từ file ChicagoTaxiTrips.json vào collection tên “taxi” thuộc database “TestDB”. Mỗi json object sẽ tạo thành 1 document trong MongoDB (có thể xem collection và document trong MongoDB tương ứng với table và row trong database truyền thống).

6. Thoát khỏi bash shell của container bằng lệnh exit

exit

7. Kiểm tra dữ liệu đã được import vào MongoDB từ Robo 3T (xem mục “Yêu cầu phần mềm” ở trên):

  • Mở Robo 3T > File > Connect…
  • Click Create a connection. Trong cửa sổ Connection Settings:
    • Tab Connection:
      • Name: tên tùy ý, ví dụ LocalContainer
      • Address: localhost:27017 (nhập hostname và port trong 2 text box riêng)
    • Tab Authentication:
      • Đánh dấu chọn “Perform authentication”
      • User Name: mongoadmin
      • Password: mongo
    • Click Test, đảm bảo kết nối với MongoDB thành công như hình dưới. Click Save

  • Trong thanh định vị bên trái, click mở rộng tên connection > TestDBCollections (1) > double click taxi. Đây là collection chứa các json document mà bạn vừa import. Expand thử 1 document, bạn sẽ thấy nó chứa các field dữ liệu và giá trị tương ứng:

P4. Load dữ liệu từ MongoDB vào Qlik Sense

Như vậy chúng ta đã có một MongoDB database chạy trên Docker container, chứa một collection tên taxi với 14,000 document. Tiếp theo chúng ta sẽ thử load dữ liệu từ MongoDB vào Qlik Sense.

1. Mở Qlik Sense Desktop và tạo một app mới.

2. Mở Data Load Editor > Create new connection > MongoDB (Beta). Tạo một MongoDB connector với các tham số sau:

  • Name: tùy ý
  • Server: localhost
  • Port: 27017
  • Authentication Mechanism: MongoDB User Name and Password
  • User Name: mongoadmin
  • Password: mongo

Click “Test connection”, Qlik Sense hiện thông báo Connection succeeded > OK > Save.

3. Click 4-select1 để mở cửa sổ Select data to load. Chọn Database = TestDB, click chọn bảng taxi, xem data mẫu trong bảng với 17 field dữ liệu. Nhấn Insert script.

SelectData

4. Nhấn Load data LoadDatađể chạy reload script.

5. Mở Data Model Viewer, xác nhận đã có 14,000 dòng dữ liệu và 17 field được load vào bảng taxi. Từ đây bạn có thể tạo biểu đồ theo ý muốn.

P5. Xóa container

Ở phần cuối cùng này, chúng ta sẽ dọn dẹp Docker và xóa container vừa tạo. Thực hiện các bước sau:

1. Mở lại Windows PowerShell. Dừng container mongotest đang chạy bằng câu lệnh sau:

docker container stop mongotest

2. Xóa container:

docker container rm mongotest

3. Kiểm tra lại các container hiện có bằng lệnh ps, đảm bảo container mongotest đã được xóa:

docker container ps -a

Bạn có thể tham khảo ứng dụng mẫu kèm file dữ liệu tại VietQlikies Public Share – Blog 29