برنامه نویسی

پردازش 20 میلیون رکورد در کمتر از 5 ثانیه با Apache Hive.

Summarize this content to 400 words in Persian Lang

شروع کار با Hadoop و Apache Hive: معماری، پیکربندی و بهینه سازی

در این مقاله به دنبال نشان دادن نحوه راه‌اندازی یک محیط Hadoop با Apache Hive، نحوه عملکرد معماری داخلی Hive و استفاده از برخی منابع بهینه‌سازی برای پردازش داده‌ها با عملکرد پاسخ بالا هستم.

Apache Hive یکی از ابزارهای بنیاد آپاچی است که هدف آن تجزیه و تحلیل و ذخیره داده ها در سناریوهای کلان داده است. از یک موتور پرس و جو بر اساس مدل MapReduce استفاده می کند، با این حال، دارای یک لایه انتزاعی MapReduce برای اجرای کوئری های SQL به زبان خود به نام HiveQL است.

معماری Apache Hive

در معماری آن، ما چهار جزء اصلی داریم که در مراحل عملیات در Hive شرکت می کنند:

راننده
مشتریان کندو
متاستور
هادوپ

شروع با راننده، این کامپوننت مسئول تجزیه پرس و جو درخواست شده و انتقال آن به کارهای MapReduce با کمک مشخص کردن ابرداده جدول و برنامه اجرایی ایجاد شده بعدی است.

O مشتریان کندو این چیزی نیست جز رابطی برای برقراری ارتباط با Hive و اجرای عملیات. در این مقاله، من از beeline استفاده خواهم کرد، اما موارد دیگری مانند Hue و Hive CLI وجود دارد.

O متاستور کاتالوگ جداول موجود در Hive است، دارای اطلاعات پایگاه داده، جداول، ستون ها، پارتیشن ها و غیره است. MetaStore را می توان در DBMS های رابطه ای ذخیره کرد. در این مقاله من از PostgreSQL استفاده می کنم. هنگامی که MetaStore پیکربندی شد، هر شی ایجاد شده در آن ارجاع داده می شود.

در نهایت، هادوپ اینها اجزای اکوسیستم Hadoop هستند که Hive از آنها (MapReduce و HDFS) برای ذخیره داده ها و اجرای پرس و جوها استفاده می کند. در این مقاله من از Hadoop HDFS برای پردازش داده ها استفاده می کنم.

راه اندازی Hive Server و Hadoop

در این مقاله از Docker Compose با تصاویر لازم برای امکان پذیر ساختن این آزمایشگاه Apache Hive استفاده کردم.

version: “3”

services:
namenode:
image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
networks:
– infra-network
volumes:
– namenode:/hadoop/dfs/name
environment:
– CLUSTER_NAME=test
env_file:
– ./hadoop-hive.env
ports:
– “50070:50070”

datanode:
image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
networks:
– infra-network
volumes:
– datanode:/hadoop/dfs/data
– ./dados:/hadoop/raw
env_file:
– ./hadoop-hive.env
environment:
SERVICE_PRECONDITION: “namenode:50070”
ports:
– “50075:50075”

hive-server:
image: bde2020/hive:2.3.2-postgresql-metastore
networks:
– infra-network
env_file:
– ./hadoop-hive.env
environment:
HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: “jdbc:postgresql://hive-metastore/metastore”
SERVICE_PRECONDITION: “hive-metastore:9083”
ports:
– “10000:10000”

hive-metastore:
image: bde2020/hive:2.3.2-postgresql-metastore
networks:
– infra-network
env_file:
– ./hadoop-hive.env
command: /opt/hive/bin/hive –service metastore
environment:
SERVICE_PRECONDITION: “namenode:50070 datanode:50075 hive-metastore-postgresql:5432”
ports:
– “9083:9083”

hive-metastore-postgresql:
networks:
– infra-network
image: bde2020/hive-metastore-postgresql:2.3.0

presto-coordinator:
image: shawnzhu/prestodb:0.181
networks:
– infra-network
ports:
– “8080:8080”

networks:
infra-network:
driver: bridge

volumes:
namenode:

datanode:

در این نوشتن، ما Datanode و Namenode Hadoop را داریم که هر دو را بر روی پورت های پیش فرض 50075 برای datanode و 50070 برای namenode، سرور hive-metastore در پورت 10000 و hive-metastore در پورت 9083 پیکربندی می کنیم. تصویر متاستور hive قبلاً PostgreSQL پیکربندی شد. در نهایت، ما PrestoDB را داریم که در این مورد، در این مقاله به آن نمی پردازم.

توجه داشته باشید که در سرویس datanode در Docker Compose، من در حال ایجاد یک حجم برای کپی فایل های موجود در آن هستم ./dados به /hadoop/raw. این فایل ها مجموعه داده ای هستند که من در این مقاله برای آزمایشگاه عملکرد Apache Hive استفاده می کنم. همان را می توان در اینجا یافت: Kaggle Dataset.

از آنجایی که این مجموعه داده تنها یک صفحه گسترده 78 مگابایتی دارد، من 27 صفحه گسترده را تکرار کردم تا بتوان آنها را به Hadoop اضافه کرد.

اجرای Docker Compose

پس از اجرای Docker Compose و شروع موفقیت آمیز کلیه خدمات، ابتدا از طریق دستور به کانتینر datanode Hadoop دسترسی خواهیم داشت:

docker exec -it hive_datanode_1 bash

پس از دسترسی موفقیت آمیز به کانتینر، اجازه دهید به پوشه حرکت کنیم /hadoop/raw برای تأیید اینکه همه فایل‌های CSV ما موجود هستند.

با تأیید اینکه فایل ها به کانتینر ارسال شده اند، اکنون دستور نگاشت این فایل ها را در HDFS اجرا می کنیم:

hadoop fs -put ./hadoop/raw/ /hadoop/raw/

پس از اجرای دستور، می‌توانیم فایل‌های موجود در دایرکتوری را از طریق namenode با URL: localhost:50070 ببینیم.

اتصال به Hive برای ایجاد جداول

حالا بیایید به Hive متصل شویم تا جدولی بر اساس داده ها ایجاد کنیم. برای این کار باید به کانتینر دسترسی داشته باشیم hive_hive-server_1، به دایرکتوری beeline در داخل پوشه Hive دسترسی پیدا کنید و از طریق beeline به Hive دسترسی پیدا کنید. در زیر دنباله دستورات آمده است:

docker exec -it hive_hive-server_1 bash
cd /opt/hive/bin
beeline
!connect jdbc:hive2://localhost:10000

از شما یک نام کاربری و رمز عبور خواسته می شود، می توانید دوبار اینتر را فشار دهید، زیرا به طور پیش فرض نام کاربری و رمز عبور وجود ندارد. پس از ترتیب دستورات، باید به این نتیجه برسید:

در اینجا ما در حال حاضر “درون” Hive هستیم و می توانیم عملیات خود را انجام دهیم، مانند: show databases;.

من پایگاه داده را ایجاد کردم estudo از طریق دستور: CREATE DATABASE ESTUDO; که پایگاه داده ای خواهد بود که در آن جداول تست های عملکرد را با Hive ایجاد خواهم کرد. قبل از شروع وارد کردن فایل‌های Hadoop به Hive، بیایید کمی بیشتر در مورد استراتژی‌های بهینه‌سازی که در اینجا اعمال می‌شود و انواع فایل‌هایی که آزمایش می‌شوند، بدانیم.

فایل های نوع پارکت آپاچی

فایل پارکت فایلی با فرمت باینری است که در قالب ستونی ذخیره می شود. عملکرد عالی برای مدیریت داده های انبوه پیچیده در اکوسیستم Hadoop دارد. دارای مفاهیم کلیدی مانند block size، row group ه page. O block size اندازه گروهی از ردیف هایی است که در حافظه بافر شده اند row group مجموعه خطوطی است که از یک بلوک داده برای هر ستون تشکیل شده است (به یاد داشته باشید که پارکت ستونی است)، در حالی که page اندازه صفحه برای فشرده سازی است که خواندن آن را آسان تر می کند، زیرا هر صفحه دارای یک بلوک اطلاعات است.

فایل های نوع ORC Apache

فایل‌های Apache ORC فایل‌های باینری هستند که در قالب داده‌های ستونی ذخیره می‌شوند و برای خواندن و نوشتن در Apache Hive کاملاً بهینه شده‌اند. مزیت بزرگ ORC نحوه ذخیره داده ها است. یک فایل ORC به اصطلاح دارای محدوده های داده ای است که در آن هر محدوده، علاوه بر یک بلوک داده، اطلاعات آماری برای هر ستون در مورد آن بلوک داده دارد. این امر جستجو را آسان‌تر می‌کند، زیرا از عملیات‌های ریاضی مانند حداقل، حداکثر، مجموع خطوط در هر محدوده استفاده می‌شود. علاوه بر این، اطلاعات آماری گاهی اوقات ذخیره می شود.

وارد کردن اطلاعات Hadoop به Hive

برای آزمایشگاه خود ما در مجموع چهار جدول ایجاد خواهیم کرد که عبارتند از:

dados_imoveis – جدول اصلی با فایل های CSV ما.

dados_imoveis_parquet – جدول با داده های منبع CSV ما برای پارکت آپاچی.

dados_imoveis_orc – جدول با داده های منبع CSV ما برای Apache ORC.

dados_imoveis_orc_partition – جدول با داده های ORC که در ساختار ذخیره سازی Hadoop آن توسط یک ستون خاص تقسیم شده است.

ابتدا، از قبل به Hive متصل شده‌ایم، اجازه دهید فایل‌های CSV خود را به جدول وارد کنیم dados_imoveis.

من جدول را درست کردم dados_imoveis و به Hive گفتم که با کاما مشخص شده است و به صورت خارجی در دایرکتوری ذخیره خواهد شد hdfs://hadoop/raw/dados_imoveis.

برای تکثیر داده ها و رسیدن به مجموع 20 میلیون رکورد، چندین بار همان داده را در جدول وارد کردم. dados_imoveis.

پس از انجام یک count در جدول، می‌توانیم تعداد کل رکوردها را تأیید کنیم.

سپس جدول را در پارکت آپاچی ایجاد کردم و رکوردها را بر اساس جدول درج کردم dados_imoveis.

در نهایت، جدول ORC و جدول ORC را که توسط ستون تقسیم شده است ایجاد کردم room، که با اطلاعات تعداد اتاق های هر ملک تخصیص داده می شود. یکی از جزئیات مهم در نحو ایجاد جدول پارتیشن بندی شده این است که ستون تعریف شده یک ستون جدید است و نمی تواند نام ستونی را که از قبل در جدول وجود دارد داشته باشد. جزئیات دیگر هنگام درج رکوردهاست که آخرین ستون درج باید اطلاعات پارتیشن بندی باشد.

پارتیشن بندی در کندو

در Apache Hive، در میان چندین منبعی که برای بهینه سازی عملیات خود داریم، پارتیشن بندی (Partitioned) وجود دارد. اساساً جدول را بر اساس مقادیر ستون مشخص شده هنگام ایجاد آن و محتوای موجود در آن جدول به بخش های کوچکتر تقسیم می کند. مزیت استفاده از این ویژگی سهولت جستجو بر اساس برش داده است، به خصوص زمانی که جستجو توسط یک ستون پارتیشن بندی شده انجام می شود. ساختار آن هنگام ایجاد به این شکل است:

هر پوشه ایجاد شده تعدادی از اطلاعات اتاق را نشان می دهد، که تضمین می کند فقط داده های مربوط به پرس و جو خوانده می شود و نه تنها زمان اجرا، بلکه ورودی/خروجی دیسک را نیز کاهش می دهد.

مقایسه عملکرد: CSV x پارکت x ORC

قبل از اینکه به اجرای جدول پارتیشن بندی شده بپردازیم، بیایید ارزیابی کنیم که کدام جداول در جستارهای ساده و تجمیع بهترین عملکرد را دارند.

در ابتدا، ما انجام می دهیم count بدون تجمیع در جداول:

CSV — 11438 ثانیه

پارکت آپاچی — 352529 ثانیه

آپاچی ORC — 5474 ثانیه

در این مورد، آپاچی پارکت در مقایسه با بقیه عملکرد بدتری داشت. من معتقدم این الگوریتم فشرده سازی و رمزگذاری پارکت است که در این سناریو بیشترین زمان را صرف کرده است. برای هر سناریو، می‌توانید عملکرد بهتری با پارکت یا ORC داشته باشید، اما اکنون بیایید ببینیم که در مقایسه با سایر سناریوها با گروه‌بندی و سفارش‌دهی چگونه عمل می‌کند.

برای این مورد، ما انجام می دهیم count گروه بندی 20 میلیون رکورد بر اساس ستون location، شمارنده ما را به ترتیب نزولی سفارش می دهیم و آن را به 2 رکورد محدود می کنیم:

CSV — 33868 ثانیه

پارکت آپاچی — 22945 ثانیه

آپاچی ORC — 12781 ثانیه

در این سناریو پارکت عملکرد بهتری نسبت به CSV داشت که در سناریوی قبلی این اتفاق نیفتاد. حالا بیایید جدول ORC خود را با جدول ORC تقسیم بندی شده توسط ستون مقایسه کنیم rooms. برای انجام این کار، ما یک پرس و جو انجام دادیم که 20 میلیون رکورد گروه بندی شده توسط ستون را شمارش می کرد roomفیلتر کردن تنها املاکی که دارای 4 یا 5 اتاق خواب هستند و مرتب سازی بر اساس تعداد کل اتاق های دارای بیشترین تعداد ملک.

نتیجه:

ORC — 7562 ثانیه

ORC پارتیشن بندی شده — 2862 ثانیه

نتیجه گیری

Apache Hive چندین تنظیمات اضافی و سایر روش‌های بهینه‌سازی دارد که می‌توانند در سناریوهای مختلف اعمال شوند. چه کسی می داند، شاید در آینده مقاله ای بنویسم که فقط این تکنیک ها را خلاصه کند، بالاخره هر مشکل استراتژی بهینه سازی متفاوتی دارد. در زیر موارد دیگری وجود دارد که می توان برای همین سناریو در مقاله یا سناریوهای دیگر تحقیق کرد:

برداری – روشی برای بهینه سازی عملیات پرس و جو، فیلتر و تجمیع. به طور خلاصه، برداری، پردازش بلوک‌های خطوط را افزایش می‌دهد.

فشرده سازی – اساساً خواندن داده های فشرده. کندو دارای هوشی است که هنگام خواندن اطلاعات را باز می کند.

سطل – جداسازی فراتر از پارتیشن بندی، یعنی انعطاف پذیری برای تفکیک بیشتر داده ها.

پایان نامه موتور – همانطور که در این مقاله بیان شد، از موتور پردازش MapReduce استفاده شده است. با این حال، می توان از Tez برای افزایش سرعت MapReduce هنگام مونتاژ طرح پرس و جو استفاده کرد.

امیدوارم این مقاله را دوست داشته باشید و برای یادگیری شما واضح بوده باشد. اگر سوالی دارید، می توانید در لینکدین با من تماس بگیرید.

شروع کار با Hadoop و Apache Hive: معماری، پیکربندی و بهینه سازی

در این مقاله به دنبال نشان دادن نحوه راه‌اندازی یک محیط Hadoop با Apache Hive، نحوه عملکرد معماری داخلی Hive و استفاده از برخی منابع بهینه‌سازی برای پردازش داده‌ها با عملکرد پاسخ بالا هستم.

Apache Hive یکی از ابزارهای بنیاد آپاچی است که هدف آن تجزیه و تحلیل و ذخیره داده ها در سناریوهای کلان داده است. از یک موتور پرس و جو بر اساس مدل MapReduce استفاده می کند، با این حال، دارای یک لایه انتزاعی MapReduce برای اجرای کوئری های SQL به زبان خود به نام HiveQL است.

معماری Apache Hive

در معماری آن، ما چهار جزء اصلی داریم که در مراحل عملیات در Hive شرکت می کنند:

  1. راننده
  2. مشتریان کندو
  3. متاستور
  4. هادوپ

شروع با راننده، این کامپوننت مسئول تجزیه پرس و جو درخواست شده و انتقال آن به کارهای MapReduce با کمک مشخص کردن ابرداده جدول و برنامه اجرایی ایجاد شده بعدی است.

O مشتریان کندو این چیزی نیست جز رابطی برای برقراری ارتباط با Hive و اجرای عملیات. در این مقاله، من از beeline استفاده خواهم کرد، اما موارد دیگری مانند Hue و Hive CLI وجود دارد.

O متاستور کاتالوگ جداول موجود در Hive است، دارای اطلاعات پایگاه داده، جداول، ستون ها، پارتیشن ها و غیره است. MetaStore را می توان در DBMS های رابطه ای ذخیره کرد. در این مقاله من از PostgreSQL استفاده می کنم. هنگامی که MetaStore پیکربندی شد، هر شی ایجاد شده در آن ارجاع داده می شود.

در نهایت، هادوپ اینها اجزای اکوسیستم Hadoop هستند که Hive از آنها (MapReduce و HDFS) برای ذخیره داده ها و اجرای پرس و جوها استفاده می کند. در این مقاله من از Hadoop HDFS برای پردازش داده ها استفاده می کنم.

راه اندازی Hive Server و Hadoop

در این مقاله از Docker Compose با تصاویر لازم برای امکان پذیر ساختن این آزمایشگاه Apache Hive استفاده کردم.

version: "3"

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
    networks:
      - infra-network
    volumes:
      - namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop-hive.env
    ports:
      - "50070:50070"

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
    networks:
      - infra-network
    volumes:
      - datanode:/hadoop/dfs/data
      - ./dados:/hadoop/raw
    env_file:
      - ./hadoop-hive.env
    environment:
      SERVICE_PRECONDITION: "namenode:50070"
    ports:
      - "50075:50075"

  hive-server:
    image: bde2020/hive:2.3.2-postgresql-metastore
    networks:
      - infra-network
    env_file:
      - ./hadoop-hive.env
    environment:
      HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"
      SERVICE_PRECONDITION: "hive-metastore:9083"
    ports:
      - "10000:10000"

  hive-metastore:
    image: bde2020/hive:2.3.2-postgresql-metastore
    networks:
      - infra-network
    env_file:
      - ./hadoop-hive.env
    command: /opt/hive/bin/hive --service metastore
    environment:
      SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"
    ports:
      - "9083:9083"

  hive-metastore-postgresql:
    networks:
      - infra-network
    image: bde2020/hive-metastore-postgresql:2.3.0

  presto-coordinator:
    image: shawnzhu/prestodb:0.181
    networks:
      - infra-network    
    ports:
      - "8080:8080"

networks:
  infra-network:
    driver: bridge

volumes:
  namenode:

  datanode:

در این نوشتن، ما Datanode و Namenode Hadoop را داریم که هر دو را بر روی پورت های پیش فرض 50075 برای datanode و 50070 برای namenode، سرور hive-metastore در پورت 10000 و hive-metastore در پورت 9083 پیکربندی می کنیم. تصویر متاستور hive قبلاً PostgreSQL پیکربندی شد. در نهایت، ما PrestoDB را داریم که در این مورد، در این مقاله به آن نمی پردازم.

توجه داشته باشید که در سرویس datanode در Docker Compose، من در حال ایجاد یک حجم برای کپی فایل های موجود در آن هستم ./dados به /hadoop/raw. این فایل ها مجموعه داده ای هستند که من در این مقاله برای آزمایشگاه عملکرد Apache Hive استفاده می کنم. همان را می توان در اینجا یافت: Kaggle Dataset.

از آنجایی که این مجموعه داده تنها یک صفحه گسترده 78 مگابایتی دارد، من 27 صفحه گسترده را تکرار کردم تا بتوان آنها را به Hadoop اضافه کرد.

اجرای Docker Compose

پس از اجرای Docker Compose و شروع موفقیت آمیز کلیه خدمات، ابتدا از طریق دستور به کانتینر datanode Hadoop دسترسی خواهیم داشت:

docker exec -it hive_datanode_1 bash

پس از دسترسی موفقیت آمیز به کانتینر، اجازه دهید به پوشه حرکت کنیم /hadoop/raw برای تأیید اینکه همه فایل‌های CSV ما موجود هستند.

با تأیید اینکه فایل ها به کانتینر ارسال شده اند، اکنون دستور نگاشت این فایل ها را در HDFS اجرا می کنیم:

hadoop fs -put ./hadoop/raw/ /hadoop/raw/

پس از اجرای دستور، می‌توانیم فایل‌های موجود در دایرکتوری را از طریق namenode با URL: localhost:50070 ببینیم.

اتصال به Hive برای ایجاد جداول

حالا بیایید به Hive متصل شویم تا جدولی بر اساس داده ها ایجاد کنیم. برای این کار باید به کانتینر دسترسی داشته باشیم hive_hive-server_1، به دایرکتوری beeline در داخل پوشه Hive دسترسی پیدا کنید و از طریق beeline به Hive دسترسی پیدا کنید. در زیر دنباله دستورات آمده است:

  1. docker exec -it hive_hive-server_1 bash
  2. cd /opt/hive/bin
  3. beeline
  4. !connect jdbc:hive2://localhost:10000

از شما یک نام کاربری و رمز عبور خواسته می شود، می توانید دوبار اینتر را فشار دهید، زیرا به طور پیش فرض نام کاربری و رمز عبور وجود ندارد. پس از ترتیب دستورات، باید به این نتیجه برسید:

در اینجا ما در حال حاضر “درون” Hive هستیم و می توانیم عملیات خود را انجام دهیم، مانند: show databases;.

من پایگاه داده را ایجاد کردم estudo از طریق دستور: CREATE DATABASE ESTUDO; که پایگاه داده ای خواهد بود که در آن جداول تست های عملکرد را با Hive ایجاد خواهم کرد. قبل از شروع وارد کردن فایل‌های Hadoop به Hive، بیایید کمی بیشتر در مورد استراتژی‌های بهینه‌سازی که در اینجا اعمال می‌شود و انواع فایل‌هایی که آزمایش می‌شوند، بدانیم.

فایل های نوع پارکت آپاچی

فایل پارکت فایلی با فرمت باینری است که در قالب ستونی ذخیره می شود. عملکرد عالی برای مدیریت داده های انبوه پیچیده در اکوسیستم Hadoop دارد. دارای مفاهیم کلیدی مانند block size، row group ه page. O block size اندازه گروهی از ردیف هایی است که در حافظه بافر شده اند row group مجموعه خطوطی است که از یک بلوک داده برای هر ستون تشکیل شده است (به یاد داشته باشید که پارکت ستونی است)، در حالی که page اندازه صفحه برای فشرده سازی است که خواندن آن را آسان تر می کند، زیرا هر صفحه دارای یک بلوک اطلاعات است.

فایل های نوع ORC Apache

فایل‌های Apache ORC فایل‌های باینری هستند که در قالب داده‌های ستونی ذخیره می‌شوند و برای خواندن و نوشتن در Apache Hive کاملاً بهینه شده‌اند. مزیت بزرگ ORC نحوه ذخیره داده ها است. یک فایل ORC به اصطلاح دارای محدوده های داده ای است که در آن هر محدوده، علاوه بر یک بلوک داده، اطلاعات آماری برای هر ستون در مورد آن بلوک داده دارد. این امر جستجو را آسان‌تر می‌کند، زیرا از عملیات‌های ریاضی مانند حداقل، حداکثر، مجموع خطوط در هر محدوده استفاده می‌شود. علاوه بر این، اطلاعات آماری گاهی اوقات ذخیره می شود.

وارد کردن اطلاعات Hadoop به Hive

برای آزمایشگاه خود ما در مجموع چهار جدول ایجاد خواهیم کرد که عبارتند از:

  • dados_imoveis – جدول اصلی با فایل های CSV ما.
  • dados_imoveis_parquet – جدول با داده های منبع CSV ما برای پارکت آپاچی.
  • dados_imoveis_orc – جدول با داده های منبع CSV ما برای Apache ORC.
  • dados_imoveis_orc_partition – جدول با داده های ORC که در ساختار ذخیره سازی Hadoop آن توسط یک ستون خاص تقسیم شده است.

ابتدا، از قبل به Hive متصل شده‌ایم، اجازه دهید فایل‌های CSV خود را به جدول وارد کنیم dados_imoveis.

من جدول را درست کردم dados_imoveis و به Hive گفتم که با کاما مشخص شده است و به صورت خارجی در دایرکتوری ذخیره خواهد شد hdfs://hadoop/raw/dados_imoveis.

برای تکثیر داده ها و رسیدن به مجموع 20 میلیون رکورد، چندین بار همان داده را در جدول وارد کردم. dados_imoveis.

پس از انجام یک count در جدول، می‌توانیم تعداد کل رکوردها را تأیید کنیم.

سپس جدول را در پارکت آپاچی ایجاد کردم و رکوردها را بر اساس جدول درج کردم dados_imoveis.

در نهایت، جدول ORC و جدول ORC را که توسط ستون تقسیم شده است ایجاد کردم room، که با اطلاعات تعداد اتاق های هر ملک تخصیص داده می شود. یکی از جزئیات مهم در نحو ایجاد جدول پارتیشن بندی شده این است که ستون تعریف شده یک ستون جدید است و نمی تواند نام ستونی را که از قبل در جدول وجود دارد داشته باشد. جزئیات دیگر هنگام درج رکوردهاست که آخرین ستون درج باید اطلاعات پارتیشن بندی باشد.

پارتیشن بندی در کندو

در Apache Hive، در میان چندین منبعی که برای بهینه سازی عملیات خود داریم، پارتیشن بندی (Partitioned) وجود دارد. اساساً جدول را بر اساس مقادیر ستون مشخص شده هنگام ایجاد آن و محتوای موجود در آن جدول به بخش های کوچکتر تقسیم می کند. مزیت استفاده از این ویژگی سهولت جستجو بر اساس برش داده است، به خصوص زمانی که جستجو توسط یک ستون پارتیشن بندی شده انجام می شود. ساختار آن هنگام ایجاد به این شکل است:

هر پوشه ایجاد شده تعدادی از اطلاعات اتاق را نشان می دهد، که تضمین می کند فقط داده های مربوط به پرس و جو خوانده می شود و نه تنها زمان اجرا، بلکه ورودی/خروجی دیسک را نیز کاهش می دهد.

مقایسه عملکرد: CSV x پارکت x ORC

قبل از اینکه به اجرای جدول پارتیشن بندی شده بپردازیم، بیایید ارزیابی کنیم که کدام جداول در جستارهای ساده و تجمیع بهترین عملکرد را دارند.

در ابتدا، ما انجام می دهیم count بدون تجمیع در جداول:

  • CSV — 11438 ثانیه
  • پارکت آپاچی — 352529 ثانیه
  • آپاچی ORC — 5474 ثانیه

در این مورد، آپاچی پارکت در مقایسه با بقیه عملکرد بدتری داشت. من معتقدم این الگوریتم فشرده سازی و رمزگذاری پارکت است که در این سناریو بیشترین زمان را صرف کرده است. برای هر سناریو، می‌توانید عملکرد بهتری با پارکت یا ORC داشته باشید، اما اکنون بیایید ببینیم که در مقایسه با سایر سناریوها با گروه‌بندی و سفارش‌دهی چگونه عمل می‌کند.

برای این مورد، ما انجام می دهیم count گروه بندی 20 میلیون رکورد بر اساس ستون location، شمارنده ما را به ترتیب نزولی سفارش می دهیم و آن را به 2 رکورد محدود می کنیم:

  • CSV — 33868 ثانیه
  • پارکت آپاچی — 22945 ثانیه
  • آپاچی ORC — 12781 ثانیه

در این سناریو پارکت عملکرد بهتری نسبت به CSV داشت که در سناریوی قبلی این اتفاق نیفتاد. حالا بیایید جدول ORC خود را با جدول ORC تقسیم بندی شده توسط ستون مقایسه کنیم rooms. برای انجام این کار، ما یک پرس و جو انجام دادیم که 20 میلیون رکورد گروه بندی شده توسط ستون را شمارش می کرد roomفیلتر کردن تنها املاکی که دارای 4 یا 5 اتاق خواب هستند و مرتب سازی بر اساس تعداد کل اتاق های دارای بیشترین تعداد ملک.

نتیجه:

  • ORC — 7562 ثانیه
  • ORC پارتیشن بندی شده — 2862 ثانیه

نتیجه گیری

Apache Hive چندین تنظیمات اضافی و سایر روش‌های بهینه‌سازی دارد که می‌توانند در سناریوهای مختلف اعمال شوند. چه کسی می داند، شاید در آینده مقاله ای بنویسم که فقط این تکنیک ها را خلاصه کند، بالاخره هر مشکل استراتژی بهینه سازی متفاوتی دارد. در زیر موارد دیگری وجود دارد که می توان برای همین سناریو در مقاله یا سناریوهای دیگر تحقیق کرد:

  • برداری – روشی برای بهینه سازی عملیات پرس و جو، فیلتر و تجمیع. به طور خلاصه، برداری، پردازش بلوک‌های خطوط را افزایش می‌دهد.
  • فشرده سازی – اساساً خواندن داده های فشرده. کندو دارای هوشی است که هنگام خواندن اطلاعات را باز می کند.
  • سطل – جداسازی فراتر از پارتیشن بندی، یعنی انعطاف پذیری برای تفکیک بیشتر داده ها.
  • پایان نامه موتور – همانطور که در این مقاله بیان شد، از موتور پردازش MapReduce استفاده شده است. با این حال، می توان از Tez برای افزایش سرعت MapReduce هنگام مونتاژ طرح پرس و جو استفاده کرد.

امیدوارم این مقاله را دوست داشته باشید و برای یادگیری شما واضح بوده باشد. اگر سوالی دارید، می توانید در لینکدین با من تماس بگیرید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا