Top OnlyFans Earners: A Practical Guide for New Subscribers

Top OnlyFans Earners: Practical Guidance for the Curious Subscriber

Why Knowing the Top Earners Matters for New Subscribers

When you first explore the world of premium adult content, the sheer number of creators can feel overwhelming. Knowing who the top OnlyFans earners are gives you a curated starting point, saving time and helping you focus on creators who consistently deliver high‑quality, engaging experiences. These leaders often set the benchmark for privacy, exclusive content, and polished presentation, which translates into a smoother, more enjoyable subscription. By following the trail of top performers, you also gain insight into industry trends that shape what’s considered “must‑see” today.

Beyond prestige, top earners typically invest in better production values, professional lighting, and thoughtful storytelling that elevate the experience from casual viewing to an intimate, premium encounter. Their success also signals a reliable support system—responsive messaging, consistent posting schedules, and attentive fan interaction. For anyone seeking a balance of sensual intrigue and trustworthy service, the top earners act as a trusted compass.

How the Top Earners Structure Their Content for Maximum Appeal

Content Variety and Exclusive Themes

Leading creators understand that variety fuels desire. They blend photo sets, short videos, behind‑the‑scenes clips, and interactive polls, giving subscribers a multi‑dimensional taste of their persona. Exclusive themes—such as “summer fantasy,” “role‑play nights,” or “personal diary” series—create a sense of scarcity that feels both tempting and premium. This rotating mix keeps the content library fresh, encouraging fans to return regularly for new sensations.

Pricing Strategies and Discreet Billing

Top OnlyFans earners often employ tiered subscription models that cater to both casual browsers and devoted collectors. A modest base price unlocks core content, while higher tiers unlock private messaging, custom requests, and occasional live sessions. Importantly, all pricing is presented with discreet billing options, ensuring that statements remain neutral and privacy stays intact. This approach reassures users who value anonymity while still feeling they receive exclusive, high‑value experiences.

Key Features Subscribers Expect from Top Creators

Privacy and Private Browsing Options

Privacy is non‑negotiable for many fans. The best creators provide clear guidance on private browsing, secure login protocols, and options to hide subscription activity from shared devices. They also offer advice on clearing cache and using incognito modes to keep the experience intimate. When privacy is woven into the platform’s fabric, subscribers feel confident to explore their desires without fear of exposure.

Mobile Access and Seamless Experience

Modern fans consume content on the go, so mobile‑friendly design is essential. Top earners optimize their media for quick loading on smartphones, ensuring that video streams remain smooth even on slower connections. They also employ push notifications for new drops, letting fans stay in the loop without constantly checking the site. This seamless mobile experience turns casual curiosity into a habit, enhancing overall satisfaction.

A Quick Look at the Current Top Earners

Below is a snapshot of creators who consistently rank at the top of OnlyFans earnings, based on publicly reported figures and community feedback. This table highlights their primary niche, typical subscription price, and standout feature that keeps fans coming back.

Creator Niche Base Subscription Signature Feature
Luna Luxe Elegant boudoir $19.99/mo Weekly “Behind the Curtain” video diary
Max Maverick Adventure & fitness $15.00/mo Live outdoor workout sessions
Serena Silk Luxury lingerie $22.50/mo Custom photo set requests
Jax Jett Playful cosplay $18.75/mo Interactive role‑play polls

While the numbers can shift, these creators share a commitment to high‑quality production, discreet billing, and a content schedule that rewards loyalty. Use this overview as a starting point, then explore each profile to see which vibe resonates with your personal taste.

Tips to Choose the Right Creator for Your Taste

Consider These Factors Before Subscribing

  • Content style: Do you prefer soft, sensual storytelling or a more bold, adventurous approach?
  • Posting frequency: Daily updates keep excitement high; weekly drops may suit a slower pace.
  • Interaction level: Some creators respond to every message, while others reserve private chats for higher tiers.
  • Privacy guarantees: Look for clear statements about discreet billing and secure account handling.
  • Device compatibility: Ensure the creator’s media works smoothly on your preferred mobile or desktop platform.

Take the time to read free preview posts, watch introductory videos, and gauge the creator’s tone. A genuine, confident presence often translates into a more intimate and rewarding subscription. Remember, the best match feels both exclusive and comfortable, turning each visit into a personal escape.

Managing Your Subscription Safely and Privately

Payment, Billing, and Account Safety

When you decide to join a top OnlyFans creator, the first step is setting up a payment method that aligns with your privacy preferences. Many fans opt for prepaid cards or digital wallets that mask their personal information on statements, ensuring discreet billing. The platform also offers two‑factor authentication to protect account access, reducing the risk of unauthorized entry.

Beyond the initial sign‑up, keep an eye on subscription renewals. Most top creators provide reminder notifications, allowing you to pause or cancel without hassle. Regularly reviewing your account settings—especially privacy controls and notification preferences—helps maintain an intimate, low‑profile experience that feels both premium and secure.

Frequently Asked Questions About Top OnlyFans Earners

Do the top earners offer free trials?

Many leading creators provide a limited‑time free preview or a discounted first‑month to entice new fans. This trial lets you explore the content style, quality, and interaction level before committing to a full subscription.

How can I keep my subscription private on shared devices?

Use the platform’s “private browsing” mode, log out after each session, and clear your browser history. Some fans also enable app lock features on their phones for added discretion.

What if I want custom content?

Top earners frequently offer custom requests as part of higher‑tier packages. Pricing and turnaround time vary, but the process is usually handled through private messaging to ensure confidentiality.

Take the Next Step – Explore the Premium World

Armed with insight into the top OnlyFans earners, you’re ready to make an informed choice that balances sensual appeal with privacy and value. Dive into creator profiles, compare features, and select the vibe that sparks your curiosity. Remember, the experience is meant to be intimate, exclusive, and entirely on your terms.

When you feel prepared to navigate the platform with confidence, you can beat onlyfans by choosing creators who prioritize discreet billing, premium content, and a seamless mobile experience.

© 2026 JokesGallery.com – All rights reserved.

pnly fans free: Secure Access Guide & Privacy Tips

pnly fans free – Practical Guidance for a Safe, Sensual Experience

What “pnly fans free” Actually Means

When you type “pnly fans free” into a search engine, you’re usually looking for a way to enjoy premium adult content without the usual subscription fee. The phrase has become a shorthand for discovering platforms, tools, or communities that let users preview or temporarily access creator libraries at no cost. While the term itself is a playful twist on a well‑known brand, the intent behind it is clear: users want an intimate, exclusive feel without the financial commitment.

Understanding this intent helps you navigate the landscape wisely. Rather than chasing dubious links that promise “free forever,” a savvy approach focuses on legitimate free trials, limited‑time promotions, and community‑driven sharing methods that respect both creator rights and user privacy. The goal is to enjoy a premium‑like experience while staying within legal and ethical boundaries.

How to Access pnly fans Free Content Safely

The first step is to protect your personal information. Use a private browsing mode or a dedicated browser profile that isolates cookies and history from your everyday online activity. This simple habit reduces the risk of data mining and keeps your browsing habits discreet.

Next, consider using a reputable temporary email service for the sign‑up process. A disposable address shields your primary inbox from marketing spam and helps maintain the anonymity many users value. Pair this with a strong, unique password and enable two‑factor authentication whenever the platform offers it.

Features You Can Enjoy for Free

Even without a paid subscription, many creators offer a taste of their premium library. Typical free features include:

  • Limited‑time preview clips that showcase the creator’s style.
  • Access to a curated “welcome” gallery with a handful of high‑quality photos or videos.
  • Occasional live‑stream sessions that are open to all visitors.
  • Community forums where fans discuss favorite content and share tips.

While these selections are curated, they often capture the same sensual, intimate vibe you’d find in the paid vault. The key is to explore the free library strategically, focusing on creators whose aesthetic aligns with your personal fantasies.

Privacy, Discreet Billing, and Account Safety

Privacy is non‑negotiable in the adult space. Choose platforms that use encrypted connections (HTTPS) and clearly state a privacy policy. Look for mentions of “discreet billing” – this means that any charge on your statement will be labeled generically (e.g., “Digital Services”) rather than explicitly naming the adult site.

If you decide to upgrade later, consider using a prepaid card or an online payment service that masks your personal details. This approach maintains an extra layer of anonymity while still granting you full access to the premium content library.

Mobile Access – Enjoying pnyl Fans Free on the Go

Most adult platforms are optimized for mobile devices, offering a seamless experience whether you’re on iOS or Android. Download the official app when possible, as it typically includes additional security features like biometric login.

When you’re away from home, use a VPN to encrypt your internet traffic. A reliable VPN not only protects your location but also ensures that your browsing remains private, especially when you’re accessing sensual content from public Wi‑Fi networks.

Building a Curated Content Library Without Paying

Creating a personal stash of free content is both practical and satisfying. Start by bookmarking creators who consistently release high‑quality previews. Use a simple spreadsheet or note‑taking app to track:

  1. Creator name and profile link.
  2. Type of free content available (photos, videos, live streams).
  3. Update frequency – some creators refresh their free gallery weekly.
  4. Any special “free week” promotions.

This organized approach turns casual browsing into a strategic treasure hunt, letting you build an intimate collection that feels exclusive without breaking the bank.

Comparing Free vs. Paid Experiences

While free access offers a tempting glimpse, a paid subscription unlocks the full spectrum of premium features. Below is a quick comparison to help you decide which path aligns with your desires.

Feature pnly fans free Paid Subscription
Content Volume Limited preview library Unlimited full‑size gallery
Live Interaction Occasional public streams Private live shows & direct messaging
Privacy Controls Basic anonymous browsing Advanced private browsing, discreet billing
Mobile Experience Web‑optimized viewing Dedicated app with offline download
Exclusive Content Rarely available Premium photo sets, fetish stories, behind‑the‑scenes

Use this table as a quick reference when you’re weighing the allure of a free tease against the immersive intimacy of a full subscription.

Tips to Maximize Value Without Paying

Even if you stay on the free side, there are ways to stretch each experience:

  • Follow creators on social media – they often announce free‑preview events.
  • Join fan communities on Reddit or Discord where members share the latest “free week” alerts.
  • Take advantage of seasonal promotions; many platforms open up extra content during holidays.
  • Use the platform’s “wishlist” feature to bookmark favorites for later viewing.

Remember, the most rewarding experiences come from genuine curiosity and respectful engagement. Treat each free glimpse as a teaser that fuels anticipation for future, possibly premium, encounters.

Frequently Asked Questions About pnly fans Free Access

Is it legal to use free preview links? Yes, as long as the source is the official platform or an authorized affiliate offering a legitimate trial. Avoid third‑party sites that claim “unlimited free access” – they often violate copyright and can jeopardize your device’s security.

Do I need to enter payment details for a free trial? Some platforms request a credit card to verify age, but they won’t charge you until the trial ends. Use a prepaid card if you want to keep your primary banking information completely separate.

Can I remain completely anonymous? While no system is 100 % anonymous, using private browsing, a disposable email, and a VPN dramatically reduces traceability. Pair these tools with discreet billing for the most confidential experience.

For those curious about alternative ways to explore free content, you might also check out free o lyfans for community‑driven suggestions and occasional giveaways.

Final Thoughts: Embrace the Temptation, Stay Smart

The allure of “pnly fans free” is undeniable – it promises a seductive peek into a world of exclusive, intimate content without immediate financial commitment. By following the practical steps outlined above, you can indulge that curiosity while safeguarding your privacy, enjoying seamless mobile access, and making informed decisions about when (or if) to upgrade.

Ultimately, the best experience blends the thrill of discovery with the confidence of security. Whether you remain a free‑access explorer or decide to dive into a premium subscription, remember that the most rewarding moments come from a balance of temptation, discretion, and respect for the creators who craft the sensual journeys you love.

4

JDK Java path

Set Java path permanently

				
					vim /etc/profile

# add 
export JAVA_HOME=/usr/lib/jvm/jdk-11
export PATH=$PATH:$JAVA_HOME/bin
				
			

List available jdk installed and change as required

				
					archlinux-java status

# Available Java environments:
  # java-17-openjdk
  # java-21-jdk
  # jdk-11 (default)

				
			
3-1

Block websites

  1. Install Squid Proxy:

    First, install Squid Proxy server:

    bash
    sudo pacman -Syu squid
  2. Configure Squid Proxy:

    Edit the Squid configuration file to configure URL filtering:

    bash
    sudo nano /etc/squid/squid.conf

    Add or uncomment the following lines to enable URL filtering:

    arduino
    acl block_sites dstdomain "/etc/squid/block_sites.acl" http_access deny block_sites

    Save the changes and exit the editor.

  3. Create Keyword List:

    Create a file containing keywords that you want to block:

    bash
    sudo nano /etc/squid/block_sites.acl

    Add the keywords, each on a separate line:

    arduino
    .adult .porn .explicit

    Save the changes and exit the editor.

  4. Update Permissions:

    Ensure that Squid has the necessary permissions to read the ACL file:

    bash
    sudo chown -R proxy:proxy /etc/squid/block_sites.acl
  5. Restart Squid:

    Restart the Squid service to apply the changes:

    bash
    sudo systemctl restart squid
  6. Test the Configuration:

    Test the configuration by attempting to access websites containing the specified keywords from a web browser. If the configuration is correct, access to these websites should be blocked.

To disable the keyword-based blocking, you can simply remove or comment out the relevant lines in the Squid configuration file (/etc/squid/squid.conf), restart the Squid service, and delete the keyword list file (/etc/squid/block_sites.acl).

docker Error response from daemon: Get “https://registry-1.docker.io/v2/”

				
					sudo systemctl status docker.service
sudo systemctl stop docker.socket
sudo systemctl daemon-reload
sudo systemctl restart docker.service
				
			
				
					> cat /etc/resolvconf.conf                            
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details

resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
name_servers=127.0.0.1
				
			

Functional Interfaces

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

				
					package com.brains.reactivejavademo;

import java.time.LocalDateTime;
import java.util.concurrent.Callable;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

public class T1 {

    private static Callable<String> callable(){
        return () -> "Callable: hello";
    }
    private static Runnable runnable = () -> System.out.println("Runnable: This is runnable");
    private static Supplier<String> supplier = () -> "Supplier";
    private static Consumer<String> consumer(){
        return s -> System.out.println("Consumer : "+s);
    }
    private static Function<String, String> func(){
        return (s) -> s.concat(String.valueOf(s.length()));
    }
    private static BiFunction<String, String, String> bifunc(){
        return (s,r) -> s.concat(r);
    }

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

        // callable
        Callable<String> s = callable();
        System.out.println(s.call());
        //-- Callable: hello

        // runnable
        runnable.run();
        //-- Runnable: This is runnable

        String s1 = supplier.get();
        System.out.println(s1);
        //-- Supplier

        // consumer
        consumer().accept("abc");
        //-- Consumer : abc

        String function = func().apply("hello");
        System.out.println(function);
        //-- hello5

        String bifunction = bifunc().apply("helo", "world");
        System.out.println(bifunction);
        //-- heloworld
    }
}

				
			

Creating a Local Data Lakehouse using Spark/Minio/Dremio/Nessie

https://www.linkedin.com/pulse/creating-local-data-lakehouse-using-alex-merced/

Creating a Local Data Lakehouse using Spark/Minio/Dremio/Nessie

Alex Merced

Alex Merced

Co-Author of “Apache Iceberg: The Definitive Guide” | Developer Advocate at Dremio (Data Lakehouse Evangelist) | Tech Content Creator

Data is becoming the cornerstone of modern businesses. As businesses scale, so does their data, and this leads to the need for efficient data storage, retrieval, and processing systems. This is where Data Lakehouses come into the picture.

What is a Data Lakehouse?

A Data Lakehouse combines the best of both data lakes and data warehouses. It provides data lakes’ raw storage capabilities and data warehouses’ structured querying capabilities. This hybrid model ensures flexibility in storing vast amounts of unstructured data, while also enabling SQL-based structured queries, ensuring that businesses can derive meaningful insights from their data.

No alt text provided for this image

We will be implementing a basic lakehouse locally on your laptop with the following components:

 

  • Apache Spark, which can be used for ingesting streaming or batch data into our lakehouse
  • Minio to act as our data lake repository and be the s3 compatible storage layer.
  • Apache Iceberg, as our table format, allows query engines to plan smarter, faster queries on our data lakehouse data.
  • Nessie is our data catalog allowing our datasets to be discoverable and accessible across our tools. Nessie also provides git-like features for data quality, experimentation and disaster recovery. (Get even more features like an intuitive UI and automated table optimization when you use Dremio Arctic cloud managed Nessie based catalog.)
  • Dremio will be our query engine which we can use performantly query our data but also document, organize and deliver our data to our consumers, such as data analysts doing ad-hoc analytics or building out BI dashboards.

 

Create a Docker Compose File and Running it

Building a Data Lakehouse on your local machine requires orchestrating multiple services, and Docker Compose is a perfect tool for this task. This section will create a docker-compose.yml file to define and run multi-container Docker applications for our Data Lakehouse environment.

Steps:

 

  1. Install Docker: Ensure that you have Docker installed on your laptop. If not, you can download it from the official Docker website.
  2. Create Docker Compose File:
  3. Navigate to a directory where you want to create your project. Here, create a file named docker-compose.yml. Populate this file with the following content:

 

version: "3.9"

services:
  dremio:
    platform: linux/x86_64
    image: dremio/dremio-oss:latest
    ports:
      - 9047:9047
      - 31010:31010
      - 32010:32010
    container_name: dremio

  minioserver:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    container_name: minio
    command: server /data --console-address ":9001"

  spark_notebook:
    image: alexmerced/spark33-notebook
    ports: 
      - 8888:8888
    env_file: .env
    container_name: notebook
  
  nessie:
    image: projectnessie/nessie
    container_name: nessie
    ports:
      - "19120:19120"

networks:
  default:
    name: iceberg_env
    driver: bridge 

Create Environment File:

Alongside your docker-compose.yml file, create an .env file to manage your environment variables. Start with the given template and fill in the details as you progress.

# Fill in Details

# AWS_REGION is used by Spark
AWS_REGION=us-east-1
# This must match if using minio
MINIO_REGION=us-east-1
# Used by pyIceberg
AWS_DEFAULT_REGION=us-east-1
# AWS Credentials (this can use minio credential, to be filled in later)
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxx
# If using Minio, this should be the API address of Minio Server
AWS_S3_ENDPOINT=http://minioserver:9000
# Location where files will be written when creating new tables
WAREHOUSE=s3a://warehouse/
# URI of Nessie Catalog
NESSIE_URI=http://nessie:19120/api/v1

Run the Docker Compose:

Open four terminals for clearer log visualization. Each service should have its terminal. Ensure you are in the directory containing the docker-compose.yml file, and then run:

 

  • In the first terminal:

 

docker-compose up minioserver

Headover to localhost:9001 in your browser and login with credentials minioadmin/minioadmin. Once your logged in do the following:

 

  • create a bucket called “warehouse”
  • create an access key and copy the access key and secret key to your .env file
  • In the second terminal:

 

docker-compose up nessie

 

  • In the third terminal:

 

docker-compose up spark_notebook 

In the logs when this container open look for output the looks like the following and copy and paste the URL into your browser.

notebook  |  or http://127.0.0.1:8888/?token=9db2c8a4459b4aae3132dfabdf9bf4396393c608816743a9

 

  • In the fourth terminal:

 

docker-compose up dremio 

After completing these steps, you will have Dremio, Minio, and a Spark Notebook running in separate Docker containers on your laptop, ready for further Data Lakehouse operations!

Creating a Table in Spark

From the jupyter notebook window you opened in the browser earlier, create a new notebook with the following code.

import pyspark
from pyspark.sql import SparkSession
import os


## DEFINE SENSITIVE VARIABLES
NESSIE_URI = os.environ.get("NESSIE_URI") ## Nessie Server URI
WAREHOUSE = os.environ.get("WAREHOUSE") ## BUCKET TO WRITE DATA TOO
AWS_ACCESS_KEY = os.environ.get("AWS_ACCESS_KEY") ## AWS CREDENTIALS
AWS_SECRET_KEY = os.environ.get("AWS_SECRET_KEY") ## AWS CREDENTIALS
AWS_S3_ENDPOINT= os.environ.get("AWS_S3_ENDPOINT") ## MINIO ENDPOINT


print(AWS_S3_ENDPOINT)
print(NESSIE_URI)
print(WAREHOUSE)


conf = (
    pyspark.SparkConf()
        .setAppName('app_name')
        .set('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.3_2.12:1.3.1,org.projectnessie.nessie-integrations:nessie-spark-extensions-3.3_2.12:0.67.0,software.amazon.awssdk:bundle:2.17.178,software.amazon.awssdk:url-connection-client:2.17.178')
        .set('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,org.projectnessie.spark.extensions.NessieSparkSessionExtensions')
        .set('spark.sql.catalog.nessie', 'org.apache.iceberg.spark.SparkCatalog')
        .set('spark.sql.catalog.nessie.uri', NESSIE_URI)
        .set('spark.sql.catalog.nessie.ref', 'main')
        .set('spark.sql.catalog.nessie.authentication.type', 'NONE')
        .set('spark.sql.catalog.nessie.catalog-impl', 'org.apache.iceberg.nessie.NessieCatalog')
        .set('spark.sql.catalog.nessie.s3.endpoint', AWS_S3_ENDPOINT)
        .set('spark.sql.catalog.nessie.warehouse', WAREHOUSE)
        .set('spark.sql.catalog.nessie.io-impl', 'org.apache.iceberg.aws.s3.S3FileIO')
        .set('spark.hadoop.fs.s3a.access.key', AWS_ACCESS_KEY)
        .set('spark.hadoop.fs.s3a.secret.key', AWS_SECRET_KEY)
)


## Start Spark Session
spark = SparkSession.builder.config(conf=conf).getOrCreate()
print("Spark Running")


## Create a Table
spark.sql("CREATE TABLE nessie.names (name STRING) USING iceberg;").show()


## Insert Some Data
spark.sql("INSERT INTO nessie.names VALUES ('Alex Merced'), ('Dipankar Mazumdar'), ('Jason Hughes')").show()


## Query the Data
spark.sql("SELECT * FROM nessie.names;").show()

Run the code, creating a table you can confirm by opening up the minio dashboard.

No alt text provided for this image

Querying the Data in Dremio

Now that the data has been created, catalogs like Nessie for your Apache Iceberg tables offer easy visibility of your tables from tool to tool. We open Dremio and see we can immediately query the data we have in our Nessie catalog.

 

  • head over to localhost:9047 where Dremio web application resides
  • create your admin user account
  • once on the dashboard click on “add source” in the bottom left
  • select “nessie”

 

Fill out the first two tabs as shown in the images below:

No alt text provided for this image
No alt text provided for this image

 

  • We use the docker network URL for our Nessie server since it’s on the same docker network as our Dremio container
  • None for authentication unless you setup your Nessie server to use tokens (default is none)
  • The second tab allows us to provide credentials for the storage of the data the catalog tracks where we the keys we got from minio
  • we set the fs.s3a.path.style.access, fs.s3a.endpoint and dremio.s3.compat settings in order to use S3 compatible storage solutions like Minio
  • Since we are working with a local non-SSL network, turn off encryption on the connection.

 

Now you can see our names table on the Dremio dashboard under our new connected source.

No alt text provided for this image

You can now click on it and run a query:

No alt text provided for this image

Keep in mind Dremio also has full DML support for Apache Iceberg so you can do creates and inserts directly from Dremio like in the screenshot below.

No alt text provided for this image

So now you get the performance of Dremio and Apache Iceberg along with the git-like capabilities that the Nessie catalog brings, allowing you to isolate ingestion on branches, create zero-clones for experimentation, and rollback your catalog for disaster recovery all on your data lakehouse.

Kafka on docker-compose

Kafka setup, create topic, send message and receive messages

https://www.conduktor.io/kafka/kafka-topics-cli-tutorial/

				
					
# --------------
# docker-compose.yml
# --------------
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181
  
  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
# --------------

## Create topic
# -------------
kafka-topics --bootstrap-server localhost:29092 --topic firstTopi1 --create --partitions 3 --replication-factor 1
# Created topic firstTopi1.


## List topics
# -------------
kafka-topics --bootstrap-server localhost:29092 --list
# firstTopi1
# first_topic
# test_topic


## Describe topic
# -------------
kafka-topics --bootstrap-server localhost:29092 --describe --topic first_topic
# Topic: first_topic      TopicId: VwJGV8HeSXa1NjmZ5Hfvxw PartitionCount: 3       ReplicationFactor: 1    Configs: 
#         Topic: first_topic      Partition: 0    Leader: 1       Replicas: 1     Isr: 1
#         Topic: first_topic      Partition: 1    Leader: 1       Replicas: 1     Isr: 1
#         Topic: first_topic      Partition: 2    Leader: 1       Replicas: 1     Isr: 1

## Delete topic
# -------------
kafka-topics --bootstrap-server localhost:29092 --delete --topic first_topic


## Produce message
# -------------
kafka-console-producer --bootstrap-server localhost:29092 --topic test_topic
>Hello World
>abc

# Consume latest message
# -------------
kafka-console-consumer --bootstrap-server localhost:29092 --topic test_topic
# -----
Hello World
abc

# Consume messages from begining
# -------------
kafka-console-consumer --bootstrap-server localhost:29092 --topic test_topic --from-beginning
# -----
hi
Hello
Hi
How 
are
you
hi
hello
sdf
				
			

HDFS docker-compose

https://faun.pub/run-your-first-big-data-project-using-hadoop-and-docker-in-less-than-10-minutes-e1bbe2974ef3

				
					# kubernetes.txt
https://www.youtube.com/watch?v=o6bxo0Oeg6o&t=130s
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/
install-kubeadm/

Installing a container runtime
Install Docker Engine on Ubuntu
=============
1.Set up Docker's apt repository.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

2. Install the Docker packages.

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. Verify that the Docker Engine installation is successful by running the hello-world image.

sudo docker run hello-world

4. Install CRID for docker
---------
4.1 Install Go
4.1.1 Download tarball 
wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz

4.1.2 untar
tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz

4.1.3 export go path
echo 'export PATH=$PATH:/usr/local/go/bin' >>~/.profile
source ~/.profile 

4.1.4 To install, on a Linux system that uses systemd, and already has Docker Engine installed

# Clone cri-dockerd
git clone https://github.com/Mirantis/cri-dockerd.git

# with non-sudo
make cri-dockerd

# Run these commands as root

cd cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket



Installing kubeadm, kubelet and kubectl
=============

1. Update the apt package index and install packages needed to use the Kubernetes apt repository:

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

2. Download the public signing key for the Kubernetes package repositories. 

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg


3. Add the appropriate Kubernetes apt repository
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4. Update the apt package index, install kubelet, kubeadm and kubectl, and pin their version:

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Creating a cluster with kubeadm
===============

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock


Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

sudo kubeadm join 10.131.187.176:6443 --token knefgg.pdafluamsim49olo --cri-socket=unix:///var/run/cri-dockerd.sock \
        --discovery-token-ca-cert-hash sha256:b058fc69cbec62d085bb38d84f0a89879cbe16068567f061a8fac84f87eab9aa
-----

kubectl get pods -A
NAMESPACE     NAME                                   READY   STATUS    RESTARTS   AGE
kube-system   coredns-5dd5756b68-86d94               0/1     Pending   0          5m52s
kube-system   coredns-5dd5756b68-tq4v5               0/1     Pending   0          5m52s
kube-system   etcd-k8smaster-vm                      1/1     Running   0          6m5s
kube-system   kube-apiserver-k8smaster-vm            1/1     Running   0          6m8s
kube-system   kube-controller-manager-k8smaster-vm   1/1     Running   0          6m5s
kube-system   kube-proxy-kl7d8                       1/1     Running   0          5m52s
kube-system   kube-scheduler-k8smaster-vm            1/1     Running   0          6m5s

# Install flannel
https://github.com/flannel-io/flannel#deploying-flannel-manually
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.ym

# Check pods after installing flannel
 kubectl get pods -A --watch
NAMESPACE      NAME                                   READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-7m5rq                  1/1     Running   0          54s
kube-system    coredns-5dd5756b68-86d94               1/1     Running   0          7m21s
kube-system    coredns-5dd5756b68-tq4v5               1/1     Running   0          7m21s
kube-system    etcd-k8smaster-vm                      1/1     Running   0          7m34s
kube-system    kube-apiserver-k8smaster-vm            1/1     Running   0          7m37s
kube-system    kube-controller-manager-k8smaster-vm   1/1     Running   0          7m34s
kube-system    kube-proxy-kl7d8                       1/1     Running   0          7m21s
kube-system    kube-scheduler-k8smaster-vm            1/1     Running   0          7m34s

				
			
				
					# Copy file to the hadoop container
docker cp kubernetes.txt namenode:/tmp/ 

# Get inside the hadoop container
docker exec -it namenode /bin/bash

# 1.Create the root directory for this project: 
hadoop fs -mkdir /tmp

# 2.Create the directory for the input files: 
hadoop fs -mkdir /tmp/Input

# 3.Copy the input files to the HDFS: 
hadoop fs -put /tmp/kubernetes.txt /tmp/Input

# You can open UI for HDFS at 
http://localhost:9870.
				
			
				
					# spark-shell
scala> val text = sc.textFile("hdfs://localhost:9000/tmp/Input/kubernetes.txt")
text: org.apache.spark.rdd.RDD[String] = hdfs://localhost:9000/tmp/Input/kubernetes.txt MapPartitionsRDD[3] at textFile at <console>:23

scala> text.collect;
res1: Array[String] = Array(https://www.youtube.com/watch?v=o6bxo0Oeg6o&t=130s, https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/, install-kubeadm/, "", Installing a container runtime, Install Docker Engine on Ubuntu, =============, 1.Set up Docker's apt repository., "", # Add Docker's official GPG key:, sudo apt-get update, sudo apt-get install ca-certificates curl gnupg, sudo install -m 0755 -d /etc/apt/keyrings, curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg, sudo chmod a+r /etc/apt/keyrings/docker.gpg, "", # Add the repository to Apt sources:, echo \, "  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ...

scala> val counts = text.flatMap(line => line.split(" "))
counts: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[4] at flatMap at <console>:23

scala> counts.collect;
res2: Array[String] = Array(https://www.youtube.com/watch?v=o6bxo0Oeg6o&t=130s, https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/, install-kubeadm/, "", Installing, a, container, runtime, Install, Docker, Engine, on, Ubuntu, =============, 1.Set, up, Docker's, apt, repository., "", #, Add, Docker's, official, GPG, key:, sudo, apt-get, update, sudo, apt-get, install, ca-certificates, curl, gnupg, sudo, install, -m, 0755, -d, /etc/apt/keyrings, curl, -fsSL, https://download.docker.com/linux/ubuntu/gpg, |, sudo, gpg, --dearmor, -o, /etc/apt/keyrings/docker.gpg, sudo, chmod, a+r, /etc/apt/keyrings/docker.gpg, "", #, Add, the, repository, to, Apt, sources:, echo, \, "", "", "deb, [arch="$(dpkg, --print-architecture)", signed-by=/etc/apt/keyrings...

scala> val mapf = counts.map(word => (word,1))
mapf: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[5] at map at <console>:23

scala> mapf.collect
res3: Array[(String, Int)] = Array((https://www.youtube.com/watch?v=o6bxo0Oeg6o&t=130s,1), (https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/,1), (install-kubeadm/,1), ("",1), (Installing,1), (a,1), (container,1), (runtime,1), (Install,1), (Docker,1), (Engine,1), (on,1), (Ubuntu,1), (=============,1), (1.Set,1), (up,1), (Docker's,1), (apt,1), (repository.,1), ("",1), (#,1), (Add,1), (Docker's,1), (official,1), (GPG,1), (key:,1), (sudo,1), (apt-get,1), (update,1), (sudo,1), (apt-get,1), (install,1), (ca-certificates,1), (curl,1), (gnupg,1), (sudo,1), (install,1), (-m,1), (0755,1), (-d,1), (/etc/apt/keyrings,1), (curl,1), (-fsSL,1), (https://download.docker.com/linux/ubuntu/gpg,1), (|,1), (sudo,1), (gpg,1), (--dearmor,1), (-o,1), (/etc/apt/ke...

scala> val reducef = mapf.reduceByKey(_+_);
reducef: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[6] at reduceByKey at <console>:23

scala> reducef.collect
res4: Array[(String, Int)] = Array((package,4), (index,1), (cluster.,1), (kube-scheduler-k8smaster-vm,2), ("$(.,1), (-e,1), (/',1), (/etc/kubernetes/admin.conf,1), (/etc/os-release,1), (This,1), (repository.,1), ([signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg],1), (RESTARTS,2), (kube-flannel,1), (kube-apiserver-k8smaster-vm,2), (daemon-reload,1), (export,2), (gpg,3), (already,1), (any,2), (go,1), (make,1), (network,1), (Download,2), (git,1), (control-plane,1), (4.,2), (packaging/systemd/*,1), (-o,3), (are,1), ("kubectl,1), (2.,2), (sha256:b058fc69cbec62d085bb38d84f0a89879cbe16068567f061a8fac84f87eab9aa,1), ([podnetwork].yaml",1), (https://download.docker.com/linux/ubuntu/gpg,1), (STATUS,2), (kubelet,3), (overwrites,1), (commands,1), (can,3), (tee,2), (...