{"id":35487,"date":"2025-11-30T08:40:51","date_gmt":"2025-11-30T05:40:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35487"},"modified":"2025-11-30T08:40:51","modified_gmt":"2025-11-30T05:40:51","slug":"apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/","title":{"rendered":"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz"},"content":{"rendered":"<p><body><\/p>\n<h2>Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz<\/h2>\n<h3>Giri\u015f: B\u00fcy\u00fck Veri D\u00fcnyas\u0131nda Apache Spark ve Java<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital \u00e7a\u011f\u0131nda, her saniye \u00fcretilen muazzam miktardaki veri, &#8220;b\u00fcy\u00fck veri&#8221; kavram\u0131n\u0131 hayat\u0131m\u0131z\u0131n merkezine yerle\u015ftirmi\u015ftir. Bu veriyi anlamland\u0131rmak, i\u015flemek ve ondan de\u011ferli bilgiler \u00e7\u0131karmak, i\u015fletmeler ve ara\u015ft\u0131rmac\u0131lar i\u00e7in kritik \u00f6neme sahiptir. Geleneksel veri i\u015fleme y\u00f6ntemleri, bu \u00f6l\u00e7ekteki verilerle ba\u015fa \u00e7\u0131kmakta yetersiz kal\u0131rken, da\u011f\u0131t\u0131k hesaplama sistemleri devreye girer. Apache Spark, bu alanda \u00f6ne \u00e7\u0131kan en g\u00fc\u00e7l\u00fc ve esnek platformlardan biridir. Bellek i\u00e7i i\u015fleme yetenekleri sayesinde y\u00fcksek h\u0131z sunan Spark, \u00e7e\u015fitli veri kaynaklar\u0131yla entegre olabilme ve farkl\u0131 i\u015f y\u00fcklerini destekleme kabiliyetiyle b\u00fcy\u00fck veri d\u00fcnyas\u0131n\u0131n vazge\u00e7ilmez bir arac\u0131 haline gelmi\u015ftir.<\/p>\n<p>Java, kurumsal uygulamalar\u0131n geli\u015ftirilmesinde uzun y\u0131llard\u0131r lider bir programlama dili olmu\u015ftur ve Spark ekosisteminde de \u00f6nemli bir yere sahiptir. Performans\u0131, olgun ekosistemi ve geni\u015f geli\u015ftirici taban\u0131 sayesinde Spark uygulamalar\u0131n\u0131 Java ile yazmak, bir\u00e7ok \u015firket ve geli\u015ftirici i\u00e7in do\u011fal bir tercihtir. Bu makalede, Apache Spark&#8217;\u0131n g\u00fcc\u00fcn\u00fc Java ile birle\u015ftirerek, b\u00fcy\u00fck veri i\u015fleme d\u00fcnyas\u0131n\u0131n &#8220;Merhaba D\u00fcnya&#8221; uygulamas\u0131 olarak kabul edilen Kelime Sayma (Word Count) program\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011fimizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu \u00f6rnek, Spark&#8217;\u0131n temel prensiplerini, d\u00f6n\u00fc\u015f\u00fcmlerini (transformations) ve eylemlerini (actions) anlamak i\u00e7in m\u00fckemmel bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<h3>Apache Spark Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Apache Spark, b\u00fcy\u00fck \u00f6l\u00e7ekli veri i\u015fleme i\u00e7in tasarlanm\u0131\u015f, a\u00e7\u0131k kaynakl\u0131, da\u011f\u0131t\u0131k bir hesaplama \u00e7er\u00e7evesidir. Hadoop MapReduce&#8217;un aksine, Spark i\u015f y\u00fcklerinin \u00e7o\u011funu bellekte tutarak \u00e7ok daha y\u00fcksek performans sunar. Bu, \u00f6zellikle yinelemeli algoritmalar ve etkile\u015fimli veri analizleri i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r. Spark&#8217;\u0131n temel g\u00fcc\u00fc, tek bir platformda \u00e7e\u015fitli i\u015f y\u00fcklerini destekleyebilmesidir:<\/p>\n<ul>\n<li><b>Spark Core:<\/b> Temel da\u011f\u0131t\u0131k y\u00fcr\u00fctme motoru ve RDD (Resilient Distributed Dataset) API&#8217;si.<\/li>\n<li><b>Spark SQL:<\/b> Yap\u0131land\u0131r\u0131lm\u0131\u015f ve yar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f verilerle \u00e7al\u0131\u015fmak i\u00e7in kullan\u0131lan bir mod\u00fcl. DataFrame ve Dataset API&#8217;leri ile SQL sorgular\u0131n\u0131 destekler.<\/li>\n<li><b>Spark Streaming:<\/b> Ger\u00e7ek zamanl\u0131 veya yak\u0131n ger\u00e7ek zamanl\u0131 veri ak\u0131\u015flar\u0131n\u0131 i\u015flemek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><b>MLlib:<\/b> Makine \u00f6\u011frenimi algoritmalar\u0131 ve ara\u00e7lar\u0131 k\u00fct\u00fcphanesi.<\/li>\n<li><b>GraphX:<\/b> Grafik paralel hesaplamalar ve grafik analizi i\u00e7in bir API.<\/li>\n<\/ul>\n<p>Spark&#8217;\u0131n mimarisi, bir s\u00fcr\u00fcc\u00fc (driver) program\u0131 ve bir dizi y\u00fcr\u00fct\u00fcc\u00fcden (executor) olu\u015fur. S\u00fcr\u00fcc\u00fc, uygulaman\u0131n ana mant\u0131\u011f\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r, i\u015fleri planlar ve y\u00fcr\u00fct\u00fcc\u00fclere da\u011f\u0131t\u0131r. Y\u00fcr\u00fct\u00fcc\u00fcler ise s\u00fcr\u00fcc\u00fc taraf\u0131ndan atanan g\u00f6revleri yerine getirir. Bu da\u011f\u0131t\u0131k yap\u0131, b\u00fcy\u00fck veri k\u00fcmelerini paralel olarak i\u015fleyerek \u00f6l\u00e7eklenebilirlik ve hata tolerans\u0131 sa\u011flar. Herhangi bir y\u00fcr\u00fct\u00fcc\u00fcn\u00fcn \u00e7\u00f6kmesi durumunda, Spark kay\u0131p veriyi otomatik olarak yeniden hesaplayabilir, bu da sistemin dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Spark Kurulumu ve Ortam Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Java ile Spark uygulamalar\u0131 geli\u015ftirmek i\u00e7in birka\u00e7 \u00f6n ko\u015ful ve ara\u00e7 gereklidir.<\/p>\n<h4>Java Development Kit (JDK) Kurulumu<\/h4>\n<p>Spark uygulamalar\u0131 Java Sanal Makinesi (JVM) \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, sisteminizde uyumlu bir JDK s\u00fcr\u00fcm\u00fcn\u00fcn (genellikle JDK 8 veya daha yenisi) kurulu olmas\u0131 gerekir. Ortam de\u011fi\u015fkenlerinin (JAVA_HOME) do\u011fru \u015fekilde ayarland\u0131\u011f\u0131ndan emin olun.<\/p>\n<h4>Proje Y\u00f6netim Arac\u0131: Maven veya Gradle<\/h4>\n<p>Spark ve di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\u0131 projenize eklemek i\u00e7in bir proje y\u00f6netim arac\u0131 kullanmak en iyi yakla\u015f\u0131md\u0131r. Maven veya Gradle bu konuda en pop\u00fcler se\u00e7eneklerdir. Bu makalede Maven kullanaca\u011f\u0131z.<\/p>\n<h4>IDE Se\u00e7imi<\/h4>\n<p>IntelliJ IDEA veya Eclipse gibi modern bir entegre geli\u015ftirme ortam\u0131 (IDE), kod yazma, derleme ve hata ay\u0131klama s\u00fcre\u00e7lerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<h4>Maven Projesi Olu\u015fturma ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h4>\n<p>Yeni bir Maven projesi olu\u015fturduktan sonra, <code>pom.xml<\/code> dosyan\u0131za Spark ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeniz gerekir. Kelime Sayma uygulamas\u0131 i\u00e7in temel Spark Core ve Spark SQL (DataFrame\/Dataset API kullanmak isterseniz) ba\u011f\u0131ml\u0131l\u0131klar\u0131 yeterli olacakt\u0131r.<\/p>\n<pre><code class=\"language-xml\"><project xmlns=\"http:\/\/www.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n    <groupId>com.example<\/groupId>\n    <artifactId>spark-word-count<\/artifactId>\n    <version>1.0-SNAPSHOT<\/version>\n\n    <properties>\n        <maven.compiler.source>1.8<\/maven.compiler.source>\n        <maven.compiler.target>1.8<\/maven.compiler.target>\n        <spark.version>3.5.0<\/spark.version> <!-- Kullanmak istedi\u011finiz Spark s\u00fcr\u00fcm\u00fcn\u00fc buraya yaz\u0131n -->\n    <\/properties>\n\n    <dependencies>\n        <!-- Apache Spark Core -->\n        <dependency>\n            <groupId>org.apache.spark<\/groupId>\n            <artifactId>spark-core_2.12<\/artifactId> <!-- Scala s\u00fcr\u00fcm\u00fcne dikkat edin (2.12 veya 2.13) -->\n            <version>${spark.version}<\/version>\n            <!-- <scope>provided<\/scope> E\u011fer Spark cluster'da zaten varsa kullan\u0131n -->\n        <\/dependency>\n\n        <!-- Apache Spark SQL (DataFrame\/Dataset API i\u00e7in) -->\n        <dependency>\n            <groupId>org.apache.spark<\/groupId>\n            <artifactId>spark-sql_2.12<\/artifactId>\n            <version>${spark.version}<\/version>\n            <!-- <scope>provided<\/scope> -->\n        <\/dependency>\n    <\/dependencies>\n\n    <build>\n        <plugins>\n            <!-- Maven Compiler Plugin -->\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-compiler-plugin<\/artifactId>\n                <version>3.8.1<\/version>\n                <configuration>\n                    <source>${maven.compiler.source}<\/source>\n                    <target>${maven.compiler.target}<\/target>\n                <\/configuration>\n            <\/plugin>\n\n            <!-- Maven Shade Plugin (Fat JAR olu\u015fturmak i\u00e7in) -->\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-shade-plugin<\/artifactId>\n                <version>3.2.4<\/version>\n                <executions>\n                    <execution>\n                        <phase>package<\/phase>\n                        <goals>\n                            <goal>shade<\/goal>\n                        <\/goals>\n                        <configuration>\n                            <transformers>\n                                <transformer implementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n                                    <mainClass>com.example.WordCount<\/mainClass> <!-- Ana s\u0131n\u0131f\u0131n\u0131z\u0131n tam yolu -->\n                                <\/transformer>\n                            <\/transformers>\n                            <filters>\n                                <filter>\n                                    <artifact><em>:<\/em><\/artifact>\n                                    <excludes>\n                                        <exclude>META-INF\/*.SF<\/exclude>\n                                        <exclude>META-INF\/*.DSA<\/exclude>\n                                        <exclude>META-INF\/*.RSA<\/exclude>\n                                    <\/excludes>\n                                <\/filter>\n                            <\/filters>\n                        <\/configuration>\n                    <\/execution>\n                <\/executions>\n            <\/plugin>\n        <\/plugins>\n    <\/build>\n<\/project><\/code><\/pre>\n<p><code>spark-core_2.12<\/code> ve <code>spark-sql_2.12<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131ndaki <code>_2.12<\/code> k\u0131sm\u0131, Spark&#8217;\u0131n derlendi\u011fi Scala s\u00fcr\u00fcm\u00fcn\u00fc belirtir. Kendi projenizde kulland\u0131\u011f\u0131n\u0131z Spark s\u00fcr\u00fcm\u00fcne ve Scala versiyonuna uygun olan\u0131 se\u00e7ti\u011finizden emin olun. Genellikle Spark 3.x, Scala 2.12 veya 2.13 ile uyumludur. <code>maven-shade-plugin<\/code> ise t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 tek bir JAR dosyas\u0131na (fat JAR) paketleyerek uygulaman\u0131z\u0131 Spark k\u00fcmelerinde daha kolay \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Kelime Sayma Algoritmas\u0131<\/h3>\n<p>Kelime Sayma program\u0131n\u0131n temel amac\u0131, bir metin dosyas\u0131ndaki her kelimenin ka\u00e7 kez ge\u00e7ti\u011fini bulmakt\u0131r. Bu i\u015flem genellikle \u015fu ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li><b>Veri Okuma:<\/b> Girdi olarak verilen metin dosyas\u0131n\u0131 sat\u0131r sat\u0131r okuyun.<\/li>\n<li><b>Kelimeye Ay\u0131rma (Tokenization):<\/b> Her sat\u0131r\u0131 kelimelere ay\u0131r\u0131n. Bo\u015fluklar veya noktalama i\u015faretleri ay\u0131r\u0131c\u0131 olarak kullan\u0131labilir.<\/li>\n<li><b>Normalle\u015ftirme:<\/b> Kelimeleri k\u00fc\u00e7\u00fck harfe \u00e7evirerek veya noktalama i\u015faretlerini kald\u0131rarak ayn\u0131 kelimelerin farkl\u0131 varyasyonlar\u0131n\u0131 (\u00f6rne\u011fin &#8220;Elma&#8221; ve &#8220;elma&#8221;) tek bir kelime olarak ele al\u0131n.<\/li>\n<li><b>E\u015fleme (Mapping):<\/b> Her kelimeye bir say\u0131m de\u011feri (genellikle 1) atay\u0131n. B\u00f6ylece her kelime i\u00e7in bir (kelime, 1) \u00e7ifti olu\u015fur.<\/li>\n<li><b>Gruplama ve Toplama (Reducing):<\/b> Ayn\u0131 kelimeleri gruplay\u0131n ve bunlar\u0131n say\u0131m de\u011ferlerini toplay\u0131n.<\/li>\n<li><b>Sonu\u00e7lar\u0131 Kaydetme\/G\u00f6sterim:<\/b> Nihai kelime say\u0131mlar\u0131n\u0131 bir dosyaya yaz\u0131n veya konsola yazd\u0131r\u0131n.<\/li>\n<\/ol>\n<p>Spark, bu ad\u0131mlar\u0131n her birini da\u011f\u0131t\u0131k ve paralel bir \u015fekilde ger\u00e7ekle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc API&#8217;ler sunar.<\/p>\n<h3>Spark ile Kelime Sayma Uygulamas\u0131: Ad\u0131m Ad\u0131m Java Kodu<\/h3>\n<p>\u015eimdi, yukar\u0131daki algoritmay\u0131 Java ve Spark kullanarak nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 g\u00f6relim.<\/p>\n<h4>SparkSession Olu\u015fturma<\/h4>\n<p>Spark 2.0&#8217;dan itibaren <code>SparkSession<\/code>, Spark&#8217;\u0131n t\u00fcm fonksiyonlar\u0131na eri\u015fim sa\u011flayan birle\u015fik bir giri\u015f noktas\u0131d\u0131r. Uygulaman\u0131z i\u00e7in bir <code>SparkSession<\/code> nesnesi olu\u015fturarak ba\u015flars\u0131n\u0131z.<\/p>\n<pre><code class=\"language-java\">import org.apache.spark.sql.SparkSession;\n\npublic class WordCount {\n    public static void main(String[] args) {\n        \/\/ SparkSession olu\u015fturma\n        SparkSession spark = SparkSession.builder()\n                .appName(\"SparkWordCount\") \/\/ Uygulaman\u0131z\u0131n ad\u0131\n                .master(\"local[*]\")       \/\/ Spark'\u0131 yerel modda t\u00fcm \u00e7ekirdekleri kullanarak \u00e7al\u0131\u015ft\u0131r\n                .getOrCreate();\n\n        \/\/ Girdi ve \u00e7\u0131kt\u0131 yollar\u0131n\u0131 kontrol et\n        if (args.length < 2) {\n            System.err.println(\"Kullan\u0131m: WordCount <girdi_dosyas\u0131_yolu> <\u00e7\u0131kt\u0131_dizini_yolu>\");\n            System.exit(1);\n        }\n        String inputFilePath = args[0];\n        String outputDirPath = args[1];\n\n        \/\/ ... geri kalan kod buraya gelecek\n    }\n}<\/code><\/pre>\n<p>*   <code>appName(\"SparkWordCount\")<\/code>: Spark UI&#8217;da ve k\u00fcme y\u00f6neticisinde uygulaman\u0131z\u0131n g\u00f6r\u00fcn\u00fcr ad\u0131n\u0131 ayarlar.<br \/>\n<em>   <code>master(\"local[<\/em>]\")<\/code>: Spark&#8217;\u0131 yerel bir makinede, mevcut t\u00fcm CPU \u00e7ekirdeklerini kullanarak \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 s\u00f6yler. Bir Spark k\u00fcmesinde \u00e7al\u0131\u015f\u0131rken buraya k\u00fcme y\u00f6neticisinin adresini (\u00f6rn. <code>spark:\/\/host:port<\/code>) veya <code>yarn<\/code>, <code>mesos<\/code> gibi bir de\u011feri yazabilirsiniz.<br \/>\n*   <code>getOrCreate()<\/code>: Mevcut bir <code>SparkSession<\/code> varsa onu d\u00f6nd\u00fcr\u00fcr, yoksa yeni bir tane olu\u015fturur.<\/p>\n<h4>Veri Y\u00fckleme<\/h4>\n<p>Girdi metin dosyas\u0131n\u0131 okumak i\u00e7in <code>spark.read().textFile()<\/code> metodunu kullan\u0131r\u0131z. Bu metod, her sat\u0131r\u0131 bir eleman olarak i\u00e7eren bir <code>Dataset<String><\/code> d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-java\">\/\/ Metin dosyas\u0131n\u0131 oku\n        Dataset<String> lines = spark.read().textFile(inputFilePath);<\/code><\/pre>\n<h4>D\u00f6n\u00fc\u015f\u00fcmler (Transformations)<\/h4>\n<p>Spark&#8217;ta d\u00f6n\u00fc\u015f\u00fcmler, bir RDD\/Dataset \u00fczerinde yap\u0131lan ve yeni bir RDD\/Dataset d\u00f6nd\u00fcren i\u015flemlerdir. Hen\u00fcz bir hesaplama yapmazlar; sadece bir i\u015flem plan\u0131 olu\u015ftururlar (lazy evaluation).<\/p>\n<h5><code>flatMap()<\/code> ile Kelimelere Ay\u0131rma<\/h5>\n<p>Her sat\u0131r\u0131 kelimelere ay\u0131rmak i\u00e7in <code>flatMap()<\/code> d\u00f6n\u00fc\u015f\u00fcm\u00fcn\u00fc kullan\u0131r\u0131z. <code>flatMap()<\/code>, her girdi eleman\u0131n\u0131 s\u0131f\u0131r veya daha fazla \u00e7\u0131kt\u0131 eleman\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve t\u00fcm bu \u00e7\u0131kt\u0131 elemanlar\u0131n\u0131 tek bir d\u00fczle\u015ftirilmi\u015f koleksiyonda birle\u015ftirir.<\/p>\n<pre><code class=\"language-java\">\/\/ Her sat\u0131r\u0131 kelimelere ay\u0131r, k\u00fc\u00e7\u00fck harfe \u00e7evir ve noktalama i\u015faretlerini kald\u0131r\n        Dataset<String> words = lines.flatMap((FlatMapFunction<String, String>) s ->\n                Arrays.asList(s.toLowerCase().split(\"\\\\W+\")).iterator(), Encoders.STRING());<\/code><\/pre>\n<p>*   <code>s.toLowerCase()<\/code>: Her kelimeyi k\u00fc\u00e7\u00fck harfe \u00e7evirir.<br \/>\n*   <code>split(\"\\\\W+\")<\/code>: Sat\u0131r\u0131 bo\u015fluklara ve noktalama i\u015faretlerine g\u00f6re b\u00f6ler. <code>\\W+<\/code> regex&#8217;i, herhangi bir alfan\u00fcmerik olmayan karakter dizisini temsil eder.<br \/>\n*   <code>Arrays.asList(...).iterator()<\/code>: <code>flatMap<\/code> bir <code>Iterator<\/code> bekledi\u011fi i\u00e7in kelime listesini bir iterat\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\u00fcz.<br \/>\n*   <code>Encoders.STRING()<\/code>: Spark&#8217;\u0131n <code>Dataset<\/code> API&#8217;si i\u00e7in tip g\u00fcvenli\u011fi sa\u011flayan bir kodlay\u0131c\u0131d\u0131r.<\/p>\n<h5><code>map()<\/code> ile Kelime-Say\u0131 \u00c7iftleri Olu\u015fturma<\/h5>\n<p>\u015eimdi her kelime i\u00e7in bir <code>(kelime, 1)<\/code> \u00e7ifti olu\u015fturmam\u0131z gerekiyor. Bu, <code>map()<\/code> d\u00f6n\u00fc\u015f\u00fcm\u00fc ile yap\u0131l\u0131r. <code>Tuple2<\/code> s\u0131n\u0131f\u0131, iki elemanl\u0131 bir \u00e7ifti temsil eder.<\/p>\n<pre><code class=\"language-java\">\/\/ Her kelimeye 1 de\u011feri ata (kelime, 1) \u00e7iftleri olu\u015ftur\n        Dataset<Tuple2<String, Integer>> wordPairs = words.map((MapFunction<String, Tuple2<String, Integer>>) word ->\n                new Tuple2<>(word, 1), Encoders.tuple(Encoders.STRING(), Encoders.INT()));<\/code><\/pre>\n<p>*   <code>Encoders.tuple(Encoders.STRING(), Encoders.INT())<\/code>: <code>Tuple2<String, Integer><\/code> tipi i\u00e7in bir kodlay\u0131c\u0131 sa\u011flar.<\/p>\n<h5><code>groupByKey()<\/code> ve <code>reduceGroups()<\/code> ile Gruplama ve Toplama<\/h5>\n<p>Ayn\u0131 kelimeleri gruplamak ve onlar\u0131n say\u0131mlar\u0131n\u0131 toplamak i\u00e7in <code>groupByKey()<\/code> ve ard\u0131ndan <code>reduceGroups()<\/code> (veya <code>count()<\/code>) kullanabiliriz. Ancak, daha verimli bir yakla\u015f\u0131m olan <code>reduceByKey()<\/code> (RDD API&#8217;sinde) veya <code>groupByKey().count()<\/code> (Dataset API&#8217;sinde) kullanmak daha yayg\u0131nd\u0131r. <code>reduceByKey<\/code> do\u011frudan Dataset API&#8217;sinde yoktur, ancak <code>groupByKey<\/code> ve <code>mapValues<\/code> veya <code>agg<\/code> ile benzer i\u015flevsellik elde edilebilir. RDD API&#8217;sinde <code>reduceByKey<\/code> daha do\u011fal bir kullan\u0131md\u0131r. Dataset API&#8217;sinde ise <code>groupBy<\/code> ve <code>count<\/code> veya <code>sum<\/code> kullan\u0131r\u0131z.<\/p>\n<p>Kelime sayma i\u00e7in <code>Dataset<\/code> API&#8217;sinde daha modern ve tip g\u00fcvenli bir yakla\u015f\u0131m \u015f\u00f6yledir:<\/p>\n<pre><code class=\"language-java\">import static org.apache.spark.sql.functions.*; \/\/ count, col fonksiyonlar\u0131 i\u00e7in\n\n\/\/ ... \u00f6nceki kodlar ...\n\n        \/\/ Kelimeleri grupla ve say\n        Dataset<Row> wordCounts = words.groupBy(col(\"value\")).count();<\/code><\/pre>\n<p>Burada <code>words<\/code> Dataset&#8217;i tek bir &#8220;value&#8221; s\u00fctununa sahip bir <code>Dataset<Row><\/code>&#8216;dur. <code>groupBy(col(\"value\"))<\/code> ile bu s\u00fctuna g\u00f6re gruplama yapar\u0131z ve <code>count()<\/code> ile her grubun eleman say\u0131s\u0131n\u0131 buluruz. Sonu\u00e7, iki s\u00fctunlu bir <code>Dataset<Row><\/code> olacakt\u0131r: <code>value<\/code> (kelime) ve <code>count<\/code> (say\u0131).<\/p>\n<p>E\u011fer RDD API&#8217;sini kullanmak isteseydik, <code>JavaPairRDD<\/code> \u00fczerinde <code>reduceByKey<\/code> kullan\u0131rd\u0131k:<\/p>\n<pre><code class=\"language-java\">\/\/ RDD API'si ile kelime sayma (alternatif)\nimport org.apache.spark.api.java.JavaPairRDD;\nimport org.apache.spark.api.java.JavaRDD;\nimport scala.Tuple2;\n\n\/\/ ... SparkSession olu\u015fturma ...\n\n        JavaRDD<String> linesRDD = spark.read().textFile(inputFilePath).javaRDD();\n\n        JavaRDD<String> wordsRDD = linesRDD.flatMap(s -> Arrays.asList(s.toLowerCase().split(\"\\\\W+\")).iterator());\n\n        JavaPairRDD<String, Integer> wordPairsRDD = wordsRDD.mapToPair(word -> new Tuple2<>(word, 1));\n\n        JavaPairRDD<String, Integer> wordCountsRDD = wordPairsRDD.reduceByKey((a, b) -> a + b);\n\n        \/\/ Sonu\u00e7lar\u0131 g\u00f6ster\n        \/\/ wordCountsRDD.collect().forEach(System.out::println);\n        \/\/ wordCountsRDD.saveAsTextFile(outputDirPath);<\/code><\/pre>\n<p>Bu makalede Dataset API&#8217;sine odaklanaca\u011f\u0131m\u0131z i\u00e7in, <code>groupBy(col(\"value\")).count()<\/code> yakla\u015f\u0131m\u0131n\u0131 kullanmaya devam edelim.<\/p>\n<h4>Eylemler (Actions)<\/h4>\n<p>Eylemler, Spark&#8217;\u0131n bir d\u00f6n\u00fc\u015f\u00fcm zincirini y\u00fcr\u00fctmesini tetikler ve sonu\u00e7lar\u0131 d\u00f6nd\u00fcr\u00fcr veya d\u0131\u015f bir depolama sistemine kaydeder.<\/p>\n<h5><code>show()<\/code> veya <code>collect()<\/code> ile Sonu\u00e7lar\u0131 G\u00f6r\u00fcnt\u00fcleme<\/h5>\n<p>Geli\u015ftirme a\u015famas\u0131nda veya k\u00fc\u00e7\u00fck veri setleri i\u00e7in sonu\u00e7lar\u0131 konsolda g\u00f6rmek isteyebiliriz. <code>show()<\/code> metodu, <code>Dataset<\/code> i\u00e7eri\u011finin ilk birka\u00e7 sat\u0131r\u0131n\u0131 formatl\u0131 bir \u015fekilde g\u00f6sterir. <code>collect()<\/code> ise t\u00fcm veriyi s\u00fcr\u00fcc\u00fc program\u0131na getirir, bu nedenle b\u00fcy\u00fck veri setleri i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ Sonu\u00e7lar\u0131 konsola yazd\u0131r (k\u00fc\u00e7\u00fck veri setleri i\u00e7in uygun)\n        wordCounts.show();<\/code><\/pre>\n<h5><code>write().mode().csv()<\/code> veya <code>write().mode().parquet()<\/code> ile Sonu\u00e7lar\u0131 Kaydetme<\/h5>\n<p>Kelime say\u0131mlar\u0131n\u0131 bir dosyaya kaydetmek i\u00e7in <code>write()<\/code> metodunu kullan\u0131r\u0131z. Spark, sonu\u00e7lar\u0131 varsay\u0131lan olarak birden fazla par\u00e7aya b\u00f6ler ve bir dizin i\u00e7ine kaydeder.<\/p>\n<pre><code class=\"language-java\">\/\/ Sonu\u00e7lar\u0131 belirtilen dizine CSV olarak kaydet\n        wordCounts.write()\n                .mode(\"overwrite\") \/\/ E\u011fer dizin zaten varsa \u00fczerine yaz\n                .csv(outputDirPath); \/\/ Sonu\u00e7lar\u0131 CSV format\u0131nda kaydet\n        \n        \/\/ Veya Parquet format\u0131nda (daha verimli)\n        \/\/ wordCounts.write()\n        \/\/         .mode(\"overwrite\")\n        \/\/         .parquet(outputDirPath);<\/code><\/pre>\n<p>*   <code>mode(\"overwrite\")<\/code>: E\u011fer \u00e7\u0131kt\u0131 dizini zaten varsa, Spark&#8217;\u0131n \u00fczerine yazmas\u0131n\u0131 sa\u011flar. Di\u011fer modlar <code>append<\/code>, <code>ignore<\/code> ve <code>errorIfExists<\/code>&#8216;tir.<br \/>\n*   <code>csv(outputDirPath)<\/code>: Sonu\u00e7lar\u0131 CSV format\u0131nda belirtilen dizine kaydeder. Spark, \u00e7\u0131kt\u0131 dizini i\u00e7inde birden fazla part dosyas\u0131 (\u00f6rne\u011fin <code>part-00000-....csv<\/code>) olu\u015fturacakt\u0131r.<\/p>\n<h4>SparkSession Kapatma<\/h4>\n<p>Uygulama bitti\u011finde <code>SparkSession<\/code>&#8216;\u0131 kapatmak, kaynaklar\u0131 serbest b\u0131rakmak i\u00e7in iyi bir uygulamad\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ SparkSession'\u0131 kapat\n        spark.stop();<\/code><\/pre>\n<h4>Tamamlanm\u0131\u015f Kelime Sayma Java Kodu<\/h4>\n<p>\u015eimdi t\u00fcm kodu bir araya getirelim:<\/p>\n<pre><code class=\"language-java\">package com.example;\n\nimport org.apache.spark.sql.Dataset;\nimport org.apache.spark.sql.Encoders;\nimport org.apache.spark.sql.Row;\nimport org.apache.spark.sql.SparkSession;\nimport org.apache.spark.api.java.function.FlatMapFunction;\nimport org.apache.spark.api.java.function.MapFunction;\nimport scala.Tuple2;\n\nimport java.util.Arrays;\nimport java.util.Iterator;\n\nimport static org.apache.spark.sql.functions.*;\n\npublic class WordCount {\n    public static void main(String[] args) {\n        \/\/ 1. SparkSession olu\u015fturma\n        SparkSession spark = SparkSession.builder()\n                .appName(\"SparkWordCount\")\n                .master(\"local[*]\")\n                .getOrCreate();\n\n        \/\/ Girdi ve \u00e7\u0131kt\u0131 yollar\u0131n\u0131 kontrol et\n        if (args.length < 2) {\n            System.err.println(\"Kullan\u0131m: WordCount <girdi_dosyas\u0131_yolu> <\u00e7\u0131kt\u0131_dizini_yolu>\");\n            System.exit(1);\n        }\n        String inputFilePath = args[0];\n        String outputDirPath = args[1];\n\n        try {\n            \/\/ 2. Metin dosyas\u0131n\u0131 oku\n            \/\/ Her sat\u0131r bir String olarak Dataset'e y\u00fcklenir.\n            Dataset<String> lines = spark.read().textFile(inputFilePath);\n\n            \/\/ 3. Her sat\u0131r\u0131 kelimelere ay\u0131r, k\u00fc\u00e7\u00fck harfe \u00e7evir ve noktalama i\u015faretlerini kald\u0131r\n            \/\/ flatMap d\u00f6n\u00fc\u015f\u00fcm\u00fc, her sat\u0131rdan birden fazla kelime \u00fcretir ve bunlar\u0131 d\u00fczle\u015ftirir.\n            Dataset<String> words = lines.flatMap((FlatMapFunction<String, String>) s -> {\n                \/\/ Sat\u0131r\u0131 k\u00fc\u00e7\u00fck harfe \u00e7evirip, alfan\u00fcmerik olmayan karakterlere g\u00f6re b\u00f6leriz.\n                \/\/ Bo\u015f stringleri filtrelemek \u00f6nemlidir.\n                return Arrays.asList(s.toLowerCase().split(\"\\\\W+\"))\n                             .stream()\n                             .filter(word -> !word.isEmpty())\n                             .iterator();\n            }, Encoders.STRING());\n\n            \/\/ 4. Kelimeleri grupla ve say\n            \/\/ Dataset API'sinde en yayg\u0131n ve verimli y\u00f6ntemlerden biri groupBy ve count kullanmakt\u0131r.\n            \/\/ 'value' burada Dataset<String> i\u00e7indeki tek s\u00fctunun varsay\u0131lan ad\u0131d\u0131r.\n            Dataset<Row> wordCounts = words.groupBy(col(\"value\")).count();\n\n            \/\/ 5. Sonu\u00e7lar\u0131 konsola yazd\u0131r (geli\u015ftirme ve k\u00fc\u00e7\u00fck veri setleri i\u00e7in)\n            System.out.println(\"Kelime Say\u0131m Sonu\u00e7lar\u0131:\");\n            wordCounts.show(false); \/\/ false ile s\u00fctunlar\u0131 kesmeden g\u00f6ster\n\n            \/\/ 6. Sonu\u00e7lar\u0131 belirtilen dizine CSV olarak kaydet\n            \/\/ 'overwrite' modu, \u00e7\u0131kt\u0131 dizini zaten varsa \u00fczerine yazmas\u0131n\u0131 sa\u011flar.\n            wordCounts.write()\n                    .mode(\"overwrite\")\n                    .csv(outputDirPath);\n\n            System.out.println(\"Kelime say\u0131m sonu\u00e7lar\u0131 '\" + outputDirPath + \"' dizinine ba\u015far\u0131yla kaydedildi.\");\n\n        } catch (Exception e) {\n            System.err.println(\"Uygulama s\u0131ras\u0131nda bir hata olu\u015ftu: \" + e.getMessage());\n            e.printStackTrace();\n        } finally {\n            \/\/ 7. SparkSession'\u0131 kapat\n            spark.stop();\n        }\n    }\n}<\/code><\/pre>\n<h3>Uygulamay\u0131 Derleme ve \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<h4>Girdi Dosyas\u0131 Haz\u0131rl\u0131\u011f\u0131<\/h4>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce bir girdi metin dosyas\u0131na ihtiyac\u0131n\u0131z var. \u00d6rne\u011fin, projenizin k\u00f6k dizininde <code>input.txt<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine \u015funlar\u0131 yaz\u0131n:<\/p>\n<pre><code class=\"language-\">Merhaba Spark,\nSpark harika bir platformdur.\nMerhaba d\u00fcnya, merhaba Spark.<\/code><\/pre>\n<h4>Uygulamay\u0131 Derleme (Fat JAR Olu\u015fturma)<\/h4>\n<p>Maven Shade Plugin&#8217;i <code>pom.xml<\/code>&#8216;e eklediyseniz, uygulaman\u0131z\u0131 tek bir JAR dosyas\u0131 (fat JAR veya uber JAR) olarak paketleyebilirsiniz. Bu JAR dosyas\u0131, uygulaman\u0131z\u0131n kodunu ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 i\u00e7erir, bu da onu Spark k\u00fcmesine da\u011f\u0131tmay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\nProjenizin k\u00f6k dizininde \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">mvn clean package<\/code><\/pre>\n<p>Bu komut, <code>target<\/code> dizini alt\u0131nda <code>spark-word-count-1.0-SNAPSHOT.jar<\/code> (veya benzer bir isimde) bir JAR dosyas\u0131 olu\u015fturacakt\u0131r.<\/p>\n<h4>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Uygulamay\u0131 <code>spark-submit<\/code> komutu ile \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z. <code>spark-submit<\/code>, Spark uygulamalar\u0131n\u0131 Spark k\u00fcmelerinde veya yerel modda \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan bir betiktir.<\/p>\n<pre><code class=\"language-bash\">spark-submit \\\n    --class com.example.WordCount \\\n    --master local[*] \\\n    target\/spark-word-count-1.0-SNAPSHOT.jar \\\n    input.txt \\\n    output_word_count<\/code><\/pre>\n<p>*   <code>--class com.example.WordCount<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak ana s\u0131n\u0131f\u0131n tam yolunu belirtir.<br \/>\n<em>   <code>--master local[<\/em>]<\/code>: Uygulaman\u0131n yerel modda, mevcut t\u00fcm \u00e7ekirdekleri kullanarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bir k\u00fcmede \u00e7al\u0131\u015ft\u0131r\u0131rken <code>yarn<\/code> veya <code>spark:\/\/<master-ip>:<port><\/code> gibi de\u011ferler kullanabilirsiniz.<br \/>\n*   <code>target\/spark-word-count-1.0-SNAPSHOT.jar<\/code>: Olu\u015fturdu\u011funuz fat JAR dosyas\u0131n\u0131n yoludur.<br \/>\n*   <code>input.txt<\/code>: Uygulaman\u0131z\u0131n bekledi\u011fi ilk arg\u00fcman (girdi dosyas\u0131n\u0131n yolu).<br \/>\n*   <code>output_word_count<\/code>: Uygulaman\u0131z\u0131n bekledi\u011fi ikinci arg\u00fcman (\u00e7\u0131kt\u0131 dizininin yolu).<\/p>\n<p>Uygulama ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131ktan sonra, projenizin k\u00f6k dizininde <code>output_word_count<\/code> ad\u0131nda bir dizin olu\u015ftu\u011funu g\u00f6receksiniz. Bu dizinin i\u00e7inde <code>part-00000-...csv<\/code> gibi dosyalar bulunacakt\u0131r. Bu dosyalar\u0131n i\u00e7eri\u011fi, kelime say\u0131m sonu\u00e7lar\u0131n\u0131 i\u00e7erecektir.<br \/>\n\u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-\">harika,1\nbir,1\nspark,3\nd\u00fcnya,1\nplatformdur,1\nmerhaba,2<\/code><\/pre>\n<h3>Performans ve Optimizasyon \u0130pu\u00e7lar\u0131<\/h3>\n<p>B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken performans kritik \u00f6neme sahiptir. \u0130\u015fte Spark uygulamalar\u0131n\u0131z\u0131 optimize etmek i\u00e7in baz\u0131 ipu\u00e7lar\u0131:<\/p>\n<h4>Veri Serile\u015ftirme (Serialization)<\/h4>\n<p>Spark, veriyi a\u011f \u00fczerinden ta\u015f\u0131rken veya diske yazarken serile\u015ftirme kullan\u0131r. Varsay\u0131lan Java serile\u015ftirmesi yava\u015f ve verimsizdir. Apache Kryo, \u00e7ok daha h\u0131zl\u0131 ve kompakt bir serile\u015ftirme k\u00fct\u00fcphanesidir. Kryo&#8217;yu kullanmak i\u00e7in Spark yap\u0131land\u0131rman\u0131zda etkinle\u015ftirebilirsiniz:<br \/>\n<code>spark.serializer org.apache.spark.serializer.KryoSerializer<\/code><\/p>\n<h4>Do\u011fru D\u00f6n\u00fc\u015f\u00fcm Se\u00e7imi<\/h4>\n<p><code>reduceByKey<\/code> gibi daha spesifik ve optimize edilmi\u015f d\u00f6n\u00fc\u015f\u00fcmler, <code>groupByKey<\/code> gibi daha genel olanlara tercih edilmelidir. <code>reduceByKey<\/code>, anahtarlar\u0131 ayn\u0131 olan verileri shuffle etmeden \u00f6nce yerel olarak birle\u015ftirir, bu da a\u011f trafi\u011fini ve bellek kullan\u0131m\u0131n\u0131 azalt\u0131r. Dataset API&#8217;sinde <code>groupBy<\/code> ve <code>agg<\/code> fonksiyonlar\u0131n\u0131 kullanmak genellikle iyi optimize edilmi\u015ftir.<\/p>\n<h4>Veri B\u00f6l\u00fcmleme (Partitioning)<\/h4>\n<p>Verilerin do\u011fru \u015fekilde b\u00f6l\u00fcmlemesi (partitioning), shuffle operasyonlar\u0131n\u0131n performans\u0131n\u0131 etkiler. <code>repartition()<\/code> veya <code>coalesce()<\/code> gibi metodlarla b\u00f6l\u00fcm say\u0131s\u0131n\u0131 ayarlayabilirsiniz. Genellikle, k\u00fcmenizdeki \u00e7ekirdek say\u0131s\u0131n\u0131n 2-3 kat\u0131 kadar b\u00f6l\u00fcm ideal bir ba\u015flang\u0131\u00e7 noktas\u0131 olabilir.<\/p>\n<h4>Bellek Y\u00f6netimi<\/h4>\n<p>Spark, belle\u011fi verileri \u00f6nbelle\u011fe almak ve ara verileri depolamak i\u00e7in yo\u011fun bir \u015fekilde kullan\u0131r. <code>spark.executor.memory<\/code>, <code>spark.driver.memory<\/code> gibi yap\u0131land\u0131rma ayarlar\u0131yla bellek tahsisini kontrol edebilirsiniz. <code>persist()<\/code> veya <code>cache()<\/code> kullanarak s\u0131k kullan\u0131lan RDD&#8217;leri\/Dataset&#8217;leri bellekte tutmak performans\u0131 art\u0131rabilir.<\/p>\n<h4>Shuffle Operasyonlar\u0131n\u0131 Azaltma<\/h4>\n<p>Shuffle, verilerin a\u011f \u00fczerinden ta\u015f\u0131nmas\u0131n\u0131 gerektiren maliyetli bir operasyondur. <code>groupByKey<\/code>, <code>reduceByKey<\/code>, <code>join<\/code> gibi operasyonlar shuffle&#8217;\u0131 tetikler. M\u00fcmk\u00fcn oldu\u011funca shuffle&#8217;\u0131 azaltmaya \u00e7al\u0131\u015f\u0131n. \u00d6rne\u011fin, <code>broadcast join<\/code> kullanarak k\u00fc\u00e7\u00fck bir tabloyu t\u00fcm executor&#8217;lara da\u011f\u0131tabilir ve b\u00fcy\u00fck tablonun shuffle edilmesini engelleyebilirsiniz.<\/p>\n<h3>Hata Ay\u0131klama ve Sorun Giderme<\/h3>\n<p>Spark uygulamalar\u0131nda hata ay\u0131klamak, da\u011f\u0131t\u0131k yap\u0131s\u0131 nedeniyle zorlay\u0131c\u0131 olabilir.<\/p>\n<h4>Spark UI Kullan\u0131m\u0131<\/h4>\n<p>Spark uygulamas\u0131 \u00e7al\u0131\u015f\u0131rken, varsay\u0131lan olarak 4040 portunda (veya ayarlanm\u0131\u015f ba\u015fka bir portta) \u00e7al\u0131\u015fan bir web aray\u00fcz\u00fc (Spark UI) bulunur. Bu aray\u00fcz, uygulaman\u0131z\u0131n ilerlemesini, RDD&#8217;leri, i\u015fleri, a\u015famalar\u0131, g\u00f6revleri ve y\u00fcr\u00fct\u00fcc\u00fcleri izlemek i\u00e7in paha bi\u00e7ilmez bir ara\u00e7t\u0131r. Performans darbo\u011fazlar\u0131n\u0131 veya hatalar\u0131 bulmak i\u00e7in Spark UI&#8217;daki olay g\u00fcnl\u00fcklerini ve zaman \u00e7izelgesini inceleyin.<\/p>\n<h4>Loglar\u0131 Anlama<\/h4>\n<p>Spark ve JVM loglar\u0131, sorun giderme i\u00e7in \u00f6nemli bilgiler i\u00e7erir. <code>log4j.properties<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rarak log seviyesini (INFO, WARN, ERROR, DEBUG) ayarlayabilirsiniz. Genellikle <code>WARN<\/code> veya <code>INFO<\/code> seviyesi yeterli bilgi sa\u011flar.<\/p>\n<h4>Yayg\u0131n Hatalar<\/h4>\n<p>*   <code>OutOfMemoryError<\/code>: Executor&#8217;lara veya s\u00fcr\u00fcc\u00fcye yeterli bellek ayr\u0131lmad\u0131\u011f\u0131nda ortaya \u00e7\u0131kar. <code>spark.executor.memory<\/code> veya <code>spark.driver.memory<\/code> ayarlar\u0131n\u0131 art\u0131rman\u0131z gerekebilir.<br \/>\n*   <code>ClassNotFoundException<\/code>: Ba\u011f\u0131ml\u0131l\u0131klar\u0131n JAR dosyas\u0131na do\u011fru \u015fekilde paketlenmedi\u011fini veya Spark k\u00fcmesine do\u011fru \u015fekilde da\u011f\u0131t\u0131lmad\u0131\u011f\u0131n\u0131 g\u00f6sterir. Fat JAR kulland\u0131\u011f\u0131n\u0131zdan veya <code>spark-submit<\/code> ile gerekli JAR&#8217;lar\u0131 <code>--jars<\/code> parametresiyle sa\u011flad\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n*   Shuffle ile ilgili hatalar: Genellikle a\u011f veya bellek sorunlar\u0131ndan kaynaklan\u0131r. <code>spark.shuffle.service.enabled<\/code>, <code>spark.local.dir<\/code> gibi ayarlar\u0131 kontrol edin.<\/p>\n<h3>Geli\u015fmi\u015f Konulara K\u0131sa Bir Bak\u0131\u015f<\/h3>\n<p>Bu makale, Spark&#8217;\u0131n temellerini Kelime Sayma \u00f6rne\u011fi \u00fczerinden g\u00f6sterse de, Spark&#8217;\u0131n yetenekleri \u00e7ok daha geni\u015ftir.<\/p>\n<h4>Spark SQL ile DataFrame\/Dataset API<\/h4>\n<p>Spark SQL, yap\u0131land\u0131r\u0131lm\u0131\u015f ve yar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f verilerle \u00e7al\u0131\u015fmak i\u00e7in en pop\u00fcler Spark mod\u00fcl\u00fcd\u00fcr. DataFrame ve Dataset API&#8217;leri, RDD&#8217;lere g\u00f6re daha y\u00fcksek seviyeli, tip g\u00fcvenli ve performans a\u00e7\u0131s\u0131ndan optimize edilmi\u015f bir soyutlama sunar. Kelime sayma \u00f6rne\u011fimizde <code>Dataset<Row><\/code> kullanarak bu API&#8217;ye k\u0131saca de\u011findik. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda genellikle bu API&#8217;ler tercih edilir.<\/p>\n<h4>Spark Streaming ve Yap\u0131land\u0131r\u0131lm\u0131\u015f Ak\u0131\u015f (Structured Streaming)<\/h4>\n<p>Ger\u00e7ek zamanl\u0131 veri i\u015fleme senaryolar\u0131 i\u00e7in Spark Streaming veya daha yeni ve g\u00fc\u00e7l\u00fc olan Structured Streaming kullan\u0131labilir. Bu mod\u00fcller, Kafka, Kinesis gibi kaynaklardan gelen s\u00fcrekli veri ak\u0131\u015flar\u0131n\u0131 i\u015flemek i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h4>MLlib (Makine \u00d6\u011frenimi K\u00fct\u00fcphanesi)<\/h4>\n<p>Spark&#8217;\u0131n MLlib k\u00fct\u00fcphanesi, \u00e7e\u015fitli makine \u00f6\u011frenimi algoritmalar\u0131 (s\u0131n\u0131fland\u0131rma, regresyon, k\u00fcmeleme vb.) ve yard\u0131mc\u0131 ara\u00e7lar sunar. B\u00fcy\u00fck veri k\u00fcmeleri \u00fczerinde makine \u00f6\u011frenimi modelleri olu\u015fturmak ve e\u011fitmek i\u00e7in idealdir.<\/p>\n<h4>Di\u011fer Diller<\/h4>\n<p>Spark, Java&#8217;n\u0131n yan\u0131 s\u0131ra Scala, Python (PySpark) ve R (SparkR) dilleri i\u00e7in de API&#8217;ler sunar. Projenizin ve ekibinizin tercihine g\u00f6re uygun dili se\u00e7ebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Apache Spark, b\u00fcy\u00fck veri i\u015fleme d\u00fcnyas\u0131nda devrim yaratm\u0131\u015f, h\u0131zl\u0131, esnek ve \u00f6l\u00e7eklenebilir bir platformdur. Java ile Spark uygulamalar\u0131 geli\u015ftirmek, kurumsal geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc bir kombinasyon sunar. Bu makalede, Spark&#8217;\u0131n temel bile\u015fenlerini, kurulumunu ve &#8220;Merhaba D\u00fcnya&#8221; e\u015fde\u011feri olan Kelime Sayma uygulamas\u0131n\u0131 ad\u0131m ad\u0131m Java ile nas\u0131l geli\u015ftirece\u011fimizi \u00f6\u011frendik. <code>SparkSession<\/code> olu\u015fturmaktan, metin verilerini okumaya, d\u00f6n\u00fc\u015f\u00fcmler (flatMap, map, groupBy, count) ve eylemler (show, write) ger\u00e7ekle\u015ftirmeye kadar t\u00fcm s\u00fcreci detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, uygulamay\u0131 derleme, \u00e7al\u0131\u015ft\u0131rma ve performans optimizasyonu i\u00e7in \u00f6nemli ipu\u00e7lar\u0131na de\u011findik.<\/p>\n<p>Bu temel bilgileri edindikten sonra, Spark&#8217;\u0131n di\u011fer g\u00fc\u00e7l\u00fc mod\u00fcllerini (Spark SQL, Spark Streaming, MLlib) ke\u015ffetmeye ve daha karma\u015f\u0131k b\u00fcy\u00fck veri problemlerini \u00e7\u00f6zmeye haz\u0131rs\u0131n\u0131z. Spark&#8217;\u0131n sundu\u011fu imkanlar s\u0131n\u0131rs\u0131zd\u0131r ve b\u00fcy\u00fck veri ekosistemindeki yerini sa\u011flamla\u015ft\u0131rmaya devam edecektir. Java&#8217;n\u0131n g\u00fcc\u00fc ve Spark&#8217;\u0131n esnekli\u011fi ile, veriden anlaml\u0131 i\u00e7g\u00f6r\u00fcler elde etmek ve inovatif \u00e7\u00f6z\u00fcmler \u00fcretmek art\u0131k \u00e7ok daha eri\u015filebilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz\nGiri\u015f: B\u00fcy\u00fck Veri D\u00fcnyas\u0131nda Apache Spark ve Java\nG\u00fcn\u00fcm\u00fcz\u00fcn dijita","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[874],"tags":[],"class_list":{"0":"post-35487","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-server","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apache Spark ile Java&#039;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apache Spark ile Java&#039;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"Apache Spark ile Java&#039;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz Giri\u015f: B\u00fcy\u00fck Veri D\u00fcnyas\u0131nda Apache Spark ve Java G\u00fcn\u00fcm\u00fcz\u00fcn dijita\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-30T05:40:51+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz\",\"datePublished\":\"2025-11-30T05:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\"},\"wordCount\":2899,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Server\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\",\"name\":\"Apache Spark ile Java'da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-30T05:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Apache Spark ile Java'da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"Apache Spark ile Java'da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz","og_description":"Apache Spark ile Java'da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz Giri\u015f: B\u00fcy\u00fck Veri D\u00fcnyas\u0131nda Apache Spark ve Java G\u00fcn\u00fcm\u00fcz\u00fcn dijita","og_url":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-30T05:40:51+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz","datePublished":"2025-11-30T05:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/"},"wordCount":2899,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Server"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/","name":"Apache Spark ile Java'da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-30T05:40:51+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/apache-spark-ile-javada-kelime-sayma-uygulamasi-detayli-bir-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Apache Spark ile Java&#8217;da Kelime Sayma Uygulamas\u0131: Detayl\u0131 Bir K\u0131lavuz"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35487"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35487\/revisions"}],"predecessor-version":[{"id":35488,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35487\/revisions\/35488"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}