Pemetaan kebisingan dengan KSQL, Raspberry Pi dan radio



Sekilas, cerita ini memiliki segalanya untuk mendapatkan status pos romantis pada malam 8 Maret: pesawat terbang, cinta, mata-mata kecil dan, akhirnya, kucing (lebih tepatnya, kucing). Sulit membayangkan bahwa semua ini berhubungan langsung dengan Kafka, KSQL dan percobaan "bagaimana menemukan pesawat paling berisik menggunakan teknologi informasi rumah". Itu sulit, tapi itu perlu: itu adalah eksperimen yang dilakukan Simon Obury, dan kami menerjemahkan artikel kepenulisannya yang menjelaskan semua detail proses.

Kucing baru kami yang bernama Snowflake bangun lebih awal. Suara pesawat terbang di atas rumah kami membangunkannya. Tetapi bagaimana jika, menggunakan Apache Kafka, KSQL dan Raspberry Pi, saya dapat menentukan pesawat mana yang membuat kucing saya tetap terjaga? Akan menyenangkan untuk membuat panel pelacakan yang menghibur, tempat kucing dapat mengalihkan perhatiannya - dan memberi saya lebih banyak tidur.

Secara umum



Kami mentransfer pesawat dari langit ke grafik menggunakan Kafka dan KSQL

Pesawat menentukan lokasi mereka menggunakan penerima GPS. Pemancar on-board secara berkala melaporkan lokasi, nomor identifikasi, ketinggian dan kecepatan kapal menggunakan transmisi radio pendek. Siaran-siaran ini dari pengawasan bergantung otomatis siaran ( AZN-V ) pada dasarnya adalah paket data yang terbuka untuk diakses dari stasiun-stasiun darat.

Satu mikrokomputer, seperti Raspberry Pi, dan beberapa komponen tambahan yang diperlukan untuk menerima pesan dari pemancar on-board pesawat yang berlarian di rumah saya.

Sinyal udara dari pesawat terlihat seperti bola pesan yang kusut dan membutuhkan sistematisasi. Mengenali aliran data yang kacau ini seperti mendengarkan percakapan di pesta yang bising. Karena itu, untuk menemukan pesawat yang mengkhawatirkan kucing saya, saya memutuskan untuk menggunakan kombinasi Kafka dan KSQL.


Kucing yang Terbangun dan Raspberry Pi

Koleksi bacaan AZN-B dengan Raspberry Pi


Untuk mengumpulkan transmisi on-board, saya menggunakan Raspberry Pi dan RTL2832U, modem USB yang awalnya dijual sebagai perangkat untuk menonton TV digital di komputer. Pada Raspberry Pi saya menginstal dump1090 - program yang menerima data dari AZN-V hingga RTL2832U menggunakan antena kecil.


Radio perangkat lunak saya dari Raspberry Pi dan RTL2832U

Ubah sinyal AZN-B ke tema Kafka


Sekarang saya telah menerima aliran sinyal AZN-B mentah, kita harus memperhatikan lalu lintas. Raspberry Pi tidak memiliki daya yang cukup untuk komputasi serius, jadi saya harus mentransfer pemrosesan data ke cluster lokal saya di Kafka.



Pesan yang diterima dibagi menjadi pesan lokasi atau pesan tentang identifikasi board . Lokasinya terlihat seperti pesan dalam bentuk: "papan 7c6db8 terbang di ketinggian 6.250 kaki di koordinat -33.8.151.0 . " Informasi tentang identifikasi papan akan terlihat seperti: "papan 7c451c terbang di sepanjang rute QJE1726 . "

Sebuah skrip Python kecil untuk Raspberry Pi saya membagikan semua pesan AZN-B yang masuk. Saya menggunakan proksi Confluent Rest Proxy untuk mendistribusikan data dari Raspberry Pi ke lokasi-topik dan tema ident-topik di Kafka. Server proxy menyediakan antarmuka RESTful untuk cluster Kafka, yang membuatnya mudah untuk membuat pesan menggunakan panggilan REST sederhana di Pi.



Saya ingin memahami pesawat mana yang terbang di atas atap saya dan rute mana. Basis data OpenFlight memungkinkan Anda untuk membandingkan kode bandara, misalnya 7C6DB8 yang ditugaskan oleh Organisasi Penerbangan Sipil Internasional (ICAO), dengan jenis pesawat - dalam kasus kami, Boeing 737. Saya mengunggah data pemetaan saya ke tema icao-to-aircraft .

KSQL menyediakan "mesin SQL" yang memungkinkan Anda untuk memproses data secara real time pada topik Apache Kafka. Misalnya, untuk menemukan kode on-board 7C6DB8, kita dapat menulis kueri berikut:

CREATE TABLE icao_to_aircraft WITH (KAFKA_TOPIC='ICAO_TO_AIRCRAFT_REKEY', VALUE_FORMAT='AVRO', KEY='ICAO'); ksql> SELECT manufacturer, aircraft, registration \ FROM icao_to_aircraft \ WHERE icao = '7C6DB8'; Boeing | B738 | VH-VYI 

Demikian pula, dalam topik rincian tanda panggilan , saya mengunggah tanda panggilan (yaitu QFA563, ini adalah penerbangan Qantas dari Brisbane ke Sydney).

 CREATE TABLE callsign_details WITH (KAFKA_TOPIC='CALLSIGN_DETAILS_REKEY', VALUE_FORMAT='AVRO', KEY='CALLSIGN'); ksql> SELECT operatorname, fromairport, toairport \ FROM callsign_details \ WHERE callsign = 'QFA563'; Qantas | Brisbane | Sydney 

Sekarang mari kita lihat aliran data topik-lokasi . Di sini kita dapat mengamati aliran konstan pesan yang masuk tentang lokasi pesawat terbang.

 kafka-avro-console-consumer --bootstrap-server localhost:9092 --property --topic location-topic {"ico":"7C6DB8","height":"6250","location":"-33.807724,151.091495"} 

Kueri KSQL akan terlihat seperti ini:
 ksql> SELECT TIMESTAMPTOSTRING(rowtime, 'yyyy-MM-dd HH:mm:ss'), \ ico, height, location \ FROM location_stream \ WHERE ico = '7C6DB8'; 2018-09-19 07:13:33 | 7C6DB8 | 6250.0 | -33.807724,151.091495 

KSQL: streaming harmonisasi ...


Nilai sebenarnya KSQL terletak pada kemampuan untuk menggabungkan aliran data lokasi yang masuk dengan data sumber topik (lihat 03_ksql.sql ) β€”yaitu , menambahkan informasi yang berguna ke aliran data mentah. Ini sangat mirip dengan "join kiri" dalam database tradisional. Hasilnya adalah tema Kafka lain yang dibuat tanpa satu baris kode Java!

source> CREATE STREAM location_and_details_stream AS \
PILIH l.ico, l.tinggi, l.lokasi, t.aircraft \
DARI location_stream l \
KIRI BERGABUNG icao_to_aircraft t ON l.ico = t.icao;
Selain itu, Anda menerima permintaan KSQL. Aliran data akan terlihat seperti ini:

 ksql> SELECT TIMESTAMPTOSTRING(rowtime, 'yy-MM-dd HH:mm:ss') \ , manufacturer \ , aircraft \ , registration \ , height \ , location \ FROM location_and_details_stream; 18-09-27 09:53:28 | Boeing | B738 | VH-YIA | 7225 | -33.821,151.052 18-09-27 09:53:31 | Boeing | B738 | VH-YIA | 7375 | -33.819,151.049 18-09-27 09:53:32 | Boeing | B738 | VH-YIA | 7425 | -33.818,151.048 

Selain itu, kita dapat menggabungkan aliran input callsign dengan tema callsignigndetail tetap:

 CREATE STREAM ident_callsign_stream AS \ SELECT i.ico \ , c.operatorname \ , c.callsign \ , c.fromairport \ , c.toairport \ FROM ident_stream i \ LEFT JOIN callsign_details c ON i.indentification = c.callsign; ksql> SELECT TIMESTAMPTOSTRING(rowtime, 'yy-MM-dd HH:mm:ss') \ , operatorname \ , callsign \ , fromairport \ , toairport \ FROM ident_callsign_stream ; 18-09-27 13:33:19 | Qantas | QFA926 | Sydney | Cairns 18-09-27 13:44:11 | China Eastern | CES777 | Kunming | Sydney 18-09-27 14:00:54 | Air New Zealand | ANZ110 | Sydney | Auckland 

Sekarang kami memiliki dua topik informatif:

  1. location_and_details_stream , yang menyediakan aliran informasi terbaru tentang lokasi dan kecepatan pesawat;
  2. ident_callsign_stream , yang menjelaskan detail penerbangan, termasuk maskapai dan tujuan.

Dengan tema yang terus diperbarui ini, kami dapat membuat beberapa panel ikhtisar yang luar biasa. Saya menggunakan Kafka Connect untuk mengunggah tema Kafka yang diisi oleh KSQL ke Elasticsearch (skrip lengkap di sini ).

Kibana Dashboard


Berikut ini adalah contoh dari panel ikhtisar yang menunjukkan lokasi pesawat terbang di peta. Selain itu, Anda dapat melihat bagan menurut maskapai, grafik ketinggian penerbangan, dan kata cloud berdasarkan tujuan utama. Peta panas menunjukkan area di mana pesawat terkonsentrasi, yaitu, area dengan tingkat kebisingan tertinggi.



Kembali ke kucing


Hari ini kucing membangunkan saya sekitar pukul 6 pagi. Bisakah KSQL membantu saya menemukan pesawat yang saat ini terbang di atas rumah saya di ketinggian kurang dari 3.500 kaki?

 select timestamptostring(rowtime, 'yyyy-MM-dd HH:mm:ss') , manufacturer , aircraft , registration , height from location_and_details_stream where height < 3500 and rowtime > stringtotimestamp('18-09-27 06:10', 'yy-MM-dd HH:mm') and rowtime < stringtotimestamp('18-09-27 06:20', 'yy-MM-dd HH:mm'); 2018-09-27 06:15:39 | Airbus | A388 | A6-EOD | 2100.0 2018-09-27 06:15:58 | Airbus | A388 | A6-EOD | 3050.0 

Luar biasa! Saya bisa melihat sebuah pesawat di atas atap saya pada pukul 6:15 pagi. Ternyata Snowflake dibangunkan oleh Airbus A380 (kapal besar, omong-omong), yang terbang ke Dubai.

Hanya beberapa hari libur, dan Anda memiliki sistem pemrosesan streaming dengan KSQL. Selain itu, yang memungkinkan Anda menemukan peristiwa data menarik dengan cepat. Meskipun Snowflake mungkin skeptis tentang mereka.

Source: https://habr.com/ru/post/id442876/


All Articles