Mengapa anda mesti menggunakan Presto untuk analisis ad hoc

Presto! Bukan hanya mantra untuk menggembirakan penonton anda setelah melakukan trik ajaib, tetapi juga nama yang semakin banyak digunakan ketika membincangkan cara mencari data besar. Walaupun terdapat banyak penyebaran Presto di alam liar, teknologi - enjin pertanyaan SQL yang diedarkan yang menyokong semua jenis sumber data - masih asing bagi banyak pembangun dan penganalisis data yang dapat memanfaatkannya.

Dalam artikel ini, saya akan membincangkan Presto: apakah itu, dari mana asalnya, bagaimana ia berbeza dengan penyelesaian pergudangan data lain, dan mengapa anda harus mempertimbangkannya untuk penyelesaian data besar anda.

Presto vs Hive

Presto berasal dari Facebook pada tahun 2012. Sumber terbuka pada tahun 2013 dan dikendalikan oleh Presto Foundation (sebahagian daripada Linux Foundation), Presto telah mengalami peningkatan populariti yang berterusan selama bertahun-tahun. Hari ini, beberapa syarikat telah membina model perniagaan di sekitar Presto, seperti Ahana, dengan penawaran analisis ad hoc berasaskan PrestoDB.

Presto dibangun sebagai alat untuk menyediakan pengguna akhir akses ke set data yang sangat besar untuk melakukan analisis ad hoc. Sebelum Presto, Facebook akan menggunakan Hive (juga dibuat oleh Facebook dan kemudian disumbangkan kepada Yayasan Perisian Apache) untuk melakukan analisis semacam ini. Ketika kumpulan data Facebook berkembang, Hive didapati tidak cukup interaktif (baca: terlalu lambat). Ini disebabkan oleh asas Hive adalah MapReduce, yang, pada masa itu, memerlukan set data perantaraan untuk diteruskan ke HDFS. Itu bermaksud banyak I / O ke disk untuk data yang akhirnya dibuang. 

Presto mengambil pendekatan yang berbeza untuk melaksanakan pertanyaan tersebut untuk menjimatkan masa. Daripada menyimpan data perantaraan pada HDFS, Presto membolehkan anda menarik data ke dalam memori dan melakukan operasi pada data di sana dan bukannya meneruskan semua set data perantaraan ke disk. Sekiranya itu terdengar biasa, anda mungkin pernah mendengar Apache Spark (atau sejumlah teknologi lain di luar sana) yang mempunyai konsep asas yang sama untuk menggantikan teknologi berasaskan MapReduce dengan berkesan. Dengan menggunakan Presto, saya akan menyimpan data di mana ia berada (di Hadoop atau, seperti yang akan kita lihat, di mana sahaja) dan melakukan pelaksanaan dalam memori di seluruh sistem yang diedarkan, mengubah data antara pelayan mengikut keperluan. Saya mengelakkan menyentuh cakera apa pun, akhirnya mempercepat masa pelaksanaan pertanyaan.

Bagaimana Presto berfungsi

Berlainan dengan gudang data tradisional, Presto disebut sebagai mesin pelaksanaan pertanyaan SQL. Gudang data mengawal bagaimana data ditulis, di mana data itu berada, dan bagaimana ia dibaca. Setelah anda memasukkan data ke gudang anda, sukar untuk mengeluarkannya kembali. Presto mengambil pendekatan lain dengan mencabut penyimpanan data dari pemprosesan, sambil memberikan sokongan untuk bahasa pertanyaan ANSI SQL yang sama seperti yang biasa anda gunakan.

Pada intinya, Presto melaksanakan pertanyaan mengenai set data yang disediakan oleh pemalam, khususnya Penyambung. Penyambung menyediakan kaedah untuk Presto membaca (dan bahkan menulis) data ke sistem data luaran. Penyambung Hive adalah salah satu penyambung standard, menggunakan metadata yang sama yang akan anda gunakan untuk berinteraksi dengan HDFS atau Amazon S3. Oleh kerana kesambungan ini, Presto adalah pengganti untuk organisasi yang menggunakan Hive hari ini. Ia dapat membaca data dari skema dan jadual yang sama menggunakan format data yang sama - ORC, Avro, Parquet, JSON, dan banyak lagi. Sebagai tambahan kepada penyambung Hive, anda akan menemui penyambung untuk Cassandra, Elasticsearch, Kafka, MySQL, MongoDB, PostgreSQL, dan banyak lagi yang lain. Penyambung disumbangkan kepada Presto sepanjang masa, memberikan potensi kepada Presto untuk dapat mengakses data di mana sahaja ia berada.

Kelebihan model storan yang dipisahkan ini ialah Presto dapat memberikan satu pandangan gabungan semua data anda - tidak kira di mana ia berada. Ini meningkatkan keupayaan pertanyaan ad hoc ke tahap yang belum pernah dicapai sebelumnya, sementara juga menyediakan masa pertanyaan interaktif untuk set data besar anda (selagi anda mempunyai infrastruktur untuk menyandarkannya, di tempat atau awan).

Mari kita lihat bagaimana Presto digunakan dan bagaimana menjalankan pertanyaan anda. Presto ditulis dalam Java, dan oleh itu memerlukan JDK atau JRE untuk dapat memulakan. Presto digunakan sebagai dua perkhidmatan utama, seorang Penyelaras tunggal dan banyak Pekerja . Perkhidmatan Penyelaras secara efektif adalah otak operasi, menerima permintaan pertanyaan dari klien, menguraikan pertanyaan, membuat rancangan pelaksanaan, dan kemudian menjadwalkan pekerjaan yang harus dilakukan di banyak perkhidmatan Pekerja. Setiap Pekerja memproses sebahagian daripada keseluruhan pertanyaan secara selari, dan anda boleh menambahkan perkhidmatan Pekerja ke penyebaran Presto anda agar sesuai dengan permintaan anda. Setiap sumber data dikonfigurasikan sebagai katalog , dan anda boleh meminta seberapa banyak katalog yang anda inginkan dalam setiap pertanyaan.

Ahana

Presto diakses melalui pemacu JDBC dan disatukan dengan hampir semua alat yang dapat menyambung ke pangkalan data menggunakan JDBC. Antara muka baris perintah Presto, atau CLI, sering menjadi titik permulaan ketika mula meneroka Presto. Sama ada cara, pelanggan menyambung ke Penyelaras untuk mengeluarkan pertanyaan SQL. Pertanyaan itu diurai dan disahkan oleh Penyelaras, dan dimasukkan ke dalam rancangan pelaksanaan pertanyaan. Rancangan ini memperincikan bagaimana pertanyaan akan dilaksanakan oleh pekerja Presto. Pelan pertanyaan (biasanya) bermula dengan satu atau lebih imbasan jadual untuk menarik data dari simpanan data luaran anda. Kemudian terdapat satu siri pengendali untuk melakukan unjuran, penapis, penyertaan, kumpulan, pesanan, dan semua jenis operasi lain. Rancangan berakhir dengan set hasil akhir dihantar kepada pelanggan melalui Penyelaras.Rancangan pertanyaan ini sangat penting untuk memahami bagaimana Presto melaksanakan pertanyaan anda, dan juga dapat membedah prestasi pertanyaan dan mencari kemungkinan masalah.

Contoh pertanyaan Presto

Mari lihat pertanyaan dan rancangan pertanyaan yang sesuai. Saya akan menggunakan pertanyaan TPC-H, alat penanda aras yang biasa digunakan untuk pangkalan data SQL. Ringkasnya, TPC-H mendefinisikan satu set jadual dan pertanyaan standard untuk menguji kelengkapan bahasa SQL serta cara untuk menanda aras pelbagai pangkalan data. Data tersebut dirancang untuk kes penggunaan perniagaan, yang berisi pesanan penjualan barang yang dapat disediakan oleh sejumlah besar persediaan. Presto menyediakan Penyambung TPC-H yang menghasilkan data dengan pantas - alat yang sangat berguna ketika memeriksa Presto.

PILIH

  SUM (l.extendedprice * l.discount) SEBAGAI pendapatan

DARI lineitem l

DI MANA

  l.shipdate> = TARIKH '1994-01-01'

   DAN l.shipdate <DATE '1994-01-01' + INTERVAL '1' TAHUN

   DAN l.diskaun ANTARA .06 - 0.01 DAN .06 + 0.01

   DAN l. Kuantiti <24;

Ini adalah pertanyaan nombor enam, yang dikenali sebagai Pertanyaan Perubahan Hasil Ramalan. Mengutip dokumentasi TPC-H, "pertanyaan ini mengukur jumlah kenaikan pendapatan yang akan terjadi akibat penghapusan diskaun seluruh syarikat tertentu dalam julat peratusan tertentu pada tahun tertentu."

Presto memecahkan pertanyaan menjadi satu atau lebih peringkat, juga disebut fragmen , dan setiap peringkat mengandungi beberapa operator . Operator adalah fungsi tertentu dari rencana yang dijalankan, baik scan, filter, join, atau pertukaran. Pertukaran sering memecah tahap. Pertukaran adalah bahagian dari rancangan di mana data dihantar melalui rangkaian kepada pekerja lain di kluster Presto. Ini adalah bagaimana Presto berjaya memberikan skalabilitas dan kinerjanya - dengan membagi pertanyaan menjadi beberapa operasi yang lebih kecil yang dapat dilakukan secara selari dan memungkinkan data diagihkan semula ke seluruh kluster untuk melakukan gabungan, kumpulan-kumpulan, dan urutan set data. Mari lihat rancangan pertanyaan yang diedarkan untuk pertanyaan ini. Perhatikan bahawa rancangan pertanyaan dibaca dari bawah ke atas.

 Fragmen 0 [SINGLE]

     - Hasil [hasil] => [jumlah: dua kali ganda]       

             hasil: = jumlah   

         - Agregat (AKHIR) => [jumlah: dua kali ganda]         

                 jumlah: = "presto.default.sum" ((jumlah_4))          

             - LocalExchange [SINGLE] () => [jumlah_4: berganda]  

                 - Sumber Jauh [1] => [jumlah_4: dua kali ganda]      

 Pecahan 1 

     - Agregat (PARTIAL) => [jumlah_4: berganda]  

             sum_4: = "presto.default.sum" ((expr))  

         - ScanFilterProject [table = TableHandle {connectorId = 'tpch', connectorHandle = "lineitem: sf1.0", layout = "Opsional [lineitem: sf1.0]"}, dikelompokkan = false, filterPredicate = ((diskaun ANTARA (DOUBLE 0.05 ) DAN (BERGANDA 0.07)) DAN ((kuantiti) = (TARIKH 1994-01-01)) DAN ((tarikh penghantaran) [expr: double]

                 expr: = (harga diperpanjang) * (diskaun)   

                 extendedprice := tpch:extendedprice

                 discount := tpch:discount         

                 shipdate := tpch:shipdate 

                 quantity := tpch:quantity  

This plan has two fragments containing several operators. Fragment 1 contains two operators. The ScanFilterProject scans data, selects the necessary columns (called projecting) needed to satisfy the predicates, and calculates the revenue lost due to the discount for each line item. Then a partial Aggregate operator calculates the partial sum. Fragment 0 contains a LocalExchange operator that receives the partial sums from Fragment 1, and then the final aggregate to calculate the final sum. The sum is then output to the client.

When executing the query, Presto scans data from the external data source in parallel, calculates the partial sum for each split, and then ships the result of that partial sum to a single worker so it can perform the final aggregation. Running this query, I get about $123,141,078.23 in lost revenue due to the discounts.

      revenue       

----------------------

 1.2314107822830005E8

As queries grow more complex, such as joins and group-by operators, the query plans can get very long and complicated. With that said, queries break down into a series of operators that can be executed in parallel against data that is held in memory for the lifetime of the query.

As your data set grows, you can grow your Presto cluster in order to maintain the same expected runtimes. This performance, combined with the flexibility to query virtually any data source, can help empower your business to get more value from your data than ever before — all while keeping the data where it is and avoiding expensive transfers and engineering time to consolidate your data into one place for analysis. Presto!

Ashish Tadose is co-founder and principal software engineer at Ahana. Passionate about distributed systems, Ashish joined Ahana from WalmartLabs, where as principal engineer he built a multicloud data acceleration service powered by Presto while leading and architecting other products related to data discovery, federated query engines, and data governance. Previously, Ashish was a senior data architect at PubMatic where he designed and delivered a large-scale adtech data platform for reporting, analytics, and machine learning. Earlier in his career, he was a data engineer at VeriSign. Ashish is also an Apache committer and contributor to open source projects.

Forum Teknologi Baru menyediakan tempat untuk meneroka dan membincangkan teknologi perusahaan yang baru muncul dalam kedalaman dan luas yang belum pernah terjadi sebelumnya. Pemilihannya bersifat subjektif, berdasarkan pilihan teknologi yang kami percayai penting dan menarik minat pembaca. tidak menerima jaminan pemasaran untuk penerbitan dan berhak untuk mengedit semua kandungan yang disumbangkan. Hantarkan semua pertanyaan ke [email protected]