4 Xây dựng công cụ phân tích dữ liệu nông nghiệp
4.4 Nâng cấp giải thuật Fuzzy Logic
4.4.1 Đặt vấn đề
Đánh giá chung về Fuzzy Logic phiên bản đầu tiên, giải thuật đã đạt được một số một số ưu điểm như sau: chạy được tích hợp với một ứng dụng spark do được viết bằng scala, cách sử dụng dễ dàng, cách mô tả luật giống với ngôn ngữ tự nhiên. Tuy nhiên, giải thuật vẫn còn hạn chế là tốc độ tính toán còn chậm do quy trình thực hiện các bước tuần tự và chỉ sử dụng thuần túy các cấu trúc dữ liệu của scala. Quan sát lại về độ phức tạp tính toánO(Nr∗Step). Ta thấy rằng, tốc độ tính toán của Fuzzy Logic phụ thuộc chính vào hai đại lượng: số lượng luật và Step. Thông
thường, Nr là không đáng kể so với Step. Step là một thông số do người dùng cài
đặt khi sử dụng giải thuật. Step ảnh hưởng đến kết quả phép tính Aggregation và Deffuzification. Step càng nhỏ thì tốc độ tính toán càng nhanh, nhưng đổi lại về độ chính xác khi tính centroid, bisector càng thấp.
Phân tích rõ hơn một ví dụ về phép tính Max Aggregation, phép tổng hợp này truyền vào hai Fuzzy Set có độ dài là Step, trả về một Fuzzy Set duy nhất có độ dài là Step. Theo phương pháp hiện tại, giải thuật đang thực hiện một vòng lặp có độ phức tạp Step lần một cách tuần tự. Tuy nhiên, việc thực thi tuần tự từ đầu đến cuối danh sách (List[Double]) là không cần thiết vì các phần tử bên trong danh sách có thể được tính độc lập, song song hóa.
Từ quan sát trên, tôi đề xuất việc nâng cấp cách tính toán bằng cách sử dụng cấu trúc dữ liệu RDD của Spark và bộ khung thư viện vẫn được giữ nguyên, chỉ thay đổi phần hiện thực liên quan RDD. Như đã giới thiệu, RDD là một cấu trúc phân tán, tính toán trên nhiều máy. Vì thế, tôi đã thay đổi cấu trúc sử dụng bên trong giải thuật từ: List[Double] sang RDD[Double]. Giả sử Spark đang chạy trên một hệ
thống máy phân tánnc core. Thì tập RDD[Double] trên sẽ được phân tán thành nc
partition, các partition được tính toán song song với nhau. Như vậy, độ phức tạp của phép tính đã được giảm đinc lần.
Quan sát về DAG của giải thuật mới. Ứng dụng sẽ được chia làm hai Stage chính: Stage 0 và Stage 1.
Chương 4. Xây dựng công cụ phân tích dữ liệu nông nghiệp 63 bằng cách tạo thông qua SparkContext.
Gọi lệnh: sparkContext.parralellize(A to B by Step). Trong đó, A và B là hai số đại diện cho ngưỡng universe of discourse của output, step là số bước chia. Và kết quả trả về một danh sách phân tán có Step phần tử. Các quá trình map, union là các bước transformation của spark dùng để tính toán bước Aggregation. Điểm đặc biệt ở phiên bản này đó là, bước Aggregation sẽ không tính toán trực tiếp mà ghép nối các RDD lại với nhau, thông qua phép union. Lý do vì nếu thực hiện bước reduceByKey ngay thì số lượng phép reduceByKey sẽ nhiều dẫn đến giảm hiệu suất của Spark. reduceByKey là một phép toán yêu cầu spark phải truyền giữ liệu giữa các node để tổng hợp dữ liệu.
• Stage 1: Sau khi đã có một RDD lớn được tổng hợp từ các RDD nhỏ của quá
trình Aggregation, Stage 1 sẽ thực hiện việc tính toán phép tính Deffuzification thông qua phép reduceByKey
Chương 4. Xây dựng công cụ phân tích dữ liệu nông nghiệp 64
4.4.2 So sánh hiệu năng
Biểu đồ dưới đây so sánh thời gian thực thi của hai phiên bản giải thuật Fuzzy Logic. Cả hai phiên bản đều cho chạy trên Spark với cụm máy worker 8 máy, tổng cộng 16 core vật lý và 512Mb cho mỗi core. Ở các chương trình có step nhỏ từ 100 đến 10000, hiệu suất của cả hai version ngang nhau, thậm chí version 1 có thể nhanh hơn vì tiết kiệm chi phí giao tiếp giữa các worker. Tuy nhiên, khi tăng step từ105 trở lên, sự khác biệt về thời gian được thể hiện rõ ràng, phiên bản 2 có hiệu suất tốt hơn rất nhiều lần so với phiên bản 1.
102 103 104 105 106 107 108 109 0 100 200 300 400 500 Step T im e ( s ) Version 1 Version 2
65
Chương 5
Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp
5.1 Đặt vấn đề
Nước là yếu tố cần thiết cho sự phát triển của cây. Việc tưới tiêu dưới mức làm tăng nguy cơ nhiễm mặn. Tưới quá mức có thể là nguồn lây lan mầm bệnh, các chất ô nhiễm (dư lượng thuốc, chất diệt khuẩn, v.v.) trong cây trồng. Nhiều hệ thống tưới tiêu thông minh dựa trên việc khai phá dữ liệu đã được phát triển để xác định nhu cầu của cây trồng theo khí hậu và chu kỳ thực vật. Khai phá dữ liệu đóng một vai trò quan trọng trong việc đảm bảo quản lý tưới tiêu tốt hơn để đánh giá mức tiêu thụ nước bằng các phương pháp liên quan đến các yếu tố khí hậu, yếu tố cây trồng và mục tiêu kinh tế (Issad, Aoudjit, and Rodrigues,2019). Một số bài nghiên cứu đã đề xuất các hệ thống hỗ trợ quyết định mờ (Fuzzy), nhằm cải thiện hệ thống tưới tiêu theo đặc điểm của cây trồng và địa điểm. Trong các hệ thống này, Fuzzy Logic được áp dụng trực tiếp. Các hệ thống này bao gồm một module suy diễn tạo quyết định tưới tốt nhất để giữ độ ẩm của đất trong giới hạn thích hợp, giúp tiết kiệm nước. Trong (Zhang, Wu, and Tilt,1996), các tác giả đã phát triển một hệ thống điều khiển tưới dựa trên Fuzzy Logic có khả năng để bắt chước lý luận của con người. Nó sử dụng thông tin từ các cảm biến độ ẩm của đất và quyết định thời gian tưới nước.
Trong (Peng et al.,2009) đã sử dụng Logic mờ và mạng cảm biến không dây để phát
triển hệ thống tưới tiết kiệm nước. Hệ thống bao gồm bốn phần: cụm nút cảm biến đảm nhiệm việc thu thập độ ẩm của đất, nút điều phối có chứa bộ điều khiển mờ lấy hai biến đầu vào (sai số độ ẩm của đất và tốc độ thay đổi của sai số) và cung cấp cho đầu ra thời gian tưới nước. Bộ điều khiển tưới sẽ kiểm soát việc thực hiện tưới nước tự động và mạng lưới đường ống tưới. Kết quả cho thấy lượng nước yêu cầu được hệ thống tính toán chính xác và nhanh chóng. Hệ thống tưới tự động tiết kiệm
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 66phần cụ thể là cảm biến thu thập độ ẩm và nhiệt độ, nút điều phối, bộ điều khiển phần cụ thể là cảm biến thu thập độ ẩm và nhiệt độ, nút điều phối, bộ điều khiển tưới sử dụng Fuzzy Logic để quyết định áp dụng tưới và thời gian tưới, mạng lưới đường ống tưới. Bộ điều khiển dựa trên Fuzzy Logic giám sát mực nước trong bể và lượng mưa, tốc độ gió và nhiệt độ khí quyển. Thông tin về trạng thái của đồng ruộng và hệ thống sẽ được gửi đến nông dân qua mô-đun GSM nếu cần.
Qua các ví dụ trên, tôi nhận thấy rằng, việc áp dụng Fuzzy Logic vào các hệ thống tưới tiêu là rất phổ biến và được nhiều nhà khoa học tin dùng. Trong chương này, tôi sẽ xây dựng một ứng dụng tưới nước áp dụng giải thuật Fuzzy Logic đã đề xuất và thiết kế trong Spark. Mục tiêu của ứng dụng là đảm bảo độ ẩm cho cây trồng và tiết kiệm nước so với cách tưới truyền thống. Các nghiên cứu về cảm biến và đề xuất hệ thống suy diễn Fuzzy Logic được tham khảo và hiện thực lại tương tự với bài nghiên cứu (Touati et al.,2013). Trong bài nghiên cứu trên, các tác giả đã đề xuất một hệ thống tưới nước cho một vùng đất khô hạn ở Qatar dựa trên ba loại cảm biến: độ ẩm đất, ánh sáng và nhiệt độ. Bộ điều khiển trung tâm có phần giải thuật fuzzy logic được phát triển tích hợp. Nhận thấy đặc điểm khí hậu nóng ẩm hiện tại có phần tương đồng so với khu vực Qatar, tôi quyết định kế thừa bài nghiên cứu trên ở phần lõi giải thuật Fuzzy Logic để định nghĩa bài toán Fuzzy phục vụ việc ra quyết định tưới nước. Về phần kiến trúc hệ thống sẽ được định nghĩa lại cho phù hợp với các công nghệ hiện có như: Spark, Kafka, ThingsBoard,v.v.
5.2 Kiến trúc hệ thống tưới tiêu
Hệ thống gồm các thành phần chính sau
• Hệ thống phần cứng gồm các cảm biến và động cơ tưới nước:
• Server ThingsBoard thu thập dữ liệu
• Server Spark phân tích dữ liệu, lưu trữ HDFS và ra quyết định
Dữ liệu sẽ được đọc từ các cảm biến và gửi về một gateway sau đó gửi về server thingsboard. Tại đây, server spark sẽ subscribe topic của Kafka để lấy dữ liệu streaming, tiền xử lý và lưu xuống hệ thống file HDFS. Spark sẽ đọc dữ liệu từ HDFS và áp dụng giải thuật Fuzzy Logic để đề xuất ra quyết định tưới nước trong khoảng thời gian phù hợp. Sau đó gửi kết quả về server ThingsBoard để điều khiển máy bơm nước.
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 67
HÌNH5.1: Kiến trúc tổng quan hệ thống tưới tiêu
Trong phạm vi của luận văn, tôi sẽ trình bày chi tiết về 2 phần: phân tích dữ liệu và cài đặt hệ thống phần cứng. Phần thu thập dữ liệu ở server ThingsBoard được hỗ trợ và hợp tác với một nhóm nghiên cứu khác nên sẽ không đề cập chi tiết.
5.3 Hiện thực hệ thống5.3.1 Cảm biến 5.3.1 Cảm biến
Cảm biến ánh sáng
Hệ thống sử dụng cảm biến quang trở để đo đạc cường độ ánh sáng
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 68 Dữ liệu nhiệt độ đo đạc được ở khu vực Thủ Đức, TP.HCM. Dữ liệu điện áp cảm biến ánh sáng trong khoảng từ 0-1024, tương ứng với mức sáng giảm dần
HÌNH5.3: Dữ liệu cảm biến quang trở
Dữ liệu đầu ra để phục vụ cho giải thuật Fuzzy Logic được tính toán dựa trên công thức tham khảo sau: (Touati et al.,2013)
light=108.46−2∗log
104∗Vout
5−Vout
Trong đó Vout là điện áp đo đạt được của cảm biến
Cảm biến nhiệt độ
Hệ thống sử dụng cảm biến nhiệt độ dht11
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 69 Dữ liệu nhiệt độ đo đạc được ở khu vực Thủ Đức, TP.HCM
HÌNH5.5: Dữ liệu cảm biến nhiệt độ
Cảm biến độ ẩm đất
Cảm biến độ ẩm đất được xem là đầu vào và cả đầu ra cho giải thuật tưới nước. Đầu vào nhận vào giá trị độ ẩm để tính toán Fuzzy Logic, đầu ra tính được thời gian tưới nước và đo đạc lại giá trị cảm biến để kiểm tra độ ẩm đạt yêu cầu hay không. Dữ liệu độ ẩm đất được sinh tự động ngẫu nhiên theo kịch bản bằng Script Python ở server ThingsBoard.
GLOBAL_VARIABLE:
DEFAULT_SOIL = 20 s o i l = DEFALT_SOIL TIME_IRRIGATION
// thread 1 using for l i s t e n i n g UP_SIGNAL
START_THREAD_1 ;
TIME_IRRIGATION , UP_SIGNAL = Socket . r ec ei ve ( )
// thread 2 using for s o i l moisture decreases over time
START_THREAD_2 ; function DECREASING ( ) : while ( s o i l >=0): i f (UP_SIGNAL ) : INCREASING ( ) : else: s o i l = s o i l − random_epsilon
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 70
function INCREASING ( ) :
while ( s o i l <= TIME_IRRIGATION * alpha ) s o i l = s o i l + random_epsilon
Script Python gồm 2 thread chạy song song:
• THREAD_1: tạo kết nối Socket và lắng nghe để nhận dữ liệu thời gian tưới
nước được gửi về từ server Spark.
• THREAD_2: Mặc định khởi chạy hàm DECREASING để giảm độ ẩm đất theo
thời gian. Khi có tín hiệu tưới nước sẽ gọi hàm INCREASING để tăng độ ẩm trong một khoảng thời gian nhất định phụ thuộc vào biến TIME_IRRIGATION
HÌNH5.6: Dữ liệu cảm biến độ ẩm đất
5.3.2 Cài đặt Server Spark và Hadoop
Spark là một framework tính toán phân tán, chính vì thế sức mạnh tính toán của Spark nằm ở các máy cụm worker. Kiến trúc cụm máy tính được sử dụng bao gồm: 1 máy chủ master, 7 máy worker
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 71
HÌNH5.7: Kiến trúc minh họa Spark và Hadoop
Hệ thống lưu trữ được sử dụng cho Spark là Hadoop. Ngay từ đầu, Spark được thiết kế ra để tính toán dữ liệu trên hệ thống lưu trữ Hadoop. Chính vì thể, Hadoop được xem là giải pháp đọc ghi dữ liệu tốt và thân thiện nhất đối với Spark. Hadoop master và các slave cũng được thiết kế tương tự với Spark để quá trình truy xuất dữ liệu được nhanh hơn.
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 72
HÌNH5.9: Giao diện thư mục Hadoop
5.3.3 Thu thập và lưu trữ dữ liệu
Dữ liệu cảm biến được thu thập và gửi về Server ThingsBoard. Tại đây, Server Spark đóng vai trò làm Server xử lý trung tâm, chịu trách nhiệm lưu trữ dữ liệu cho ứng dụng, và sử dụng dữ liệu cho các bài toán cụ thể. Spark nhận các gói tin dữ liệu bằng cách đăng kí topic của kafka, sử dụng thư viện Spark Streaming
HÌNH5.10: Thu thập và lưu trữ dữ liệu
Ở Server Spark, khởi chạy một ứng dụng có tên SparkStream. Khai báo một dataframe có nhiệm vụ nhận dữ liệu gửi về từ Kafka. Ứng dụng đăng ký topic tên "gateway7" ở server ThingsBoard có địa chỉ "10.1.8.80:9092"
o b j e c t SparkStream {
def main ( args : Array [ String ] ) : Unit = { val conf = new SparkConf ;
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 73 val sc = new SparkContext ( conf )
val spark = SparkSession . builder ( ) . appName( " SparkStream " ) . getOrCreate ( )
val df = spark
. readStream
. format ( " kafka " )
. option ( " kafka . bootstrap . servers " , " 1 0 . 1 . 8 . 8 0 : 9 0 9 2 " )
. option ( " subscribe " , " gateway7 " ) . load ( )
Khai báo schema cho dataframe gồm các trường sau:
• Gateway: Tên gateway
• temperature: Giá trị cảm biến nhiệt độ
• solar: Giá trị cảm biên ánh sáng
• soil: Giá trị cảm biến độ ẩm đất
• latitude: Giá trị vĩ độ
• longitude: Giá trị kinh độ
• deviceName: Tên thiết bị
• deviceType: Loại thiết bị
• ts: Giá trị timestamp
val schema = new StructType ( ) . add ( " Gateway " , StringType ) . add ( " temperature " , DoubleType ) . add ( " s o l a r " , DoubleType )
. add ( " s o i l " , DoubleType ) . add ( " l a t i t u d e " , DoubleType ) . add ( " longitude " , DoubleType ) . add ( " deviceName " , StringType ) . add ( " deviceType " , StringType )
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 74 . add ( " t s " , StringType )
val valueDF = df
. selectExpr ( "CAST( value AS STRING) " )
. s e l e c t( from_json ( col ( " value " ) , schema ) . as ( " data " ) ) . s e l e c t( " data .* " )
Sử dụng module writeStream của Spark Streaming để nhận dữ liệu từ kafka. Với mỗi gói tin nhận được sẽ được gán tự động vào biến batchDF. Trong hàm foreachBatch, có thể tùy chỉnh hoặc tiền xử lý dữ liệu trước khi lưu HDFS.
valueDF . writeStream . foreachBatch {
( batchDF : DataFrame , batchId : Long)= >{
val format ="E dd−MMMM−yyyy HH:mm: ss . SSSS " val name_ts = " time "
val partition_format = "HH−dd−MMMM−yyyy " val p a r t i t i o n = " p a r t i t i o n "
// modify batchDF val df= batchDF
. withColumn ( name_ts , to_timestamp ( col ( " t s " )/1000)) . withColumn ( p a r t i t i o n ,
date_format ( col ( name_ts ) , partition_format ) )
. withColumn ( name_ts ,
date_format ( col ( name_ts ) , format ) )
// re−define the name of column
. s e l e c t ( col ( " temperature " ) . as ( " temp " ) , col ( " s o l a r " ) , col ( " s o i l " ) , col ( name_ts ) , col ( " t s " ) , col ( p a r t i t i o n ) ) // save hdfs df . coalesce ( 1 ) . write
. mode( SaveMode . Append) . partitionBy ( p a r t i t i o n )
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 75 . csv ( "/user/spark/ i r r i g a t i o n _ c s v " ) } } . s t a r t ( ) . awaitTermination ( )
Ứng dụng có tính chất đọc dữ liệu theo giờ. Quá trình ghi dữ liệu được thiết kế theo kiểu partition. Sau khi nhận được batchDF sẽ tiến hành biến đổi và thêm 1 cột partition. Cột partition có định dạng giờ-ngày-tháng-năm tương ứng "HH-dd- MMMM-yyyy". Vì thế khi write HDFS sẽ tự động partition thành các Folder theo định dạng đó.
HÌNH5.11: Lưu dữ liệu theo partition
5.3.4 Phân tích dữ liệu và ra quyết định
Quá trình phân tích dữ liệu gồm 3 bước:
• Đọc dữ liệu từ HDFS
• Áp dụng giải thuật Fuzzy Logic
• Gửi kết quả về phía server ThingsBoard
Về việc định nghĩa bài toán Fuzzy Logic, ứng dụng sẽ tham khảo bài nghiên cứu ở Qatar (Touati et al.,2013)
Chương 5. Áp dụng Fuzzy Logic vào vấn đề tưới tiêu trong nông nghiệp 76
HÌNH5.12: Phân tích dữ liệu và ra quyết định
HÌNH5.13: Sơ đồ hoạt động của giải thuật