
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 KSQLPesawat 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 PiKoleksi 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 RTL2832UUbah 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:
- location_and_details_stream , yang menyediakan aliran informasi terbaru tentang lokasi dan kecepatan pesawat;
- 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.
