DonanımHaber

Apache Flink etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Apache Flink etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Apache Flink ile Apache Sparkın birbirinden farklılığını anlatan iki senaryo verir misin? Flink'i biraz daha anlayalım



Elbette, Apache Flink ve Apache Spark arasındaki farkları iki senaryo üzerinden açıklayabilirim:


Senaryo 1: Gerçek Zamanlı Veri İşleme - Apache Flink

Apache Flink Senaryosu: Bir e-ticaret şirketi, müşterilerinin web sitesindeki davranışlarını anlık olarak analiz etmek ve gerçek zamanlı olarak kişiselleştirilmiş ürün önerileri sunmak istiyor. Bu durumda, şirket Apache Flink'i kullanıyor. Flink, düşük gecikme süresi ile yüksek hızda veri akışı işleme yeteneği sayesinde, müşterilerin davranışlarını anında analiz edebiliyor ve hemen geri bildirim sağlayabiliyor. Bu, müşteri deneyimini iyileştiriyor ve satışları artırıyor.


Senaryo 2: Büyük Ölçekli Veri İşlemesi ve Analizi - Apache Spark

Apache Spark Senaryosu: Bir araştırma kurumu, son on yılda toplanan büyük miktarda iklim verisini işlemek ve analiz etmek istiyor. Bu durumda, kurum Apache Spark'ı tercih ediyor. Spark, büyük veri setlerini hızlı bir şekilde işleyebilme ve karmaşık veri işleme işlemlerini (örneğin, makine öğrenimi, büyük veri analizi) kolaylaştıran zengin kütüphanelere sahip olmasıyla öne çıkıyor. Bu sayede, kurum veriler üzerinde derinlemesine analiz yapabiliyor ve değerli bilgiler elde edebiliyor.


Ana Farklar:

Gerçek Zamanlı İşleme: Flink, özellikle düşük gecikme süresi ve yüksek hızda veri akışı işleme konusunda güçlüdür, bu da onu gerçek zamanlı uygulamalar için daha uygun hale getirir.

Büyük Veri Analizi ve İşleme: Spark, büyük ölçekli veri setlerini işleme ve karmaşık veri analizleri yapma konusunda daha iyi performans gösterir. Spark'ın zengin kütüphaneleri (Spark SQL, MLlib vb.) geniş çaplı veri işleme senaryolarını destekler.


Apache Flinkin ML kütüphanesi yok mu?


Apache Flink doğrudan bir makine öğrenimi (ML) kütüphanesine sahip değildir, ancak Flink'in veri akışı işleme yetenekleri, makine öğrenimi uygulamaları için bir temel sağlar ve bu alanda kullanılabilir. Flink, özellikle gerçek zamanlı veri akışı işleme ve karmaşık olay işleme (CEP) gibi alanlarda güçlüdür. Bu yetenekler, makine öğrenimi modellerini gerçek zamanlı veri üzerinde eğitmek veya tahminler yapmak için kullanılabilir.


Apache Flink, makine öğrenimi işlemleri için doğrudan bir kütüphane sunmasa da, Flink üzerinde çalışacak şekilde entegre edilebilen harici makine öğrenimi kütüphaneleri ve çerçeveleri mevcuttur. Örneğin, Flink, Apache Kafka ile entegre edilerek gerçek zamanlı veri akışlarından veri alabilir ve bu veriler üzerinde makine öğrenimi modellerini uygulayabilir. Ayrıca, Flink, Python veya Scala gibi dillerde yazılmış makine öğrenimi algoritmalarını çalıştırmak için kullanılabilir.


Özetle, Apache Flink doğrudan bir ML kütüphanesi sunmasa da, makine öğrenimi uygulamaları için bir altyapı olarak kullanılabilir ve harici ML kütüphaneleriyle entegre edilebilir. Bu, özellikle gerçek zamanlı veri işleme ve tahmin yapma senaryolarında Flink'in güçlü olduğu alanlardır.


Karmaşık olay işleme (CEP) nedir?


Karmaşık Olay İşleme (Complex Event Processing - CEP), çok sayıda olayın veya veri akışının gerçek zamanlı olarak analiz edilmesi ve bu olaylardan anlamlı desenlerin, ilişkilerin veya durumların tespit edilmesi işlemidir. CEP, özellikle yüksek hızda gelen veri akışlarından gerekli bilgileri çıkarabilmek ve hızlı bir şekilde eyleme geçirilebilir bilgiler sağlamak için kullanılır. Bu yaklaşım, veri yoğun ve dinamik ortamlarda, özellikle de gerçek zamanlı karar verme gerektiren durumlarda oldukça değerlidir.


CEP'nin Temel Özellikleri:

Gerçek Zamanlı İşleme: CEP, verileri anında işler ve hemen analiz eder. Bu, hızlı karar verme ve hemen eyleme geçme imkanı sağlar.


Olay Desenlerinin Tanımlanması: CEP sistemleri, veri akışı içindeki belirli desenleri, örüntüleri ve ilişkileri tanımlayabilir. Örneğin, belirli bir olay sırası, frekansı veya kombinasyonu gibi.


Karmaşık Sorgular: CEP, karmaşık sorguları destekleyerek, birden fazla veri kaynağından gelen olayları birleştirme ve analiz etme yeteneğine sahiptir.


Anında Tepki: CEP, tanımlanan desenler veya koşullar gerçekleştiğinde hemen uyarılar veya eylemler başlatabilir.


CEP'nin Kullanıldığı Alanlar:

Finansal Hizmetler: Hisse senedi piyasalarında işlem desenleri, dolandırıcılık tespiti.

Ağ Güvenliği: Saldırı tespiti, ağ trafiği izleme.

E-Ticaret: Kullanıcı davranış analizi, gerçek zamanlı öneri sistemleri.

Üretim ve Lojistik: Süreç izleme, envanter yönetimi.

Akıllı Şehirler ve IoT: Sensör verilerinin izlenmesi, acil durum tepkileri.

CEP, Apache Flink gibi veri akışı işleme platformları ile entegre edilerek, bu tür gerçek zamanlı analizler ve işlemler için güçlü bir altyapı sağlar. Bu sayede, kurumlar ve organizasyonlar, büyük veri akışlarını etkili bir şekilde yönetebilir ve anlık olarak değerli bilgiler elde edebilirler.

Map Reduce nedir? Örnek bir senaryo. Apache Spark veya Apache Flink'de map reduce işlemleri mümkün müdür? Neden Java 8 yeterli kalmıyor?



MapReduce, büyük veri setlerini işlemek ve analiz etmek için kullanılan bir programlama modeli ve bir ilgili uygulama çerçevesidir. İki ana işlemden oluşur: Map ve Reduce.


Map İşlemi: Bu aşamada, büyük veri seti, daha küçük parçalara (genellikle anahtar-değer çiftleri şeklinde) bölünür. Bu parçalar paralel olarak işlenir. Örneğin, bir metin dosyasındaki her satır, bir Map işlemi tarafından ayrı ayrı işlenebilir.


Reduce İşlemi: Map işleminden çıkan sonuçlar, Reduce işlemine aktarılır. Reduce işlemi, bu ara sonuçları alır ve birleştirerek daha küçük bir sonuç seti oluşturur. Örneğin, kelime sayma görevinde, Reduce işlemi, her kelimenin toplam sayısını hesaplar.


MapReduce modeli, Hadoop gibi dağıtılmış sistemlerde yaygın olarak kullanılır. Bu modelin gücü, büyük veri setlerini hızlı ve etkili bir şekilde işleyebilmesi ve iş yükünü birden çok bilgisayar arasında dağıtabilmesidir. Bu da özellikle büyük veri analizi ve internet ölçekli uygulamalar için idealdir.


Örnek bir senaryo ve çözümünü verir misin?


MapReduce'da, her bir Map işlemi genellikle tek bir veri öğesini (örneğin, bir satır metin) işler, ancak Reduce işlemi, tüm Map işlemlerinden çıkan ve aynı anahtara (kelimeye) sahip tüm değerleri birleştirir. Bu nedenle, her bir Reduce işlemi, genellikle birden çok satırdan gelen verileri işler. Şimdi bu işlemi daha doğru bir şekilde açıklayayım:


Map Aşaması


Her bir Map işlemi, metin dosyasındaki bir satırı alır.

Her satırdaki her kelime için (kelime, 1) şeklinde anahtar-değer çiftleri üretir. Örneğin, "merhaba dünya" satırı için çıktı [(merhaba, 1), (dünya, 1)] olur.

Shuffle ve Sort Aşaması


Tüm Map işlemlerinden çıkan anahtar-değer çiftleri toplanır ve anahtarlarına göre gruplandırılır.

Bu, her kelimenin tüm geçişlerini bir araya getirir. Örneğin, eğer "merhaba" kelimesi birçok satırda geçiyorsa, tüm (merhaba, 1) çiftleri bir araya getirilir.

Reduce Aşaması


Her Reduce işlemi, belirli bir kelimeyi ve bu kelimenin tüm geçişlerini içeren bir listeyi alır (örneğin, merhaba için [1, 1, 1, ...]).

Reduce işlemi, bu listeyi toplayarak kelimenin toplam geçiş sayısını bulur. Örneğin, merhaba kelimesi için, bu liste toplandığında, kelimenin toplam geçiş sayısını verir (örneğin, (merhaba, 10)).

Bu şekilde, MapReduce modeli, büyük bir metin dosyasındaki her kelimenin toplam geçiş sayısını verimli bir şekilde hesaplayabilir. Her Reduce işlemi, farklı bir kelimeyi işler ve tüm metinde o kelimenin geçiş sayısını hesaplar.


Başka bir örnek 

Elbette, başka bir örnek olarak "Maksimum Sıcaklık Bulma" senaryosunu ele alalım. Bu senaryoda, hava durumu verilerinin bulunduğu büyük bir veri setini kullanarak, her şehir için kaydedilen maksimum sıcaklığı bulacağız.


Senaryo: Maksimum Sıcaklık Bulma

Veri setimiz, her bir satırda farklı bir şehrin günlük sıcaklık kaydını içeriyor. Amacımız, her şehir için kaydedilmiş maksimum sıcaklığı bulmak.


Çözüm: MapReduce ile Maksimum Sıcaklık Bulma


Map Aşaması


Her bir Map işlemi, veri setindeki bir satırı (şehir, sıcaklık) alır.

Her satırdaki sıcaklık değeri için bir anahtar-değer çifti oluşturulur, burada anahtar şehrin adı ve değer sıcaklık olur. Örneğin, "İstanbul, 34" satırı için çıktı (İstanbul, 34) olacaktır.

Shuffle ve Sort Aşaması


Tüm Map işlemlerinden çıkan anahtar-değer çiftleri toplanır ve anahtarlarına (şehir adlarına) göre gruplandırılır.

Bu, her şehir için tüm sıcaklık kayıtlarını bir araya getirir.

Reduce Aşaması


Her Reduce işlemi, belirli bir şehri ve bu şehre ait tüm sıcaklık kayıtlarını içeren bir listeyi alır.

Reduce işlemi, bu liste içindeki en yüksek sıcaklık değerini bulur ve bu değeri sonuç olarak döndürür. Örneğin, İstanbul için, tüm sıcaklık değerleri karşılaştırılır ve en yüksek olanı bulunur, diyelim ki İstanbul, 38.

Bu örnek, MapReduce modelinin farklı türde verilerle nasıl çalışabileceğini ve dağıtılmış bir şekilde büyük veri setlerinden anlamlı bilgiler çıkarabileceğini gösterir. Her Reduce işlemi, farklı bir şehri temsil eder ve o şehir için maksimum sıcaklık değerini hesaplar.


Apache Spark veya Apache Flink'de map reduce işlemleri mümkün müdür?


Evet, Apache Spark ve Apache Flink gibi modern veri işleme çerçeveleri, MapReduce işlemlerini destekler ve hatta bu işlemleri daha gelişmiş ve esnek yollarla yapabilir.


Apache Spark

Apache Spark, büyük veri işleme için geliştirilmiş bir açık kaynak çerçevesidir. Spark, geleneksel MapReduce modelini genişletir ve daha hızlı performans sunar, özellikle bellek içi (in-memory) veri işleme sayesinde. Spark'ta MapReduce işlemleri şu şekilde gerçekleştirilebilir:


Map İşlemi: Spark, map() fonksiyonunu kullanarak veri üzerinde dönüşümler gerçekleştirir. Bu, her veri öğesine bir fonksiyon uygular ve yeni bir veri seti oluşturur.

Reduce İşlemi: Spark, reduce() fonksiyonu ile veri öğelerini birleştirerek tek bir değer elde eder. Bu, özellikle toplama, maksimum veya minimum değer bulma gibi işlemlerde kullanılır.

Spark ayrıca daha gelişmiş dönüşümler ve eylemler sunar, örneğin filter(), flatMap(), reduceByKey(), groupBy(), ve daha fazlası.


Apache Flink

Apache Flink, gerçek zamanlı veri akışı işleme ve toplu veri işleme için tasarlanmış bir başka popüler açık kaynak veri işleme çerçevesidir. Flink, Spark gibi yüksek performanslı bellek içi işlemler sunar ve ayrıca güçlü bir akış işleme yeteneğine sahiptir. Flink'te MapReduce işlemleri şöyle yapılabilir:


Map İşlemi: Flink, map() fonksiyonu ile her veri öğesine bir dönüşüm uygulayabilir.

Reduce İşlemi: Flink'in reduce() fonksiyonu, veri öğelerini kümülatif bir şekilde birleştirir ve sonuçta tek bir değer üretir.

Flink, zaman pencereleri, durum yönetimi ve karmaşık olay işleme (complex event processing - CEP) gibi özellikleriyle gerçek zamanlı veri akışı işleme konusunda öne çıkar.


Her iki çerçeve de, geleneksel MapReduce modelinin temel prensiplerini kullanırken, daha geniş özellik setleri ve daha iyi performansla büyük veri işleme yetenekleri sunar.

Aynı fonksiyonlar Java'da da Java 8 sonrası var. Spark veya Flink kullanmamamın sebebi nedir?

Java 8 ve sonrasında gelen lambda ifadeleri ve Stream API, Java'ya fonksiyonel programlama özellikleri getirerek map, reduce, filter gibi yüksek seviye veri işleme fonksiyonları sunar. Bu fonksiyonlar, Java'nın kendi standart kütüphanesinde çalışır ve tek bir JVM (Java Virtual Machine) örneği üzerinde etkili bir şekilde çalışabilir. Ancak, Apache Spark ve Apache Flink gibi çerçeveler, Java'nın sunduğu bu fonksiyonlardan daha fazlasını sağlar ve özellikle büyük veri işleme için bazı önemli avantajlar sunar:


Dağıtılmış İşleme: Spark ve Flink, çoklu makineler üzerinde dağıtılmış işleme yapabilme yeteneğine sahiptir. Bu, büyük veri setlerini işlerken önemlidir çünkü tek bir makinenin kaynakları (CPU, bellek) genellikle yetersiz kalır.


Optimize Edilmiş Veri İşleme: Bu çerçeveler, büyük veri setleri üzerinde çalışmak için optimize edilmiştir. Örneğin, Spark bellek içi işleme (in-memory processing) yaparak veri işleme hızını artırır. Flink, gerçek zamanlı akış işleme (stream processing) ve durum yönetimi konularında güçlüdür.


Hata Toleransı ve Yüksek Erişilebilirlik: Dağıtılmış sistemlerde hata toleransı önemlidir. Spark ve Flink, veri kaybını önlemek ve kesintisiz işleme sağlamak için gelişmiş hata toparlama mekanizmaları sunar.


Ölçeklenebilirlik: Bu çerçeveler, gerektiğinde küçük bir veri setinden büyük veri setlerine kadar ölçeklenebilir. İhtiyaç arttıkça daha fazla makine eklemek kolaydır.


Ekosistem ve Entegrasyon: Spark ve Flink, Hadoop HDFS, Apache Kafka, cloud storage sistemleri gibi popüler veri depolama sistemleriyle entegre çalışabilir ve geniş bir ekosisteme sahiptir.


Gelişmiş Analitik ve Makine Öğrenimi Kütüphaneleri: Özellikle Spark, makine öğrenimi ve graf işleme için gelişmiş kütüphanelere (MLlib, GraphX) sahiptir.


Eğer iş yükünüz küçük ve tek bir makinede çalıştırılabilirse, Java'nın kendi fonksiyonları yeterli olabilir. Ancak büyük veri setleri üzerinde çalışıyorsanız, dağıtılmış işleme, hata toleransı, ölçeklenebilirlik ve gelişmiş veri işleme yetenekleri için Spark veya Flink gibi çerçeveler kullanmak daha uygun olacaktır.

Movielens data seti üzerinde Apache Flink uygulama örneği



Yeni bir maven projesi oluşturuyoruz.

pom.xml:



<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelversion>4.0.0</modelversion>

    <groupid>com.turkninja</groupid>
    <artifactid>flink-movie-example</artifactid>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java .version="">1.8</java>
        <flink .version="">1.8.0</flink>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-quickstart-java -->
        <dependency>
            <groupid>org.apache.flink</groupid>
            <artifactid>flink-java</artifactid>
            <version>${flink.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
        <dependency>
            <groupid>org.apache.flink</groupid>
            <artifactid>flink-clients_2.11</artifactid>
            <version>${flink.version}</version>
        </dependency>

    </dependencies>


</project>



Programı çalıştıracağımız main methodunun ve Movie classının bulunduğu sınıf
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple3;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author ali turgut bozkurt
 * Created at 5/29/2019
 */

public class FilterMovie {

    public static void main(String[] args) throws Exception {

        final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        DataSource<tuple3 ong="" string="">&gt; lines = env.readCsvFile("src/main/resources/ml-latest-small/movies.csv")
                .ignoreFirstLine()
                .parseQuotedStrings('"')
                .ignoreInvalidLines()
                .types(Long.class, String.class, String.class);


        DataSet<movie> movies = lines.map(new MapFunction<tuple3 ong="" string="">, Movie&gt;() {

            public Movie map(Tuple3<long string=""> movieLine) throws Exception {
                String name = movieLine.f1;
                String[] genres = movieLine.f2.split("\\|");

                return new Movie(name, new HashSet<string>(Arrays.asList(genres)));
            }
        });

        movies = movies.filter(new FilterFunction<movie>() {
            public boolean filter(Movie movie) throws Exception {
                return movie.getGenres().contains("Action");
            }
        });

        System.out.println(movies.count());

        movies.print();

    }

    public static class Movie {
        private String name;

        private Set<string> genres;

        public String getName() {
            return name;
        }

        public Movie(String name, Set<string> genres) {
            this.name = name;
            this.genres = genres;
        }

        public Set<string> getGenres() {
            return genres;
        }

        @Override
        public String toString() {
            return "Movie{" +
                    "name='" + name + '\'' +
                    ", genres=" + genres +
                    '}';
        }
    }
}


Datasetimizi buradan indiriyouruz.

zip dosyasını açıp src/main/resources altına açıyoruz.

 Uygulamayı çalıştırdığımızda datasetimizde bulunan tüm action türünde filmlerin sayısını ve listesini ekranda görebiliriz.

 1828

Movie{name='Jet Li's Fearless (Huo Yuan Jia) (2006)', genres=[Action, Drama]} Movie{name='Fast and the Furious: Tokyo Drift, The (Fast and the Furious 3, The) (2006)', genres=[Action, Drama, Thriller, Crime]} Movie{name='Superman Returns (2006)', genres=[Action, Sci-Fi, Adventure, IMAX]} Movie{name='Army of Shadows (L'armée des ombres) (1969)', genres=[Action, Drama, Thriller, War]} Movie{name='Snakes on a Plane (2006)', genres=[Action, Horror, Thriller, Comedy]} Movie{name='Talladega Nights: The Ballad of Ricky Bobby (2006)', genres=[Action, Comedy]} Movie{name='Night at the Museum (2006)', genres=[Action, Fantasy, IMAX, Comedy]} Movie{name='Miami Vice (2006)', genres=[Action, Drama, Thriller, Crime]} Movie{name='Crank (2006)', genres=[Action, Thriller]} Movie{name='Chaos (2005)', genres=[Action, Drama, Thriller, Crime]} Movie{name='Crime Busters (1977)', genres=[Action, Adventure, Crime, Comedy]} Movie{name='Covenant, The (2006)', genres=[Action, Horror, Thriller]} Movie{name='Flyboys (2006)', genres=[Action, Adventure, Drama, War]} Movie{name='Guardian, The (2006)', genres=[Action, Adventure, Drama]} Movie{name='Marine, The (2006)', genres=[Action, Drama, Thriller]} Movie{name='Feast (2005)', genres=[Action, Horror, Thriller, Comedy]} Movie{name='Children of Men (2006)', genres=[Action, Sci-Fi, Adventure, Drama, Thriller]} Movie{name='Casino Royale (2006)', genres=[Action, Adventure, Thriller]} Movie{name='Déjà Vu (Deja Vu) (2006)', genres=[Action, Sci-Fi, Thriller]} Movie{name='Harsh Times (2006)', genres=[Action, Drama, Crime]} Movie{name='Blood Diamond (2006)', genres=[Action, Adventure, Drama, Thriller, Crime, War]} Movie{name='Eragon (2006)', genres=[Action, Adventure, Fantasy]} Movie{name='Rocky Balboa (2006)', genres=[Action, Drama]} Movie{name='Dam Busters, The (1955)', genres=[Action, Drama, War]} Movie{name='DOA: Dead or Alive (2006)', genres=[Action, Adventure]} Movie{name='Curse of the Golden Flower (Man cheng jin dai huang jin jia) (2006)', genres=[Action, Drama]} Movie{name='Black Christmas (2006)', genres=[Action, Horror, Thriller]} ..... ..... ..... Movie{name='Transformers: Age of Extinction (2014)', genres=[Action, Sci-Fi, Adventure]} Movie{name='Purge: Anarchy, The (2014)', genres=[Action, Horror, Thriller]} Movie{name='Guardians of the Galaxy (2014)', genres=[Action, Sci-Fi, Adventure]} Movie{name='The Expendables 3 (2014)', genres=[Action, Adventure]} Movie{name='Hercules (2014)', genres=[Action, Adventure]} Movie{name='Batman: Assault on Arkham (2014)', genres=[Action, Thriller, Crime, Animation]} Movie{name='Jupiter Ascending (2015)', genres=[Action, Sci-Fi, Adventure]} Movie{name='Teenage Mutant Ninja Turtles (2014)', genres=[Action, Adventure, Comedy]} Movie{name='Revenge of the Green Dragons (2014)', genres=[Action, Drama, Crime]} Movie{name='Sin City: A Dame to Kill For (2014)', genres=[Action, Thriller, Crime]} Movie{name='Maze Runner, The (2014)', genres=[Action, Sci-Fi, Mystery]} Movie{name='Walk Among the Tombstones, A (2014)', genres=[Action, Thriller, Crime, Mystery]}

Kaynak : pluralsight

Rastgele İçerik

© tüm hakları saklıdır
made with by templateszoo