Apache Spark va Amazon S3 - Gotchalar va eng yaxshi amaliyotlar

S3 - bu fayllar tizimi emas, balki ob'ektlar ombori, shuning uchun natijaviy ketma-ketlikdan kelib chiqadigan muammolar, atom bo'lmagan nomlar dastur kodida ko'rib chiqilishi kerak. Fayl tizimidagi katalog serveri fayl nomining xesh algoritmi bilan almashtirildi. Bu narsalar ro'yxati, katalog operatsiyalari, o'chirish va nomini o'zgartirish uchun juda yomon (nusxa ko'chirish va o'chirish, chunki ob'ektlar do'konlarida nomlar yo'q)

S3A (URI sxemasi: s3a: //) - Hadoop 2.7+ dan foydalanishni boshlang. S3a - bu Hadoop 2.7 uchun S3 Client tomonidan tavsiya etilgan va keyinchalik S3a yanada samarali va katta fayllarni (5TBgacha) qo'llab-quvvatlaydi va ko'p qismli yuklashni qo'llab-quvvatlaydi. S3n: // URL-lariga kirish mumkin bo'lgan barcha ob'ektlarga URL sxemasini almashtirish orqali s3a-dan kirish mumkin. S3N-ga qarshi eng ko'p xato xabarlari WONTFIX sifatida yopiladi.

Spark 2.0.1-ni S3a bilan ishlash Spark 2.0.1-ga sinf stolingizda hadoop-aws-2.7.3.jar, aws-java-sdk-1.7.4.jar, joda-time-2.9.3.jar-dan foydalaning; spark-default.conf-ni AWS tugmachalari va S3A FileSystemClass yordamida yangilashni unutmang.

Spark.hadoop.fs.s3a.access.key XXXXXXX
uchqun.hadoop.fs.s3a.secret.key XXXXXXX
uchqun.hadoop.fs.s3a.impl org.apache.hadoop.fs.s3a.S3AFileSystem

Ma'lumotlar ro'yxatidan aniq foydalaning, chunki so'rovlarni qayta tartiblash va pastga siljitish predikatsiyasidan foydalanish imkoniyati mavjud emas va natijada so'rovlaringizni tezlashtiradigan kamroq ma'lumotlar olinadi.

Agar siz bir xil ma'lumotlarni bir necha marotaba o'qiyotgan bo'lsangiz, haqiqiy fayl tizimining yaxshi o'qish qobiliyatidan foyda olish uchun .cache yoki s3distcp-dan foydalanib, fayllarni mahalliy EMR klasteringizga o'tkazing. S3distcp-ning groupBy opsiyasi katta miqdordagi kichik fayllarni birlashtirish orqali kichik fayl muammosini hal qilish uchun juda yaxshi tanlovdir.

Bu meni ko'p sonli kichik fayllarni o'qish masalasiga olib keladi. Agar fayllarni asbob yordamida birlashtirish imkoni bo'lmasa, quyidagi S3 kodni sinab ko'ring va sekin S3 kataloglar ro'yxatiga o'ting.

com.amazonaws.services.s3._, model._ fayllarini import qilish
    com.amazonaws.auth.BasicAWSCredentialentials-ni import qiling

    val so'rov = yangi ListObjectsRequest ()
    request.setBucketName (chelak)
    request.setPrefix (prefiks)
    request.setMaxKeys (sahifa uzunligi)
    def s3 = yangi AmazonS3Client (yangi BasicAWSCredentialies (kalit, maxfiy))

    val objs = s3.listObjects (request) // E'tibor bering, ushbu usul yuqoridagi "pageLength" dan uzunroq bo'lsa, kesilgan ma'lumotlarni qaytaradi. Siz bu bilan shug'ullanishingiz kerak bo'lishi mumkin.
    sc.parallelize (objs.getObjectSummaries.map (_. getKey). ro'yxat)
        .flatMap {key => Source.fromInputStream (s3.getObject (chelak, kalit) .getObjectContent: InputStream) .getLines}

Spark.sql.parquet.filterPushdown parametrining to'g'riligiga va spark.sql.parquet.mergeSchema-ning noto'g'ri ekanligiga ishonch hosil qiling (yozuv paytida sxema birlashmasligini oldini olish uchun, siz yozishingiz bosqichini sekinlashtiradi). Yaxshiyamki, Spark 2.0 to'g'ri sozlamalarga ega

Siz nima uchun ish tugash arafasida jurnallarga hech narsa yozilmayotganligi va barcha uchqunlar to'xtab qolganga o'xshaydi, ammo natijalar S3-ning chiqish katalogida hali yo'q ... deb o'yladingizmi? Har safar bajaruvchilar ish natijasini yozganda, ularning har biri asosiy katalog tashqarisidagi vaqtinchalik katalogga yozishadi, bu erda fayllar yozilishi kerak edi va barcha ijrochilar nomini o'zgartirgandan so'ng, atom eksklyuzivligini olish uchun. Bu hdfs kabi standart fayl tizimida hamma narsa yaxshi, lekin nomlarni zudlik bilan bajarish mumkin, ammo S3 kabi ob'ektlar do'konida bu qulay emas, chunki S3-da nomlar 6MB / s da bajariladi.

Iloji bo'lsa, ishlarning natijasini EMR hdfs-ga yozing (deyarli lahzali nomlardan foydalanish va mahalliy hdf-larning yaxshi IO faylini olish uchun) va fayllarni S3-ga ko'chirish uchun dstcp qadamini qo'shib, o'zingizning ichki makonlaringiz bilan ishlashning barcha muammolaridan xalos bo'ling. fayllar tizimi bo'lishga intilayotgan ob'ekt do'koni. Shuningdek, mahalliy hdfs-ga yozish DirectOutputCommiter bilan bog'liq bo'lgan tuzoqqa tushmasdan qochish vazifalarini boshqarish uchun chayqovchiliklarni faollashtirishga imkon beradi.

Agar siz S3-ni chiqish katalogi sifatida ishlatishingiz kerak bo'lsa, quyidagi Spark konfiguratsiyalari o'rnatilganligiga ishonch hosil qiling

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
uchqun

Eslatma: DirectParquetOutputCommitter ma'lumotlar yo'qolish ehtimoli tufayli Spark 2.0-dan o'chirildi. Afsuski, S3a-dan izchillik yaxshilanmaguncha, biz aylanma yo'llar bilan ishlashimiz kerak. Hadoop 2.8-da ishlar yaxshilanmoqda

Leksikografik tartibda kalit nomlaridan saqlaning. Atrofni aniqlash uchun xesh / tasodifiy prefikslardan foydalanish yoki sana vaqtini teskari tartibda ishlatish mumkin. Hiyla-nayrang - bu sizning kalitingizning chap tomoniga filtrlaydigan eng ko'p uchraydigan narsalarni qo'yib, kalitlarga ierarxik ravishda nom berishdir. Hech qachon DNS bilan bog'liq muammolar tufayli chelak nomlarida pastki chiziqlarga ega bo'lmang.

Fs.s3a.fast.upload-ni yoqish bitta faylning qismlarini Amazon S3-ga parallel ravishda yuklaydi

Yaqinda Sparkni S3 bilan ishlashga yordam berish uchun men ishlab chiqarishda yuzaga kelgan muammolarning miyadagi axlati edi. Keyingi xabarda chuqurroq qazishim uchun bu haqida ko'proq ma'lumot oling.