12/17/2021

Hướng dẫn lab 5 | Môn lưu trữ và xử lý dữ liệu lớn


Các bạn học môn lưu trữ và xử lý dữ liệu lớn của thầy Đào Thành Chung sẽ phải làm 5 bài lab, trong bài viết này mình sẽ hướng dẫn mọi người chạy bài lab số 5 (lab về Spark Streaming), xem yêu cầu của bài lab TẠI ĐÂY

Chú ý

- Trong hướng dẫn của thầy, có một số hướng dẫn đã quá cũ và không thể chạy được nếu bạn làm theo y nguyên trong hướng dẫn của thầy. Mình đã sửa lại 2 project trong lab cho phù hợp, các bạn chỉ cần clone về và làm theo hướng dẫn của mình dưới đây.

- Project của thầy và project mình sửa lại đều chạy với Spark Single node, nên nếu bạn cài với cụm Multi node thì hãy sửa đổi các địa chỉ hostname từ localhost thành địa chỉ máy master, chỗ nào cần sửa mình đã lưu ý bôi đậm, các bạn chú để sửa lại cho đúng.

Bài 1: Socket Stream

Clone toàn bộ project sau về máy để chuẩn bị chạy nha: https://github.com/demanejar/socket-stream.

Trong project có 2 file chính, một là file SocketStream.scala:

object SocketStream {
    def main(args : Array[String]){
        val conf = new SparkConf().setAppName("Socket-Stream")
        val ssc = new StreamingContext(conf, Seconds(1))
        val lines = ssc.socketTextStream("localhost", 7777)
        val errorLines = lines.filter(_.contains("error"))
        errorLines.print()
        ssc.start()
        ssc.awaitTermination()
    }
}

  • Để có thể submit job này với spark-submit thì bạn phải build chúng thành một file .jar, với scala thì chúng ta sẽ sử dụng sbt

  • Lưu ý: nếu bạn chạy cụm Spark nhiều máy, thì hãy đổi địa chỉ hostname từ localhost thành địa chỉ máy master nha

Khởi động Spark và kiểm tra địa chỉ của master thông qua cổng 8080 (spark://PC0628:7077):

Build project vừa rồi thành file .jar với câu lệnh:

sbt clean package

Chạy spark-submit với file jar vừa bulid được:

spark-submit --master spark://PC0628:7077 --class SocketStream target/scala-2.11/socket-stream_2.11-0.0.1.jar

  • Tham số master là địa chỉ của master mà bạn vừa lấy ở bên trên

  • Tham số class là đường dẫn tới hàm main của project

Mở một terminal khác lên và chạy lệnh sau để bắt đầu gửi text qua cổng 7777:

nc -l 7777

Kết quả in ra màn hình và sẽ vụt qua rất nhanh:



Bài 2: Log Analyzer

Clone toàn bộ project về máy để chuẩn bị chạy nha: https://github.com/demanejar/logs-analyzer.

Mình sẽ đi qua giải thích từng file để mọi người hiểu hơn về project, đầu tiên là file đầu vào log.txt, file này chứa 1546 dòng log, các log đều có cấu trúc giống nhau, công việc của project này chính là nhận đầu vào từ file log này và đưa ra các phân tích, thống kê về trên tập log này.

File stream.sh là một file shell script với nhiệm vụ là đọc dữ liệu từ file log.txt và đẩy chúng qua cổng 9999.

File build.sbt thì giống với project trước, file này để khai báo các thư viện, phụ thuộc để có thể build project thành một file .jar

Cuối cùng là project của chúng ta viết bằng scala với 2 file ApacheAccessLog.scalaLogAnalyzerStreaming.scala. File LogAnalyzerStreaming.scala sẽ lắng nghe ở cổng 9999, lấy dữ liệu và tiến hành tổng hợp, phân tích chúng.

  • Lưu ý: nếu bạn chạy cụm Spark nhiều máy, thì hãy đổi địa chỉ hostname  trong file LogAnalyzerStreaming.scala từ localhost thành địa chỉ máy master nha

Khởi động Spark và kiểm tra địa chỉ của master thông qua cổng 8080 (spark://PC0628:7077):

Build project vừa rồi thành file .jar với câu lệnh dưới đây, lần đầu build có thể các bạn sẽ phải đợi khá lâu vì nó phải tải xuống các thư viện, trong các lần build sau sẽ nhanh hơn:

sbt clean package

Chạy spark-submit với file jar vừa bulid được:

spark-submit --master spark://PC0628:7077 --class LogAnalyzerStreaming target/scala-2.12/log-analyzer_2.12-0.0.1.jar

  • Tham số master là địa chỉ của master mà bạn vừa lấy ở bên trên

  • Tham số class là đường dẫn tới hàm main của project

Trong bài viết trước, chúng ta đã gửi dữ liệu thông qua socket bằng tay, trong bài này vẫn là socket tuy nhiên chúng ta sẽ viết một chương trình để chúng tự động gửi dữ liệu và chúng ta chỉ việc ngồi chờ kết quả thôi.

Như mình giải thích ở ban đầu, file stream.sh là một file shell script với nhiệm vụ là đọc dữ liệu từ file log.txt và đẩy chúng qua cổng 9999. Sử dụng câu lệnh sau để bắt đầu chạy:

./stream.sh log.txt

  • Với log.txt viết ở phía sau thể hiện log.txt là một tham số đầu vào của chương trình viết trong file .stream.sh

  • Lưu ý: nếu bạn chạy cụm Spark nhiêu máy thì file này phải được chạy trên máy master 

Kết quả in ra màn hình cũng sẽ vụt qua rất nhanh, các bạn có thể kéo terminal lên để nhìn

Mở cổng 4040 để xem lại chi tiết các job vừa thực hiện (localhost:4040):


Tham khảo: https://demanejar.github.io/

1 comment: