Integrate Apache Zeppelin + Cloudera HUE + openLdap using Docker

Bài viết này sẽ giới thiệu cách tích hợp Apache Zeppelin và Cloudera HUE thành một Workbench Big Data đơn giản. Trong ví dụ này thì mình chỉ sử dụng app Filebrowser của HUE.

Ý tưởng cơ bản là bạn có data sau đó sẽ đẩy lên platform để lưu trữ, xử lý thông qua HUE, sau đó sẽ sử dụng các công cụ Data Analytic để phân tích và đánh giá, ở đây mình sử dụng Apache Zeppelin.

1. Khởi động các docker image

Ở demo này mình sử dụng các docker image: zeppeline 0.8.1, spark 2.4.3, namenode/datanode hadoop 3.2, cloudera hue 4.4, openldap 1.2.4 và phpldapadmin 0.7.2. Chi tiết có thể tham khảo các build các docker image trên Github của mình: https://github.com/nvtienanh hoặc pull về từ docker hub: https://hub.docker.com/u/nvtienanh

Mình sử dụng docker-compose để cấu hình các service, tất cả sử dụng chung lớp mạng có tên spark-net

version: "3"

services:
  namenode:
    image: nvtienanh/hadoop-namenode:${HADOOP_TAG}
    container_name: namenode
    volumes:
      - ./data/namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
      - CORE_CONF_fs_defaultFS=hdfs://namenode:9000
    env_file:
      - ./hadoop.env
    healthcheck:
      interval: 5s
      retries: 100 
    networks:
      - spark-net
  datanode:
    image: nvtienanh/hadoop-datanode:${HADOOP_TAG}
    container_name: datanode
    volumes:
      - ./data/datanode:/hadoop/dfs/data
    environment:
      - CORE_CONF_fs_defaultFS=hdfs://namenode:9000
    env_file:
      - ./hadoop.env
    depends_on:
      - namenode
    healthcheck:
      interval: 5s
      retries: 100 
    networks:
      - spark-net
  spark-master:
    image: nvtienanh/spark-master:${SPARK_TAG}
    container_name: spark-master
    ports:
      - "7077:7077"
    env_file:
      - ./hadoop.env
    depends_on:
      - namenode
      - datanode
    healthcheck:
      interval: 5s
      retries: 100 
    networks:
      - spark-net
  spark-worker:
    image: nvtienanh/spark-worker:${SPARK_TAG}
    container_name: spark-worker
    env_file:
      - ./hadoop.env
    depends_on:
      - spark-master
    healthcheck:
      interval: 5s
      retries: 100 
    networks:
      - spark-net
  zeppelin:
    image: nvtienanh/zeppelin:${ZEPPELIN_TAG}
    container_name: zeppelin
    ports:
      - 8080:8080
    volumes:
      - ./notebook:/opt/zeppelin/notebook
    env_file:
      - ./hadoop.env
    volumes:
      - ./shiro.ini:/opt/zeppelin/conf/shiro.ini
    depends_on:
      - spark-master
      - namenode
    networks:
      - spark-net
  hue:
    image: nvtienanh/hue:${HUE_TAG}
    hostname: hue
    container_name: hue
    networks:
      - spark-net
    environment:
      - NAMENODE_HOST=namenode
    ports:
     - "8888:8888"
    volumes:
      - ./pseudo-distributed.ini:/usr/share/hue/desktop/conf/pseudo-distributed.ini
  ldap:
    hostname: ldap
    image: osixia/openldap:1.2.4
    container_name: openldap
    networks:
      - spark-net  
  ldapweb:
    image: osixia/phpldapadmin:0.7.2
    container_name: phpldapadmin
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: ldap
    ports:
      - 6443:443
    networks:
      - spark-net

networks:
  spark-net:
    external:
      name: spark-net

Để start tất cả service:

docker network create spark-net
docker-compose up -d

Để dừng tất cả service:

docker-compose down
docker network rm spark-net

Khi bạn start thành công thì terminal sẽ báo việc khởi tạo các service đã thành công:

$ make up
mkdir -p data
mkdir -p notebook
docker network create spark-net
ae1369929a7acb066b64bbcb8e28d8420c3c62acc8065a14177f3e6497e9222a
docker-compose up -d
Creating namenode     ... done
Creating openldap     ... done
Creating hue          ... done
Creating phpldapadmin ... done
Creating datanode     ... done
Creating spark-master ... done
Creating zeppelin     ... done
Creating spark-worker ... done

2. Tạo user bằng openLdap

Sau khi start thành công các service thì bước tiếp theo, tạo user để đăng nhập vào workbench. Truy cập vào LDAP Admin webui url: https://localhost:6443, nó sẽ hiện ra thông báo Your connection is not private chúng ta cứ ấn Show advance và chọn Proceed to localhost (unsafe) như hình dưới

Warning localhost

Sau đó đăng nhập vào Ldap admin với thông tin:

  • User: cn=admin,dc=example,dc=org
  • Pass: admin
Login to Ldap admin

Tạo user: nvtienanh với pass: 12345 bằng cách vào phần import và pase đoạn LDIF :

dn: uid=nvtienanh,dc=example,dc=org
cn: ServiceAccount
ou: People
displayname: Test Bela
givenname: Firstname
mail: nvtienanh@example.org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
sn: Lastname
uid: nvtienanh
userpassword: 12345

Tương tự như trên, tạo group:

dn: cn=hue,dc=example,dc=org
objectClass: top
objectClass: groupOfNames
cn: hue
member: uid=nvtienanh,dc=example,dc=org

3. Upload file lên Cloudera HUE

Đầu tiên, đăng nhập vào HUE http://localhost:8888 với thông tin tài khoản đã được tạo bằng LDAP Admin.

Khi các bạn đăng nhập thành công sẽ vào được giao diện dạng như sau

Đăng nhập vào HUE

Trong demo này chỉ sử dụng chức năng Filebrower nên mấy cái error đỏ đó không ảnh hưởng. Đó chỉ là thông báo chúng ta chưa cấu hình các chức năng khác trên HUE mà thôi.

Để upload 1 file lên chúng click vào thanh menu góc trên bên trái và chọn Files

Tiếp theo để upload 1 file thì chúng ta làm theo các bước như hình dưới

Sau khi upload xong thì file của chúng ta đã nằm trên folder cá nhân của user được tạo, ở đây file của mình upload lên sẽ nằm ở đây: /user/nvtienanh/ner_dataset.csv

4. Phân tích data bằng Appache Zeppelin

Đầu tiên chúng ta đăng nhập vào Zeppelin tại http://localhost:8080 sử dụng thông tin user đã tạo ở trên.

Tạo 1 notebook mới bằng cách vào Notebook -> Create new node:

Zeppelin tạo notebook

Sau khi tạo xong chúng ta thử viết 1 đoạn code đơn giản bằng pyspark đọc file csv trên HDFS (HUE):

%pyspark
# Từ khóa %pyspark để cho Zeppelin biết chúng ta đang viết code bằng pyspark

# Import một số thư viện của pyspark không dùng như để đảm bảo pyspark hoạt động
from pyspark.sql import functions as F
from pyspark.sql import types as T
from pyspark.sql.window import Window

# Tạo dataframe từ file csv mà chúng ta đã upload lên HUE
df = spark.read.csv("hdfs://namenode:9000/user/nvtienanh/ner_dataset.csv", inferSchema = True, header = True)

# Sử dụng function của Zeppelin để show data thay vì sử dụng df.show()
z.show(df)

Lưu ý: để truy xuất 1 file trên HDFS từ bên ngoài HUE container thì sử dụng: hdfs://namenode:9000/ + đường dẫn trên HUE

Ngoài ra chúng ta có thể lựa chọn một vài dạng biểu đồ để phân tích nhanh data

Lời kết

Đây là demo đơn giản của mình trong quá trình tìm hiểu, học hỏi thêm liên quan đến Big data Platform, mọi trao đổi có thể để bình luận bên dưới nhé.

Xem thêm

Bình luận