Cài đặt Apache Spark cluster trên hệ điều hành Linux/Ubuntu

Sharing is caring!

Chào các bạn, qua các bài tutorial trước, tui đã cài đặt Apache Spark lên HĐH Windows 10, sau đó viết thử một vài cái ứng dụng rồi submit lên Spark để chạy thử nhưng chỉ là chạy trên 1 máy thôi, còn gọi là Standalone Local mode. Theo tài liệu của Spark thì ngoài cách chạy trên một máy, Spark còn hổ trợ chạy trên nhiều máy thông qua cơ chế Cluster Manager.

Spark có 3 dạng Cluster Manager:

  • Standalone (có sẵn của Spark luôn)
  • Apache Mesos.
  • Hadoop YARN.

Đối với người mới tìm hiểu như tui thì tui sẽ chọn cái Standalone Cluster cho dễ hiểu, hai cái còn lại thì khi nào hiểu rõ hơn về Spark rồi thì tính sau.

Hôm này, trong bài tutorial này, tui sẽ tiến hành cài đặt Spark trên 3 máy (node). Tui sẽ sử dụng VMWare để tạo 3 node này, tất cả 3 node đều dùng HĐH Linux/Ubuntu. Bài viết sẽ chia làm 4 phần chính:

  • Cài đặt, cấu hình Spark cho 3 node.
  • Chạy cluster bằng tay.
  • Chạy cluster từ Master node.
  • Submit cái ứng dụng WordCount lên cluster này.

Cluster này gồm 3 node như sau:

Tên node HĐH IP Vai trò
jupiter Linux Mint Cinnamon 18 192.168.25.128 Master và Worker
mars Ubuntu Desktop 16.04 192.168.25.129 Worker
mercury Ubuntu Desktop 16.04 192.168.25.130 Worker

Cả 3 máy này tui đều tạo account có tên giống nhau là vincent

1. Chuẩn bị:

Ở phần chuẩn bị này sẽ làm chung cho cả 3 node nha các bạn.

1.1. Cập nhật file hosts:

Mở file /etc/hosts. thêm vào 3 dòng sau, ngay bên dưới dòng 127.0.1.1 <HOST_NAME>. Ở đây, các bạn xem file hosts của máy jupiter

Mục đích là để 3 node này nó thấy nhau qua tên máy hoặc IP.

Đối với Ubuntu thì tên máy default sau khi cài là ubuntu, các bạn đổi tên máy bằng các edit file /etc/hostname, sau đó mở file /etc/hosts, đổi chữ ubuntu ngay dòng 127.0.1.1, reboot lại là được

1.2. Cài đặt Oracle Java 8:

Update repo:

Cài Oracle java 8:

Nó hỏi “You MUST agree license….”, thì các bạn Ok

Nó hỏi “Do you accept Oracle Binary Code….”, thì chọn Yes

Sau khi chờ nó download và install xong, các bạn chuyển vào thư mục /usr/lib/jvm sẽ thấy thư mục java-8-oracle, vậy các bạn nhớ là thư mục home của java sẽ là /usr/lib/jvm/java-8-oracle nha.

1.3. Cài đặt SSH:

Lý do cài cái SSH này là vì máy Master sẽ truy cập vào các máy Worker thông qua cơ chế SSH password-less, có nghĩa là không dùng username/password mà sẽ dùng public/private key.

1.4. Download Spark:

Các bạn có thể dùng FireFox có sẳn trong Ubuntu, vào link http://spark.apache.org/downloads.html chọn version 1.6.3 rồi download hoặc dùng lệnh wget dowload link http://d3kbcqa49mib13.cloudfront.net/spark-1.6.3-bin-hadoop2.6.tgz

Nó sẽ download file spark-1.6.3-bin-hadoop2.6.tgz về thư mục /home/vincent/Downloads, cái dấu ~ nó tương đương với /home/vincent

Giờ tui sẽ giải nén file spark-1.6.3-bin-hadoop2.6.tgz ra thư mục /usr/local/spark/1.6.3

Đứng tại thư mục ~/Downloads, chạy lệnh:

Nó sẽ giải nén ra thư mục spark-1.6.3-bin-hadoop2.6. Sau đó, move thư mục này qua thành /usr/local/spark/1.6.3

Đứng tại thư mục ~/Downloads:

Tạo thư mục spark, và move thư mục spark-1.6.3-bin-hadoop2.6

1.5. Set JAVA_HOME, SPARK_HOME, cập nhật lại biến PATH:

Để dùng chung cho tất cả user, tui sẽ set các biến môi trường này tại file /etc/profile. Mở file /etc/profile, thêm các dòng sau ở cuối file:

Save lại, sau đó chạy lệnh source để cập nhật biến môi trường cho terminal hiên tại:

Kiểm tra biến môi trường JAVA_HOME

kiểm tra lệnh java trong thư mục bin:

kiểm tra Spark thì chạy lệnh spark-shell:

Nhắc lại là các bạn nhớ thực hiện cho cả 3 máy luôn nha.

2. Tạo SSH password-less cho cluster:

Như đã nói ở trên. Để có thể start Worker node, truy cập và tương tác với Worker node thì Master node phải login vào Worker node, do đó ta phải tạo một cái key tạm gọi là “access key” từ Master node rồi gửi qua cho các Worker node thông qua ssh.

2.1. Tạo key bằng ssh-keygen:

Tại Master node 192.168.25.128 (jupiter). chạy lệnh ssh-keygen

Nhấn Enter để lấy tên file mặc định

Nhập passphrase, các bạn nhập 2 lần để nó verify, và các bạn nhớ cái pass này nha

Nhấn Enter, nó sẽ tạo 2 file id_rsaid_rsa.pub trong thư mục ~/.ssh/

2.2. Copy file id_rsa.pub sang các máy Worker:

Tại Master node 192.168.25.128 (jupiter), chuyển vào thư mục ~/.shh/

Copy file id_rsa.pub cho máy Worker 192.168.25.129 (mars)

Ở đây vincent@192.168.25.129 có nghĩa là cái user vincent bên máy 192.168.25.129 (mars). Nó sẽ hỏi:

các bạn gõ “yes”. Tiếp theo nó sẽ hỏi password của user vincent bên máy 192.168.25.129 (còn cụ thể đối với các bạn là user gì thì các bạn nhập cho đúng nha)

nhập password, xong Enter

Sau đó, qua máy 192.168.25.129 (mars), vào thư mục ~/.ssh xem thì sẽ thấy file authorized_keys chính là cái file id_rsa.pub của máy jupiter.

Làm tương tự cho máy 192.168.25.130 (mercury).

Do cái máy 192.168.25.128 (jupiter) vừa làm Master vừa làm Worker, cho nên tui cũng sẽ tạo cái file authorized_keys ngay tại thư mục ~/.ssh của máy này luôn.

Để chắc ăn, các bạn có thể test kết nối từ máy jupiter sang máy mars bằng lệnh ssh xem.

Nếu là lần đầu tiên connect, các bạn sẽ bị nó hỏi cái passphrase lúc đâu khi tạo keygen, nhập cái passphrase đó vào là xong, lần sau có connect bằng ssh nữa thì không cần nhập username/password gì nữa.

3. Start cluster bằng tay:

Start bằng tay có nghĩa là bạn sẽ phải start Mster node trước, sau đó ở từng Worker node, các bạn start Worker node và register với Master node.

3.1. Start Master node 192.168.25.128 (jupiter):

Chuyển vào thư mục sbin của Spark:

và chạy file shell start-master.sh

Sau đó, mở trình duyệt Firefox tại Master node 192.168.25.128 (jupiter), gõ http://localhost:8080, cá bạn sẽ thấy Spark ở Master node nó start:

URL: spark://jupiter:7077. Các bạn nhớ cái url này, để lát nữa dùng cho Worker node nó đăng ký với Master node

Alive Workers: 0. Hiện tại thì chưa có Worker node nào đang chạy nên bằng 0.

Rồi, sau nhiều lần thử thì tui thấy là nó không nhận Worker các bạn ạ. Lý do là nó confuse tên máy. Để khác phục lỗi này, các bạn cài thư mục $SPARK_HOME/conf tại Master node 192.168.25.128 (jupiter), copy cái file spark-env.sh.template thành file spark-env.sh.

Ngay tại thư mục $SPARK_HOME/sbin chạy file stop-master.sh:

Tiếp, vào thư mục conf:

Sau đó, mở file $SPARK_HOME/conf/spark-env.sh lên, tìm cái biến SPARK_MASTER_IP, copy nó xuống một dòng, bỏ dấu # đi, sau đó gán giá trị cho nó là 192.168.25.128 là IP của Master node

Rồi, start lại Master:

Refresh Firefox, các bạn sẽ thấy nó đổi jupiter thành IP 192.168.25.128

 

3.2. Start các Worker node:

Tại Worker node 192.168.25.129 (mars), chạy file shell start-slave.sh

Chuyển vào thư mục sbin của Spark:

sau đó chạy file shell start-slave.sh

Tương tự cho Worker node 192.168.25.130 (mercury)

Qua Master node 192.168.25.128 (jupiter), refresh lai Firefox, các bạn sẽ thấy Alive Worker = 2

4. Start cluster từ Master node:

Có nghĩa là ta sẽ start Master node và các Worker node tại máy Master luôn.

Đẩu tiên, các bạn chạy lệnh ./stop-master.sh tại Master node và ./stop-slave.sh tại các Worker node (nếu các máy đang chạy Spark)

Tại Master node 192.168.25.128 (jupiter):

Vào thư mục $SPARK_HOME/conf, các bạn xem nếu chưa có file slaves thì copy file slaves.template thành file slaves

Mở file slaves này lên, thêm 2 cái ip 192.168.25.129 và 192.168.25.130 vào dưới dòng localhost:

Save lại. Dùng lệnh ./start-all.sh để start Master và các Worker, dùng lệnh ./stop-all.sh để dừng tất cả

Start cluster:

./start-all.sh là gồm 2 lệnh: ./start-master.sh và ./start-slaves.sh

Mở trình duyệt http://localhost:8080, các bạn sẽ thấy Alive worker = 3

Lý do Alive Workers = 3 là do tui dùng start-all.sh có nghĩa là tính luôn cả cái thằng Worker trên máy 192.168.25.128 (jupiter), chính là cái dòng localhost trong file $SPARK_HOME/conf/slaves

Stop cluster:

5. Submit WordCount application lên cluster:

Tui copy file wordcount.jar và file data.txt trong bài WordCount vào thư mục ~/Documents của Master node 192.168.25.128 (jupiter). Sau đó copy file data.txt vào thư mục ~/Documents của Worker node 192.168.25.129 (mars) và 192.168.25.130 (mercury)

Có update code để nhập filename từ console.

Start cluster nếu các bạn đã stop nó:

Đứng tại Master node, mở một terminal khác để run spark-submit:

Khi đó, mở Firefox lên vào http://localhost:8080, các bạn sẽ thấy cái app đang run:

Sau khi run xong:

Vậy là xong, mệt phờ râu Tired  . Nhưng có một vấn đề là khi các bạn submit lên cluster thì các bạn chả thấy cái list từ nó in ra màn hình console như khi chạy trên Windows trong bài trước. Lý do là khi chạy trên cluster, cái job sẽ được phân phối chia ra cho các workers thì nó biết khi nào là thằng worker nào làm mà in ra màn hình console nào, trong trường hợp của tui thì 3 thằng workers nhưng chỉ có 2 thằng làm thôi là thằng mars và thằng mercury. Thay vì in ouput ra màn hình, Spark nó sẽ ghi ra file tên là stdout, nếu có error, thì nó ghi cái error đó ra file stderr

Các bạn để ý cái Application ID của cái job tui submit là app-20170107112903-0000, đây là thư mục sẽ chứa các data output nếu có. Các bạn vào từng máy xem sẽ thấy, cụ thể như cái cluster của tui:

192.168.25.128 (jupiter)

dùng lệnh vi để xem cái file stdout:

Các bạn thấy nó trống rỗng, lý do là nó không có “tham gia” vô cái vụ này.

192.168.25.129 (mars)

Các bạn thấy có thêm cái file wordcount.jar, lý do là do Master node nó điều phối và copy file này qua cho Worker để nó thực thi công việc. Dùng lệnh vi xem file stdout

Thằng mars này nó chỉ làm một nữa việc thôi, phần còn lại là dành cho thằng mercury.

192.168.25.130 (mercury)

nội dung file cũng y chang của thằng mars Happy-Grin . Xem file sdtout

 

Đi đến đây là ổn rồi. Đây chỉ là bước đầu làm quen với Spark Cluster, còn nhiều bài toán phát sinh lắm, có thời gian tui sẽ nghiên cứu tiếp và viết thêm những turorial khác. Cám ơn các bạn đã xem, nhớ share bài hen!  THANK-YOU

Sharing is caring!

Truy vấn dữ liệu từ MongoDB với Apache Spark
Tìm hiểu và cài đặt Apache Kafka Single Node/Single Broker trên Windows 10

Vincent Le

Tui là Lê Minh Đạt, tên tiếng anh là Vincent(do thích nhân vật Vincent Valentine, ai từng là fan của trò Final Fantasy VII thì sẽ biết nhân vật này, hehe). Đang tập tành làm một blogger viết về mảng lập trình, mong muốn được chia sẻ những gì đã học được, tích góp được trong 10 năm đi làm thợ code.

shares