Baru -baru ini, Elasticsearch 5.4 (ES) adalah versi yang relatif baru. Ada banyak masalah selama penggunaan, yang sakit kepala, tetapi masalahnya akhirnya terpecahkan.
Pertanyaan 1: Esclient lambat didapat, dan klien tidak dapat diperoleh: Gagal membuat loop acara anak
Karena bisnis perlu mengunggah kumpulan file tanpa mengunggah indeks ES, Anda harus mendapatkan koneksi dan kemudian beroperasi setiap kali Anda menambahkan indeks. Terutama dalam batch besar, jumlah akuisisi jelas sangat besar. Alasan utama untuk masalah ini adalah bahwa kita sering beroperasi di loop. Misalnya, kita perlu mendapatkan 100 file dalam batch. Untuk mengurangi waktu mendapatkan klien ES, kami akhirnya mengadopsi solusi, yaitu, menginisialisasi koneksi ketika layanan dimulai, dapatkan pada satu waktu, dan kemudian memanggilnya langsung nanti. Setelah seluruh file batch diunggah, indeks ES akhirnya ditambahkan, alih -alih menambahkan satu file pada satu waktu. Metode ini jelas tidak mengharuskan setiap batch untuk mendapatkan koneksi, yang sangat meningkatkan efisiensi eksekusi.
Pertama, ketika layanan dimulai, kami menginisialisasi klien ES statis di kelas startup:
Private Static Elasticsearchutil Elasticsearchutil = New Elasticsearchutil (); klien transportasi statis publik = Elasticsearchutil.getClient ();
Kemudian panggil langsung saat digunakan:
Klien klien = main.client;
Ini dapat sangat mengurangi jumlah koneksi ke klien ES, sehingga meningkatkan efisiensi.
Kode ES adalah sebagai berikut:
GetClient Transportasi Umum () {String [] iparr = configutil.getValue ("ESIP"). SPLET (","); Pengaturan Pengaturan = Pengaturan.Builder (). Put ("Thread_pool.generic.core", 5) .put ("Thread_pool.generic.max", 10) .core "," Proses ") .put (" thread_pool.generic.max ", 10) .put", "Proses") .Put ("thread_pool.generic.max", 10). .put (constants.esclustername, configutil.getValue ("clustername")). build (); klien transportClient = prebuiltTransportclient baru (pengaturan); untuk (string ip: iparr) {transportAddress address = inetsockettransportAddress baru (inetaddresses.forstring (ip), 9300); client.addtransportAddresses (alamat);} kembalikan klien;}Pertanyaan 2: memori overflow: java.lang.outofmemory: Tidak dapat membuat utas asli baru
Selama proses pengembangan proyek, overflow memori adalah hal yang sangat merepotkan. Saya menemuinya selama penggunaan ES, dan itu sangat sering, terutama selama tes stres skala besar. Saya memikirkan banyak cara untuk mengoptimalkan memori JVM, tetapi tidak ada efek, dan masalahnya masih belum terpecahkan. Akhirnya, ketika melihat kode sumber, saya menemukan alasan. Dikombinasikan dengan pengecualian pelaporan kesalahan, ini karena sejumlah besar utas secara otomatis dibuat selama penggunaan dengan ES, yang melebihi kapasitas sistem, yang menyebabkan memori meluap. Saat mempelajari kode sumber, saya menemukan bahwa jumlah utas yang dibuat oleh ES dapat dikontrol melalui pengaturan. Berikut adalah jumlah default utas pembuatan ES:
thread_pool.generic.core = nilai default --- 4thread_pool.generic.max = Nilai default-min (512, maks (4*nomor prosesor, 128)) nomor prosesor = nomor prosesor CPU
CPU kami adalah 10 core dan 40 utas
Dilihat dari hasil perhitungan, jika nilai default digunakan, jumlah utas yang dapat dibuat adalah nilai besar, yang jauh di luar kapasitas sistem itu sendiri. Ini terutama menyesuaikan nilai pengaturan. Setelah penyesuaian, kami mengubah nilai default ES sebagai berikut:
Pengaturan Pengaturan = Pengaturan.Builder (). Put ("thread_pool.generic.core", 5) .put ("thread_pool.generic.max", 10) .put ("prosesor", 5) .put (konstants.esclustername, configutil.getValue ("clustername")). Ini adalah pengaturan Pengaturan sebelumnya = settings.builder (). Put ("thread_pool.generic.core", 5) .put (constants.esclustername, configutil.getValue ("clustername")). Build ();Setelah pengujian, ES menciptakan sejumlah kecil utas dan memenuhi kebutuhan pengembangan kami, dan tidak ada masalah meluap memori lagi.
Ringkasan pertanyaan umum di atas berdasarkan Elasticsearch 5.4 adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.