Dataset geospasial besar (> 22 triliun item) dengan kinerja kueri baca cepat (<1s)

20

Saya sedang dalam proses merancang sistem baru untuk set data geospasial besar yang akan membutuhkan kinerja permintaan baca cepat. Oleh karena itu saya ingin melihat apakah ada yang berpikir itu mungkin atau memiliki pengalaman / saran tentang DBMS, struktur data, atau metode alternatif yang sesuai untuk mencapai kinerja yang diperlukan dalam situasi berikut:

Data akan terus diproduksi dari data radar satelit yang diproses, yang akan memiliki jangkauan global. Berdasarkan resolusi satelit dan jangkauan lahan dunia, saya memperkirakan set data lengkap untuk menghasilkan nilai di 75 miliar lokasi berbeda di dunia. Selama masa hidup satu satelit, output akan menghasilkan hingga 300 nilai di setiap lokasi ini (sehingga total kumpulan data> 22 triliun nilai). Ini untuk satu satelit, dan sudah ada yang kedua di orbit, dengan dua yang lain direncanakan dalam beberapa tahun baru. Jadi akan ada banyak data! Item data tunggal sangat sederhana dan hanya akan terdiri dari (bujur, lintang, nilai), tetapi karena jumlah item saya memperkirakan satu satelit untuk menghasilkan hingga 100TB.

Data tertulis seharusnya tidak perlu diperbarui, karena hanya akan tumbuh ketika akuisisi satelit baru diproses. Kinerja menulis tidak penting, tetapi kinerja membaca sangat penting. Tujuan dari proyek ini adalah untuk dapat memvisualisasikan data melalui antarmuka sederhana seperti layer over google maps, di mana setiap titik memiliki nilai berwarna berdasarkan rata-rata, gradien, atau beberapa fungsi dari waktu ke waktu. (demo di akhir posting).

Dari persyaratan ini, basis data harus dapat diukur dan kami cenderung melihat ke arah solusi cloud. Sistem harus mampu menangani pertanyaan geospasial seperti "titik dekat (lat, lon)" dan "titik dalam (kotak)", dan telah membaca kinerja <1s untuk menemukan satu titik, dan poligon yang berisi hingga 50.000 poin (meskipun lebih dari 200.000 poin lebih disukai).

Sejauh ini saya memiliki set data uji ~ 750 juta item data di 111 juta lokasi. Saya telah menguji coba contoh postgres / postGIS, yang berfungsi dengan baik, tetapi tanpa kemungkinan sharding saya tidak melakukan ini, ini akan dapat mengatasi data yang bertambah. Saya juga telah mencoba contoh mongoDB, yang lagi-lagi tampak OK jadi jauh, dan dengan sharding mungkin cukup untuk skala dengan volume data. Saya baru-baru ini belajar sedikit tentang elasticsearch, jadi setiap komentar tentang ini akan membantu karena ini baru bagi saya.

Berikut adalah animasi singkat tentang apa yang ingin kami capai dengan kumpulan data lengkap: Tileserver melayani visualisasi 750 juta item data.

Gif ini (dari percobaan postgres saya) adalah melayani (6x3) ubin raster yang sudah dihitung sebelumnya, masing-masing berisi ~ 200.000 poin dan mengambil ~ 17 untuk menghasilkan masing-masing. Dengan mengklik suatu titik, grafik dibuat dengan menarik semua nilai historis di lokasi terdekat dalam <1s.

Permintaan maaf untuk posting lama, semua komentar / saran dipersilakan.

Azwok
sumber

Jawaban:

4

Anda dapat shard berdasarkan lokasi. Partisi globe menjadi kisi-kisi dan minta setiap bujur sangkar dalam kisi itu pada satu server. Karena Anda menyebutkan cloud, itu akan sangat cocok untuk cloud. Tentu saja Anda harus menggabungkan hasil dari beberapa server secara manual.

Dengan begitu Anda dapat menggunakan solusi basis data apa pun yang Anda suka. Tidak perlu scalable sendiri.

Kotak individu akan memiliki jumlah data yang berbeda. Anda dapat menggunakan mesin dengan ukuran berbeda untuk mereka (karena ini cloud), atau Anda meletakkan beberapa pecahan kecil di mesin yang sama.

Skema beling ini sangat bagus untuk jenis kueri yang Anda lakukan karena setiap kueri hanya perlu menyentuh sedikit pecahan. Sharding oleh waktu lebih buruk karena semua pecahan waktu harus disentuh untuk setiap permintaan. Sharding acak memiliki masalah yang sama.

Semua dalam semua ini adalah kasus sharding yang mudah karena pola kueri sangat sesuai dengan skema sharding.

Sebenarnya, saya ingin tahu apakah Anda memerlukan database sama sekali untuk ini. Mungkin Anda bisa mempartisi globe menjadi 1000x1000 ubin atau lebih kecil dan memiliki satu file flat dalam penyimpanan gumpalan untuk setiap ubin. Penyimpanan gumpalan tidak masalah gumpalan 1M sama sekali.

Menjalankan query secara konseptual sangat mudah dengan skema penyimpanan ini. Anda dapat menyimpan data secara berlebihan dalam beberapa resolusi grid juga.

usr
sumber
Sharding oleh wilayah adalah pendekatan yang telah saya lihat dengan MongoDB, dan dengan rilis MongoDB Atlas yang tepat waktu, saya saat ini condong ke arah itu (menggunakan nilai agregat yang telah dihitung sebelumnya). Saat ini saya tidak yakin berapa banyak server replika / beling yang saya perlukan, sehingga biaya mungkin menjadi masalah. Proposal Anda untuk menggunakan penyimpanan BLOB juga menarik, dan Anda adalah orang kedua yang mengusulkannya. Namun, menggunakan BLOB sama sekali baru bagi saya, jadi saya perlu membacanya lebih lanjut, ada sumber berguna yang Anda ketahui? Terima kasih atas tanggapannya.
Azwok
Gumpalan sepele untuk digunakan. Kompleksitas akan muncul dari Anda yang perlu mengimplementasikan fitur basis data seperti serialisasi, kueri, transaksi, cadangan, HA, DA. Ini semua bisa dilakukan tetapi mungkin tidak bijaksana. Mungkin Anda bisa menyimpan gumpalan di tabel Postgres. Itu mengotomatiskan semua itu kecuali serialisasi dan permintaan. Perf bisa lebih baik daripada penyimpanan gumpalan dan mungkin bahkan lebih murah. Gumpalan dan VM tidak dikenakan biaya, mereka memiliki margin yang bagus (bukti: webhoster lokal saya mengenakan biaya 3-5x lebih rendah untuk daya komputasi yang sama dari cloud. Ini menyiratkan margin cloud yang tinggi).
usr
Perhatikan, bahwa Anda dapat menjalankan beberapa pecahan pada instance mongo yang sama. Anda dapat "mengawasi". Dengan begitu Anda bisa menyeimbangkan server.
usr
1
Saya tidak yakin Anda memerlukan fitur spasial sama sekali. Anda dapat menghitung semua itu di aplikasi. Anda hanya perlu kemampuan untuk meminta semua data untuk sebuah persegi panjang. Ini dapat dilakukan dengan membagi globe secara manual ke dalam kisi (atau beberapa kisi resolusi). DB Anda tidak perlu mendukung spasial, saya pikir.
usr
8

Seberapa up-do-date permintaan kueri Anda perlu?

Anda dapat mempartisi basis data berdasarkan waktu jika peta hanya perlu menunjukkan pengukuran terbaru. Ini akan mengurangi beban permintaan Anda untuk peta.

Untuk sejarah titik tertentu, Anda bisa menyimpan toko kedua x dan y yang menunjukkan riwayat. Ini bisa dilakukan dengan pembaruan / pembaruan setiap malam karena data historis tidak akan berubah.

Kemudian Anda dapat melakukan pre-komputasi rata-rata pada resolusi yang lebih kasar untuk diintegrasikan dengan peta pada tingkat zoom yang berbeda. Ini akan mengurangi jumlah titik yang akan diambil untuk area peta besar (perkecil). Resolusi yang lebih baik akan digunakan untuk memperbesar peta yang meminta area yang lebih kecil. Jika Anda benar-benar perlu mempercepat ini, Anda bisa menghitung ubin sebagai gumpalan dan menafsirkannya dalam aplikasi Anda.

Karena ini akan melibatkan beberapa komputasi ulang informasi agregat akan ada beberapa latensi dalam hasil permintaan. Bergantung pada seberapa jauh latensi dapat diterima, Anda dapat menggunakan pendekatan semacam ini untuk mengoptimalkan bacaan Anda.

OK, jadi poin Anda perlu dihitung rata-rata dari waktu ke waktu. Dengan perhitungan ini, saya kira permintaan aktual Anda turun cukup banyak dari 22 triliun item karena nilai raster dapat dihitung sebelumnya untuk kueri.

ConcernedOfTunbridgeWells
sumber
Kueri baca dapat mengalami sedikit keterlambatan (satu atau dua hari), jadi pemrosesan batch adalah opsi yang valid. Di lokasi mana pun, nilai baru hanya akan ditambahkan setiap 6 hari paling cepat (pass satelit berikutnya). Output pada peta bukan hanya nilai terbaru, itu dihitung berdasarkan seluruh sejarah nilai di lokasi itu, misalnya rata-rata, atau gradien, atau fungsi kustom. Untuk level yang lebih diperbesar, saya sudah mengerjakan struktur clustering / piramida sehingga saya akan memiliki tabel / koleksi dengan nilai rata-rata sehingga tidak ada ubin (permintaan) akan memiliki> 200.000 (atau 50.000) item lokasi.
Azwok
Saya pikir bahwa agregat pra-kalkulasi adalah kuncinya - perhitungan temporal Anda masih dapat dikelompokkan. Ini adalah bagaimana sistem OLAP mendapatkan kinerja permintaan yang cepat dan Anda mungkin perlu mengambil pendekatan semacam ini. Khususnya relevan jika Anda dapat hidup dengan data yang berumur satu hari untuk pertanyaan Anda.
ConcernedOfTunbridgeWells
Jika Anda menanyakan nilai rata-rata yang dihitung, berapa banyak lokasi berbeda yang Anda ambil sampelnya - yaitu berapa resolusi bitmap aktual pada tingkat zoom tertinggi?
ConcernedOfTunbridgeWells
Saya setuju agregat yang sudah dihitung sebelumnya terlihat sangat mungkin untuk dilakukan. Rata-rata yang dihitung pada zoom tertinggi tidak dirata-ratakan di atas area, itu adalah rata-rata nilai dari waktu ke waktu di 1 lokasi. Hanya saat tampilannya keluar, saya akan memiliki tabel / koleksi terpisah yang akan rata-rata area untuk memastikan tidak ada kueri / ubin memiliki terlalu banyak titik lokasi di dalamnya (maks 50.000-200.000). Resolusi maksimum ubin apa pun adalah 256x256 piksel.
Azwok
3

Kedengarannya seperti ada dua kelas kueri - satu untuk memahami lokasi mana yang terletak dalam jendela tampilan saat ini dan yang kedua untuk memberikan statistik yang diinginkan untuk titik-titik tersebut. Saran saya adalah menggunakan alat khusus yang terpisah untuk masing-masing.

Saya mengasumsikan semua pengukuran berhubungan dengan set poin 75Bn yang sama. Karenanya, lat / long ini, sekali didirikan, bersifat statis. Mereka dapat dikelompokkan, dikumpulkan dan diindeks dengan biaya satu kali. Karena itu saya akan menyarankan sharding berdasarkan wilayah dan tingkat zoom. Ukuran setiap beling akan didorong oleh kinerja yang dapat dicapai dari setiap instance GIS.

GIS akan mengembalikan satu set poin yang dilewatkan ke basis data deret waktu. Ini memegang nilai yang diukur dan melakukan agregat. KDB adalah salah satu yang saya ketahui. Ini menargetkan perdagangan sekuritas, yang akan memiliki kunci lebih sedikit tetapi lebih banyak poin data per kunci dari skenario Anda.

Akan ada biaya untuk mentransfer nilai-nilai utama dari server GIS ke DB timeseries. Hipotesis saya adalah bahwa biaya ini akan dibayar kembali oleh pemrosesan yang lebih cepat dalam DB deret waktu tugas khusus. Dari kata-kata dalam pertanyaan, tampaknya satu instance tidak akan dapat menyimpan semua data sehingga beberapa lalu lintas lintas-server tampaknya tidak terhindarkan. Mengingat kecepatan relatif dari komponen-komponen itu, sepertinya mengirimkan keyet ke server jauh yang memiliki data yang di-cache akan lebih cepat daripada membaca data dari disk lokal.

Jika bagian-bagian pencarian-titik dan penghitungan nilai bisa bersifat lokal satu sama lain maka tentu saja saya berharap responsnya menjadi lebih cepat. Pemahaman saya (terbatas) adalah bahwa menemukan tetangga terdekat N ke titik tertentu adalah tugas yang tidak sepele. Inilah sebabnya saya menyarankan untuk menggunakan perangkat lunak tertentu untuk melakukannya. Jika titik-temuan dapat dikurangi menjadi

where latitude between x1 and x2
and logitude between y1 and y2

maka bagian itu dapat ditangani oleh perangkat lunak penyimpanan nilai dan GIS dihilangkan dari arsitektur.

Saya belum menerapkan sistem seperti itu. Aku benar-benar hanya berpikir keras di sini. Pada skala petabyte tidak ada solusi yang tersedia. Namun, ada banyak penyedia data satelit sehingga masalah Anda mudah ditangani. Semoga berhasil.

Michael Green
sumber
Setuju, ada dua kelas. 1) membuat gambar dari nilai-nilai tunggal dari banyak lokasi, 2) mendapatkan semua nilai historis di suatu lokasi. Semua pengukuran terkait dengan miliaran lokasi yang sama, satu-satunya perubahan adalah jumlah nilai historis di setiap titik. Sharding oleh wilayah adalah pendekatan yang saya cari, untuk alasan yang Anda nyatakan. Saya tidak mempertimbangkan untuk meneruskan nilai yang dikembalikan ke DB deret waktu terpisah. Saya akan berpikir pemilihan dan transfer ke dalam database deret waktu akan menambah terlalu banyak waktu untuk menjadikannya pilihan yang layak, kecuali saya salah memahami proposal Anda.
Azwok