DataFlow with Apache Flume

 

یک ابزار مناسب برای انتقال داده‌ها از یک منبع به یک ذخیره ساز داده جهت نگهداری و پردازش جریان داده Apache Flume می باشد.

flume توانایی انتقال داده‌ها به صورت  stream و log را از منابع مختلف مثل kafka , Local Disk , HTTP , SysLog و انواع دیگر منابع تولید دیتا را دارد.

اینجا یک مثال کاربردی و ساده برای انتقال event های تولید شده بر روی یک دیسک را به محیط HDFS را بررسی می کنیم.

 

ابتدا اجزای اصلی را تعیین می کنیم: منبع تولید داده (source) ، نوع ارتباط (channel) ، محل ذخیره سازی (sink)

agent.sources = iot-log
agent.sinks = hdfs-data
agent.channels = ch1
agent.channels.ch1.type = memory

سپس ارتباط مابین منبع و ذخیره ساز:

agent.sources.iot-log.channels = ch1
agent.sinks.hdfs-data.channel = ch1

مشخصات منبع. spooldir نام یکی از انواع source در flume است که فایلهای ایجاد شده در یک مسیر حاص را ارسال می کند. flieHeader برای اینکه مسیر اصلی فایل هم انتقال داده شود.

agent.sources.iot-log.type = spooldir
agent.sources.iot-log.spoolDir = /log/event/spool/
agent.sources.iot-log.fileHeader = true

پارامترهای محل انتقال و ذخیره داده ها. DataStream تغییری در نوع داده ایجاد نمی‌کند و فقط جریان داده دریافتی را ذخیره می‌کند.

agent.sinks.hdfs-data.type = hdfs
agent.sinks.hdfs-data.hdfs.fileType = DataStream
agent.sinks.hdfs-data.hdfs.path = /flume/event/iot/

 

هم اکنون این تنظیمات را در یک فایل مانند iot-data-stream.conf ذخیره و با دستور زیر بر روی سرور که flume نصب شده اجرا می‌کنیم

flume@hell:~# flume-ng agent -n agent -c conf -f /home/iot-data-stream.conf

هر فایل جدیدی که در مسیر /log/event/spool/ ایجاد گردد به محیط HDFS و در مسیر flume/event/iot/ منتقل می‌شود.

برای توضیحات کامل در مورد تمام پارامترها به http://flume.apache.org/FlumeUserGuide.html مراجعه کنید.

 

کپی فایل بین کلاسترهای Hadoop

 

برای کپی فایل بر روی یک کلاستر هدوپ از دستور DistCp به راحتی میشه استفاده کرد.

کاربرد این دستور برای کپی فایل بر روی چند کلاستر HDFS یا بین چندین کلاستر می باشد. این دستور از MapReduce  برای کپی کردن و ایجاد تسک‌های map برای توزیع کردن بلاک‌های فایل بر روی کلاستر استفاده می‌کند.

ساده ترین شکل استفاده از این دستور به صورت زیر است:

hadoop distcp hdfs://node-01:8020/source hdfs://node-02:8020/destination

با اجرا این دستور بر روی node-01 یک فایل temporary ایجاد شده و سپس با اجرای مجموعه ای از تسکهای map عملیات کپی بر روی HDFS مقصد با نام node-02 شروع می شود.

برای کپی چندین فایل از روی یک source بر روی مجموعه‌ای کلاسترها به صورت زیر نیز می‌توان کپی را انجام داد:

hadoop distcp hdfs://node-01:8020/source/xxa hdfs://node-01:8020/source/xxb hdfs://node-02:8020/destination