{"id":21014,"date":"2016-03-18T14:35:13","date_gmt":"2016-03-18T13:35:13","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=1487"},"modified":"2026-03-17T08:58:01","modified_gmt":"2026-03-17T07:58:01","slug":"hyperloglog-on-spark","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/","title":{"rendered":"HyperLogLog on Spark Streaming \u2013 Sch\u00e4tzung von Kardinalit\u00e4ten innerhalb eines Datenstroms"},"content":{"rendered":"<p>Im Rahmen eines Research-Projektes wurde die Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps untersucht. Dieser Artikel beschreibt Grundlagen, Durchf\u00fchrung und Findings.<\/p>\n<p><!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Motivation\" >Motivation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#LogLog-und-HyperLogLog\" >LogLog und HyperLogLog<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Prototyp-und-Architektur\" >Prototyp und Architektur<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Fazit\" >Fazit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Literatur\" >Literatur<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Were-hiring\" >We&#8217;re hiring!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#Weiterlesen\" >Weiterlesen<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Motivation\"><\/span>Motivation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ein h\u00e4ufiger Anwendungsfall in der Datenanalyse ist die Bestimmung der Kardinalit\u00e4t einer Menge, also die Anzahl an einzigartigen Elementen innerhalb der Menge. Man bezeichnet dies auch als das \u201eCount-Distinct-Problem\u201c. Eine in der Web-Analyse verwendete Standardkennzahl ist beispielsweise die Anzahl an eindeutigen\u00a0Besucher:innen eines Webangebotes. Eine triviale Implementierung dieser Funktionalit\u00e4t w\u00e4re beispielsweise das Hinzuf\u00fcgen eines Elements zu einer Datenstruktur, die m\u00f6glichst effizient die Operationen <span class=\"lang:java decode:true crayon-inline\">add()<\/span>\u00a0und <span class=\"lang:java decode:true crayon-inline \">contains()<\/span>\u00a0 umsetzt (zum Beispiel HashSet). Die Menge an ben\u00f6tigtem Arbeitsspeicher verh\u00e4lt sich zur untersuchten Kardinalit\u00e4t in diesem Fall proportional [1]. Im Umfeld von Big Data, wo die von Doug Laney gepr\u00e4gten Begriffe Volume, Velocity und Variety [2] als wichtige Eigenschaften gelten, ist dieser Speicherbedarf nicht tragbar. Des Weiteren\u00a0ist die Analyse solcher KPIs immer h\u00e4ufiger m\u00f6glichst zeitnah &#8211; am besten in &#8222;Echtzeit&#8220; &#8211; erw\u00fcnscht, um auch kurzfristig auf bestimmte Situationen entsprechend reagieren zu k\u00f6nnen.<\/p>\n<p>Aus diesen Gr\u00fcnden wird h\u00e4ufig auf exakte Ergebnisse verzichtet und auf randomisierte N\u00e4herungsverfahren gesetzt. Dieser Bereich stellt ein gro\u00dfes Forschungsgebiet dar, in dem bereits in den 1980er-Jahren entsprechende L\u00f6sungen des \u201eCount-Distinct-Problems\u201c entwickelt wurden. Die Auswahl an Algorithmen reicht von einfachen und intuitiven Verfahren bis hin zu mathematisch komplexen Berechnungen. Einer dieser randomisierten N\u00e4herungsverfahren ist das offensichtlich weit verbreitete HyperLogLog.\u00a0Um dem &#8222;Echtzeit&#8220;-Kriterium gerecht zu werden, gibt es im Zoo an Technologien verschiedene Streaming-Werkzeuge, welche\u00a0die effiziente Analyse eines Datenstroms erm\u00f6glichen sollen. Eine der am h\u00e4ufigsten genannten Technologien in diesem Zusammenhang ist die\u00a0Streaming-Bibliothek von Apache Spark.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"LogLog-und-HyperLogLog\"><\/span>LogLog und HyperLogLog<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Der LogLog-Algorithmus [3] basiert im Kern auf einem statistischen Z\u00e4hlverfahren (Probabilistic Counting) durch Bitpattern-Observation. Hierzu wird zun\u00e4chst jeder eingehende Wert durch eine Hashfunktion auf eine bin\u00e4re String-Repr\u00e4sentation abgebildet. Es kann hierbei intuitiv die Annahme getroffen werden, dass die H\u00e4lfte aller Hashwerte mit 1, ein Viertel aller Werte mit 01 und ein Achtel aller Werte mit 001, usw. beginnen. Die Anzahl an f\u00fchrenden Nullen innerhalb eines jeden Hashwertes ergeben eine Rangfolge, welche in einer Bitmap wiedergespiegelt wird. Das Prinzip soll an einem kleinen Beispiel verdeutlicht werden.<\/p>\n<figure id=\"attachment_1494\" aria-describedby=\"caption-attachment-1494\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1494 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting-1024x510.png\" alt=\"Beispiel f\u00fcr Probabilistic Counting\" width=\"800\" height=\"398\" \/><figcaption id=\"caption-attachment-1494\" class=\"wp-caption-text\">Abbildung 1: Beispiel f\u00fcr Probabilistic Counting<\/figcaption><\/figure>\n<p>Abbildung 1 zeigt die zentral gepflegte Bitmap, in der jeweils die maximale Folge von f\u00fchrenden Nullen anhand eines gesetzten Bits am jeweiligen Index vermerkt wird.<\/p>\n<p>Durch Anwendung von Stochastic Averaging kann der Standardfehler minimiert werden. Es werden <em>m<\/em> unabh\u00e4ngige Bitpattern-Observations durchgef\u00fchrt und am Ende der statistische Durchschnitt \u00fcber alle einzelnen Zwischenergebnisse gebildet, wobei <em>m<\/em> einen von au\u00dfen festzulegender Parameter darstellt. Hierzu werden die Hashwerte anhand der ersten <em>p<\/em> Bits in m = <em>2<sup>p<\/sup><\/em> unabh\u00e4ngige Bitmaps, die sogenannten Buckets, eingeteilt. Die verbleibenden Bits werden zur eigentlichen Analyse verwendet. Abbildung 2 zeigt acht unabh\u00e4ngige Buckets, f\u00fcr die jeweils der oben beschriebene Prozess des Probabilistic Counting durchgef\u00fchrt wird.<\/p>\n<figure id=\"attachment_1496\" aria-describedby=\"caption-attachment-1496\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1496 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/averaging-1024x510.png\" alt=\"Stochastic Averaging\" width=\"800\" height=\"398\" \/><figcaption id=\"caption-attachment-1496\" class=\"wp-caption-text\">Abbildung 2: Stochastic Averaging<\/figcaption><\/figure>\n<p>HyperLogLog arbeitet im Grunde genau wie sein Vorg\u00e4nger mit dem zuvor beschriebenen Bit-Pattern-Observable. Allerdings werden\u00a0hier unter anderem eine andere mathematische Berechnung zugrundegelegt und Korrekturverfahren f\u00fcr sehr kleine oder sehr gro\u00dfe Kardinalit\u00e4ten hinzugef\u00fcgt. Zur Parametrisierung und somit zur Einstellung des Algorithmus ist lediglich der Parameter <em>p<\/em> von au\u00dfen anzugeben, welcher letztendlich \u00fcber die Genauigkeit und den Speicherplatzbedarf entscheidet.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Prototyp-und-Architektur\"><\/span>Prototyp und Architektur<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Es soll ein Datenstrom, der die Seitenaufrufe einer beobachteten Webseite enth\u00e4lt, in Echtzeit exemplarisch auf distinkte Benutzer untersucht werden. Dies kann zum Beispiel hilfreich sein f\u00fcr sehr kurzfristige Entscheidungen bei gro\u00dfem Request-Aufkommen. Hierzu wird ein Datenstrom simuliert, welcher inhaltlich an Log-Daten eines Webservers erinnert, wobei die Testdaten in stark vereinfachter Form vorliegen. Das Ergebnis soll die in einem bestimmten Zeitfenster kontinuierlich aktualisierte Kennzahl der distinkten Besucher:innen sein.<\/p>\n<p>Die aufkommenden Events werden zun\u00e4chst durch ein Kafka-Messagingsystem gepuffert. Der Empf\u00e4nger (in unserem Beispiel Spark Streaming) erh\u00e4lt somit einen gleichm\u00e4\u00dfigen, homogenen Datenstrom. Als HyperLogLog-Implementierung wurde die freie <a href=\"https:\/\/github.com\/addthis\/stream-lib\" target=\"_blank\" rel=\"noopener\">Java-Bibliothek stream-lib<\/a> verwendet. Diese bietet neben HyperLogLog noch weitere Streaming-Algorithmen.<\/p>\n<p>In Abbildung 3 wird die vorbereitende Transformationskette schematisch dargestellt. Zun\u00e4chst werden die als String ankommenden kommagetrennten Zeilen am Komma gesplittet und es wird ein neuer Stream erzeugt, welcher jeweils nur das erste Feld (<span class=\"lang:java decode:true crayon-inline\">fullvisitorid<\/span>) beinhaltet. Auf Basis dieses Streams wird ein Key Value-Stream erzeugt, welcher jedem Element den Schl\u00fcssel \u201ekey\u201c zuweist. Dies ist ein notwendiger Schritt, um sp\u00e4ter einen globalen Zustand \u00fcber die gesamte Laufzeit mithilfe von <span class=\"lang:java decode:true crayon-inline\">updateStateByKey()<\/span>\u00a0pflegen zu k\u00f6nnen.<\/p>\n<figure id=\"attachment_1498\" aria-describedby=\"caption-attachment-1498\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-1498\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/transformationskette-1024x636.png\" alt=\"Transformationskette zur Vorbereitung\" width=\"800\" height=\"497\" \/><figcaption id=\"caption-attachment-1498\" class=\"wp-caption-text\">Abbildung 3: Transformationskette zur Vorbereitung<\/figcaption><\/figure>\n<p>Listing 1 zeigt die entsprechende Update-Funktion, welche bei jedem Batch-Intervall aufgerufen wird und das HyperLogLog-Objekt vorlaufend aktualisiert.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Listing 1: Update-Funktion zur Verwaltung eines globalen Zustandes\">Function2&lt;List&lt;String&gt;, Optional&lt;HyperLogLogPlus&gt;, Optional&lt;HyperLogLogPlus&gt;&gt;\r\n\r\nhllUpdateFunction = new Function2&lt;List&lt;String&gt;, Optional&lt;HyperLogLogPlus&gt;,\r\n\r\nOptional&lt;HyperLogLogPlus&gt;&gt;() {\r\n\r\npublic Optional&lt;HyperLogLogPlus&gt; call(List&lt;String&gt; values,\r\n\r\nOptional&lt;HyperLogLogPlus&gt; state) throws Exception {\r\n\r\n\t\tHyperLogLogPlus hll;\r\n\r\n\t\tif (state.isPresent()) {\r\n\r\n\t\t\thll = state.get();\r\n\r\n\t\t\tvalues.stream().forEach(value -&gt; hll.offer(value));\r\n\r\n\t\t} else {\r\n\r\n\t\t\thll = new HyperLogLogPlus(p);\r\n\r\n\t\t}\r\n\r\n\t\treturn Optional.of(hll);\r\n\r\n\t}\r\n\r\n};\r\n\r\n<\/pre>\n<p>Der Aufruf dieser Funktion und die Erzeugung eines Ergebnis-Streams lassen sich, wie Listing 2 zeigt, mithilfe von <span class=\"lang:java decode:true crayon-inline \">updateStateByKey()<\/span>\u00a0und einem anschlie\u00dfenden <span class=\"lang:java decode:true crayon-inline\">map()<\/span>\u00a0auf die Kennzahl, umsetzen.<\/p>\n<pre class=\"lang:java decode:true\" title=\"Listing 2: Aktualisierung des Zustandes und Erzeugung eines Ergebnis-Streams\">JavaDStream&lt;Long&gt; hllCounts = fullvisitorIds\r\n\r\n    .updateStateByKey(hllUpdateFunction)\r\n\r\n    .map(pair -&gt; pair._2().cardinality());\r\n\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Fazit<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>HyperLogLog ist durch bereits existierende Bibliotheken sehr einfach in eine Anwendung zu integrieren. Die Anpassung an die jeweiligen Use Cases ist durch lediglich einen grundlegenden Parameter ebenfalls \u00fcbersichtlich. In exemplarischen Testmessungen wurden Fehler von 1 &#8211; 2 % bei einem sublinearen Speicherplatzbedarf von etwa 100 MB f\u00fcr 10.000.000 Elemente erreicht (inklusive Spark-Laufzeitumgebung und sonstigem Overhead durch die verwendete Bibliothek). Eine testweise Implementierung einer naiven L\u00f6sung mithilfe eines Java-HashSets wurde hingegen nach Erreichen des Heap-Limits von 4 GB abgebrochen.<\/p>\n<p>Durch die Echtzeit-Verarbeitung der Daten sind schlie\u00dflich viele interessante Use Cases denkbar. Darunter z. B. die Indexierung der Ergebnisse in Elasticsearch und die Darstellung der Kennzahl als Timeline durch Kibana.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Literatur\"><\/span>Literatur<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>[1] Flajolet P.; Fusy \u00c9.; Gandouet O. et al. (2007): <em>HyperLogLog: The Analysis Of A Near-Optimal Cardinality Estimation Algorithm<\/em>. DMTCS Proceedings.<\/li>\n<li>[2] Laney D. (2001): <em>3D Data Management: Controlling Data Volume, Velocity and Variety<\/em>.<\/li>\n<li>[3] Flajolet P. und Durand M. (2003): <em>Loglog counting of large cardinalities<\/em>. Algorithms-ESA.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Were-hiring\"><\/span>We&#8217;re hiring!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Tapetenwechsel gef\u00e4llig? Wir sind auf der Suche nach begeisterten Big Data Engineers, die unsere Projektteams im Umfeld von Hadoop (Hortonworks), Apache Flink, Spark und Cloudera unterst\u00fctzen und den ELK-Stack produktiv beherrschen. <strong>Jetzt Bewerben!<\/strong><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Weiterlesen\"><\/span>Weiterlesen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Weitere Informationen zu unserem Analytics-Portfolio, von <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/analytics\/business-intelligence\/\" target=\"_blank\" rel=\"noopener\">BI<\/a> \u00fcber <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/big-data\/\" target=\"_blank\" rel=\"noopener\">Big Data<\/a>, <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/search\/\" target=\"_blank\" rel=\"noopener\">Search<\/a> und <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/data-science-deep-learning\/\" target=\"_blank\" rel=\"noopener\">Data Science &amp; Deep Learning<\/a>, gibt es auf unserer <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/analytics\/\" target=\"_blank\" rel=\"noopener\">Website<\/a>, per Mail an <a href=\"mailto:info@inovex.de\" target=\"_blank\" rel=\"noopener\">info@inovex.de<\/a> oder telefonisch unter\u00a0<a href=\"tel:+497216190210\" target=\"_blank\" rel=\"noopener\">+49 721 619 021-0<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Rahmen eines Research-Projektes wurde die Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps untersucht. Dieser Artikel beschreibt Grundlagen, Durchf\u00fchrung und Findings.<\/p>\n","protected":false},"author":206,"featured_media":12426,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[77,105],"service":[411],"coauthors":[{"id":206,"display_name":"Julian Seither","user_nicename":"jseither"}],"class_list":["post-21014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-big-data","tag-spark","service-data-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HyperLogLog on Spark Streaming<\/title>\n<meta name=\"description\" content=\"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HyperLogLog on Spark Streaming\" \/>\n<meta property=\"og:description\" content=\"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-18T13:35:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:58:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1806\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Julian Seither\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting-1024x510.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julian Seither\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Julian Seither\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/\"},\"author\":{\"name\":\"Julian Seither\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/0a3268d44503c4d0d32fbeb6f1129b94\"},\"headline\":\"HyperLogLog on Spark Streaming \u2013 Sch\u00e4tzung von Kardinalit\u00e4ten innerhalb eines Datenstroms\",\"datePublished\":\"2016-03-18T13:35:13+00:00\",\"dateModified\":\"2026-03-17T07:58:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/\"},\"wordCount\":1045,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/probabilistic-counting.png\",\"keywords\":[\"Big Data\",\"Spark\"],\"articleSection\":[\"Analytics\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/\",\"name\":\"HyperLogLog on Spark Streaming\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/probabilistic-counting.png\",\"datePublished\":\"2016-03-18T13:35:13+00:00\",\"dateModified\":\"2026-03-17T07:58:01+00:00\",\"description\":\"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/probabilistic-counting.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/probabilistic-counting.png\",\"width\":1806,\"height\":900,\"caption\":\"Abbildung 1: Beispiel f\u00fcr Probabilistic Counting\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/hyperloglog-on-spark\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HyperLogLog on Spark Streaming \u2013 Sch\u00e4tzung von Kardinalit\u00e4ten innerhalb eines Datenstroms\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/0a3268d44503c4d0d32fbeb6f1129b94\",\"name\":\"Julian Seither\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg35f978bb618834bfd2353e7390e16e33\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg\",\"caption\":\"Julian Seither\"},\"description\":\"I'm a Data Engineer and Architect, interested in designing and implementing various types of data platforms and streaming applications in the cloud as well as on premise.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/julian-seither-34ba40139\\\/\"],\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/jseither\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HyperLogLog on Spark Streaming","description":"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.","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:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/","og_locale":"de_DE","og_type":"article","og_title":"HyperLogLog on Spark Streaming","og_description":"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.","og_url":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2016-03-18T13:35:13+00:00","article_modified_time":"2026-03-17T07:58:01+00:00","og_image":[{"width":1806,"height":900,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png","type":"image\/png"}],"author":"Julian Seither","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting-1024x510.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Julian Seither","Gesch\u00e4tzte Lesezeit":"7\u00a0Minuten","Written by":"Julian Seither"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/"},"author":{"name":"Julian Seither","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0a3268d44503c4d0d32fbeb6f1129b94"},"headline":"HyperLogLog on Spark Streaming \u2013 Sch\u00e4tzung von Kardinalit\u00e4ten innerhalb eines Datenstroms","datePublished":"2016-03-18T13:35:13+00:00","dateModified":"2026-03-17T07:58:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/"},"wordCount":1045,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png","keywords":["Big Data","Spark"],"articleSection":["Analytics","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/","url":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/","name":"HyperLogLog on Spark Streaming","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png","datePublished":"2016-03-18T13:35:13+00:00","dateModified":"2026-03-17T07:58:01+00:00","description":"Untersuchung der Implementierung und Praxistauglichkeit von HyperLogLog auf Apache Spark Streaming mithilfe eines einfachen Prototyps.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/probabilistic-counting.png","width":1806,"height":900,"caption":"Abbildung 1: Beispiel f\u00fcr Probabilistic Counting"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/hyperloglog-on-spark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"HyperLogLog on Spark Streaming \u2013 Sch\u00e4tzung von Kardinalit\u00e4ten innerhalb eines Datenstroms"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0a3268d44503c4d0d32fbeb6f1129b94","name":"Julian Seither","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg35f978bb618834bfd2353e7390e16e33","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg","caption":"Julian Seither"},"description":"I'm a Data Engineer and Architect, interested in designing and implementing various types of data platforms and streaming applications in the cloud as well as on premise.","sameAs":["https:\/\/www.linkedin.com\/in\/julian-seither-34ba40139\/"],"url":"https:\/\/www.inovex.de\/de\/blog\/author\/jseither\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/206"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=21014"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21014\/revisions"}],"predecessor-version":[{"id":66591,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/21014\/revisions\/66591"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12426"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=21014"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=21014"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=21014"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=21014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}