چرا پایتون را برای علوم داده و یادگیری ماشین انتخاب کنیم؟

میگن پایتون یه زبان برنامه‌نویسی ساده و قابل فهمه. به همین خاطر خیلی از مهندس‌ها و دانشمندها پایتون رو برای کارهای علمی و عددی انتخاب می‌کنن. شاید ترجیح میدن زودتر برن سراغ کار اصلی (مثلاً پیدا کردن اثر یا همبستگی یه متغیر با خروجی) به جای اینکه صدها ساعت صرف یاد گرفتن یه زبان برنامه‌نویسی پیچیده بکنن.

این باعث میشه که دانشمندها، مهندس‌ها، پژوهشگرها و تحلیلگرها زودتر پروژه رو شروع کنن و تو کمترین زمان و با کمترین منابع به نتایج با ارزش برسن. البته این به این معنی نیست که پایتون کامل و ایده‌آله برای تحلیل داده و یادگیری ماشین. زبان‌های دیگه مثل R ممکنه ویژگی‌هایی داشته باشن که پایتون نداره. ولی با این حال، پایتون یه نقطه شروع خوبه و میتونه به شما کمک کنه تا تحلیل داده‌ها رو بهتر بفهمید و تو پروژه‌های آینده‌تون ازش استفاده کنید.

پایتون در مقابل R

شاید قبلاً تو سایت‌هایی مثل Stack Overflow، Reddit، Quora و بقیه انجمن‌ها در مورد این موضوع شنیده باشید. شاید هم به دنبال زبان‌های برنامه‌نویسی دیگه‌ای گشته باشید چون در نهایت، یاد گرفتن پایتون یا R (یا هر زبان دیگه‌ای) چندین هفته و ماه طول می‌کشه. این یه سرمایه‌گذاری بزرگ زمانیه و نمی‌خواید اشتباه کنید.

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

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

با اینکه همه اینا قابل بحثه، پایتون هنوز یه انتخاب محبوبه، مخصوصاً بین مبتدی‌ها یا کسایی که میخوان سریع با تحلیل داده‌ها و یادگیری ماشین آشنا بشن. یاد گرفتنش نسبتاً آسونه و می‌تونید بعداً به برنامه‌نویسی تمام وقت مشغول بشید اگه تصمیم گرفتید که این مسیر برای شما مناسب‌تره.

استفاده گسترده از پایتون در تحلیل داده‌ها

امروزه بسته‌ها و ابزارهای زیادی وجود دارن که استفاده از پایتون در تحلیل داده‌ها و یادگیری ماشین رو خیلی راحت‌تر می‌کنن. TensorFlow (از گوگل)، Theano، scikit-learn، numpy و pandas فقط چند نمونه از چیزهایی هستن که علم داده رو سریع‌تر و آسون‌تر می‌کنن.

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

یکی دیگه از دلایل استفاده گسترده از پایتون اینه که منابع بی‌شماری وجود دارن که بهت میگن چطور تقریباً هر کاری رو انجام بدی. اگه سوالی داری، احتمال زیادی هست که یکی دیگه قبلاً اون رو پرسیده و یکی دیگه هم براش حلش کرده (گوگل و Stack Overflow دوستات هستن). این موضوع پایتون رو حتی محبوب‌تر می‌کنه چون منابع آنلاین زیادی وجود داره.

وضوح

به خاطر سادگی یادگیری و استفاده از پایتون (تا حدی به خاطر وضوح سینتکسش)، حرفه‌ای‌ها می‌تونن روی جنبه‌های مهم‌تر پروژه‌ها و مشکلاتشون تمرکز کنن. مثلاً، می‌تونن به جای ساختن همه چیز از اول، سریعاً از numpy، scikit-learn و TensorFlow استفاده کنن تا به بینش‌های لازم برسن.

این یه سطح دیگه از وضوح رو فراهم می‌کنه چون حرفه‌ای‌ها می‌تونن بیشتر روی ماهیت مشکل و پیامدهاش تمرکز کنن. اون‌ها همچنین می‌تونن روش‌های کارآمدتری برای مقابله با مشکل پیدا کنن به جای اینکه توی حجم زیاد اطلاعات یه زبان برنامه‌نویسی غرق بشن.

تمرکز همیشه باید روی مشکل و فرصت‌هایی باشه که ممکنه معرفی کنه. فقط یه کشف می‌تونه تمام طرز فکر ما رو درباره یه چالش خاص تغییر بده و پایتون ممکنه بتونه کمک کنه به خاطر وضوح و سادگی‌ش.

قراردادهای لاراول برای نامگذاری

بخش مربوطه قاعده اسم گذاری ✔️ روش قابل قبول ❌ روش اشتباه
Controller اسامی مفرد ArticleController ArticlesController
Route اسامی جمع articles/1 article/1
Route name روش snake_case همراه با نقاط اتصال users.show_active users.show-active, show-active-users
Model اسامی مفرد User Users
hasOne or belongsTo relationship اسامی مفرد articleComment articleComments, article_comment
All other relationships اسامی جمع articleComments articleComment, article_comments
Table اسامی جمع article_comments article_comment, articleComments
Pivot table نام مدل ها با اسامی مفرد و ترتیب الفبایی article_user user_article, articles_users
Table column روش snake_case بدون اسم مدل meta_title MetaTitle; article_meta_title
Model property روش snake_case $model->created_at $model->createdAt
Foreign key اسامی مفرد model name with _id suffix article_id ArticleId, id_article, articles_id
Primary key id custom_id
Migration 2017_01_01_000000_create_articles_table 2017_01_01_000000_articles
Method روش camelCase getAll get_all
Method in resource controller table store saveArticle
Method in test class روش camelCase testGuestCannotSeeArticle test_guest_cannot_see_article
Variable روش camelCase $articlesWithAuthor $articles_with_author
Collection توصیفی و اسامی جمع $activeUsers = User::active()->get() $active, $data
Object توصیفی و اسامی مفرد $activeUser = User::active()->first() $users, $obj
Config and language files index snake_case articles_enabled ArticlesEnabled; articles-enabled
View kebab-case show-filtered.blade.php showFiltered.blade.php, show_filtered.blade.php
Config snake_case google_calendar.php googleCalendar.php, google-calendar.php
Contract (interface) صفت یا اسم AuthenticationInterface Authenticatable, IAuthentication
Trait صفت Notifiable NotificationTrait
Trait (PSR) adjective NotifiableTrait Notification
Enum singular UserType UserTypesUserTypeEnum
FormRequest singular UpdateUserRequest UpdateUserFormRequestUserFormRequestUserRequest
Seeder singular UserSeeder UsersSeeder

اصول برنامه نویسی بهینه: اصل DRY (خودت را تکرار نکن)

اصل DRY (Don’t Repeat Yourself) یکی از اصول مهم در برنامه‌نویسی است که بر جلوگیری از تکرار کد و منطق تأکید دارد. هدف این اصل، کاهش تکرار کد و افزایش قابلیت نگهداری و خوانایی آن است. با رعایت اصل DRY، تغییرات در یک بخش از کد به‌طور خودکار در تمام بخش‌هایی که از آن کد استفاده می‌کنند، اعمال می‌شود و این باعث کاهش خطاها و افزایش بهره‌وری می‌شود.

در چارچوب لاراول، می‌توان اصل DRY را به چندین روش مختلف پیاده‌سازی کرد:

1. استفاده از کلاس‌های سرویس (Service Classes)

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

namespace App\Services;

class UserService
{
    public function register(array $data)
    {
        // منطق ثبت نام کاربر
    }

    public function updateProfile(User $user, array $data)
    {
        // منطق به روزرسانی پروفایل کاربر
    }
}

2. استفاده از کلاس‌های درخواست (Form Request Classes)

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

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RegisterRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ];
    }
}

روابط (Models and Relationships)

مدل‌ها و روابط بین آنها را به درستی تعریف کنید تا از تکرار کدهای مرتبط با دسترسی به داده‌ها جلوگیری کنید.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

4. استفاده از Blade کامپوننت‌ها و بخش‌ها (Blade Components and Sections)

در قالب‌های Blade از کامپوننت‌ها و بخش‌ها استفاده کنید تا از تکرار کدهای HTML جلوگیری شود.

<!-- resources/views/components/alert.blade.php -->
<div class="alert alert-{{ $type }}">
    {{ $slot }}
</div>

<!-- استفاده در یک ویو -->
<x-alert type="error">
    خطایی رخ داده است!
</x-alert>


5. استفاده از توابع و کلاس‌های کمکی (Helper Functions and Classes)

توابع و کلاس‌های کمکی تعریف کنید تا کدهای مشترک را در یک مکان قرار دهید و از تکرار آنها جلوگیری کنید.

// app/Helpers/helpers.php
if (! function_exists('formatDate')) {
    function formatDate($date)
    {
        return \Carbon\Carbon::parse($date)->format('Y-m-d');
    }
}


با رعایت این نکات و پیاده‌سازی اصل DRY در لاراول، کدهای شما تمیزتر، قابل نگهداری‌تر و خواناتر خواهند شد و احتمال بروز خطاهای ناشی از تکرار کد کاهش می‌یابد.

اصول برنامه نویسی بهینه:منطق برنامه باید در service class باشد

هر کنترلر باید یک وظیفه داشته باشد، بنابراین منطق برنامه را در service classes بنویسید. این یک رویکرد خوب برای طراحی برنامه‌های Laravel است. با قرار دادن منطق برنامه در کلاس‌های سرویس، شما مسئولیت‌های مربوط به منطق کسب و کار را از کنترلرها جدا می‌کنید و کدهای کنترلرها را ساده‌تر و قابل نگهداری‌تر می‌کنید.

در Laravel، کلاس‌های سرویس معمولاً در مسیر app/Services قرار می‌گیرند. این کلاس‌ها مسئولیت انجام عملیات مربوط به منطق کسب و کار را دارند. به عنوان مثال، شما می‌توانید یک کلاس سرویس برای مدیریت کاربران با نام UserService ایجاد کنید که شامل عملیات‌هایی مانند ثبت نام، ورود، به روزرسانی اطلاعات کاربری و … باشد.

با قرار دادن منطق برنامه در کلاس‌های سرویس، شما می‌توانید این کلاس‌ها را به راحتی تست کنید و قابلیت استفاده مجدد بالایی دارند. همچنین، کنترلرها فقط مسئولیت انجام عملیات مربوط به واسط کاربری و مسیریابی را دارند و تمام منطق کسب و کار به کلاس‌های سرویس منتقل می‌شود.

با این رویکرد، هر کنترلر فقط یک وظیفه دارد و منطق برنامه در کلاس‌های سرویس نگهداری می‌شود، که باعث ساده‌تر و قابل تست‌تر شدن کدها و افزایش انعطاف‌پذیری برنامه می‌شود.

روش نامناسب:

public function store(Request $request)
{
    if ($request->hasFile('image')) {
        $request->file('image')->move(public_path('images') . 'temp');
    }
    
    ...
}

روش بهتر:

public function store(Request $request)
{
    $this->articleService->handleUploadedImage($request->file('image'));

    ...
}

class ArticleService
{
    public function handleUploadedImage($image)
    {
        if (!is_null($image)) {
            $image->move(public_path('images') . 'temp');
        }
    }
}

 

اصول برنامه نویسی بهینه:اعتبارسنجی ها را در Request classes انجام دهید

اعتبارسنجی ها را در Request classes انجام دهید نه در controllers.

این یک رویکرد خوب برای پاک‌سازی کد و بهبود قابلیت نگهداری و تست است. با اعتبارسنجی را در کلاس‌های درخواست (Request classes) انجام دادن، مسئولیت‌های مربوط به اعتبارسنجی داده‌ها را از کنترلرها جدا می‌کنید و کدهای کنترلر را ساده‌تر و قابل مدیریت‌تر می‌کنید.

در لاراول، کلاس‌های درخواست معمولاً در مسیر app/Http/Requests قرار می‌گیرند. این کلاس‌ها مسئولیت اعتبارسنجی داده‌های درخواستی که توسط کاربران ارسال می‌شوند را دارند. به عنوان مثال، شما می‌توانید قوانین اعتبارسنجی مربوط به یک فرم ورود را در کلاسی به نام LoginRequest قرار دهید.

استفاده از کلاس‌های درخواست به شما این امکان را می‌دهد که قوانین اعتبارسنجی را یکبار تعریف کرده و در اکثر کنترلرها مورد استفاده قرار دهید. همچنین، این کلاس‌ها را می‌توانید به راحتی تست کنید و قابلیت استفاده مجدد بالایی دارند.

با این رویکرد، کنترلرها فقط مسئولیت انجام عملیات مربوط به برنامه (مانند استخراج داده‌های لازم از درخواست و انجام عملیات مربوطه بر روی آن) را دارند و اعتبارسنجی داده‌ها را به کلاس‌های درخواست منتقل می‌کنید. این باعث می‌شود کدهای کنترلرها ساده‌تر، قابل تست‌تر و قابل نگهداری‌تر باشند.

روش نادرست:

public function store(Request $request)
{
    $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
        'publish_at' => 'nullable|date',
    ]);

    ...
}

روش بهتر:

public function store(PostRequest $request)
{
    ...
}

class PostRequest extends Request
{
    public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
            'publish_at' => 'nullable|date',
        ];
    }
}

 

اصول برنامه نویسی بهینه: مدل های بزرگ،‌ کنترلرهای کوچک!

درسته، این یک رویکرد خوب برای طراحی سیستم‌های بزرگ و پیچیده است. با این رویکرد، مدل‌ها باید مسئولیت‌های مربوط به داده‌ها و منطق کسب و کار را بر عهده داشته باشند، در حالی که کنترلرها باید به عنوان واسط بین مدل‌ها و نماها عمل کنند و مسئولیت‌های مربوط به پردازش و توسط کاربر ارتباطی را بر عهده داشته باشند.

این رویکرد به شما کمک می‌کند تا کنترلرها را کوچک نگه دارید و آن‌ها را برای انجام وظایف مرتبط با واسط کاربری و مسیریابی بین مدل‌ها و نماها محدود کنید. این باعث می‌شود که کنترلرها ساده‌تر و قابل تست‌تر باشند.

همچنین، با نگه داشتن مدل‌ها بزرگ و تمرکز بر روی آن‌ها، می‌توانید منطق کسب و کار خود را به صورت منطقی و منظم سازماندهی کنید و از تکرار کدها جلوگیری کنید.

استفاده از الگوهای طراحی مانند Repository Pattern و Service Layer هم می‌تواند به شما کمک کند تا مدل‌ها را از کنترلرها جدا کرده و کد را سازماندهی و مدیریت بهتری دهید.

به طور کلی، رویکرد “مدل‌های بزرگ، کنترلرهای کوچک” بهبود قابلیت خوانایی، تست و توسعه سیستم‌های شما را تضمین می‌کند.

اگر از Query Builder یا raw SQL queries استفاده میکنید، تمام منطق پایگاه داده را در model ها یا Repository classes قرار بدهید.

روش اشتباه:

public function index()
{
    $clients = Client::verified()
        ->with(['orders' => function ($q) {
            $q->where('created_at', '>', Carbon::today()->subWeek());
        }])
        ->get();

    return view('index', ['clients' => $clients]);
}

روش بهتر:

public function index()
{
    return view('index', ['clients' => $this->client->getWithNewOrders()]);
}

class Client extends Model
{
    public function getWithNewOrders()
    {
        return $this->verified()
            ->with(['orders' => function ($q) {
                $q->where('created_at', '>', Carbon::today()->subWeek());
            }])
            ->get();
    }
}

 

اصول برنامه نویسی بهینه: اصل تک وظیفه ای بودن

اصل تک وظیفه‌ای بودن (Single Responsibility Principle یا SRP) از اصول اصلی برنامه‌نویسی شیءگراست که در فریم‌ورک لاراول نیز توصیه می‌شود. این اصل می‌گوید که هر کلاس یا قسمت از برنامه باید مسئولیت یک وظیفه خاص را داشته باشد و فقط در انجام آن وظیفه خاص تخصص داشته باشد.

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

برای رعایت اصل تک وظیفه‌ای بودن در لاراول، می‌توانید از مفاهیمی مانند مدل‌ها، کنترلرها، و توابع کمکی استفاده کنید. به عنوان مثال، می‌توانید توابع کمکی را در کلاس‌هایی جداگانه قرار دهید، مدل‌ها را برای کارهای مرتبط با دیتابیس و کنترلرها را برای مدیریت واسط کاربری و مسیریابی بین مدل‌ها و نماها استفاده کنید.

استفاده از الگوهای طراحی مانند Repository Pattern نیز می‌تواند به رعایت این اصل کمک کند، زیرا این الگو به شما کمک می‌کند تا کدهای مربوط به دسترسی به داده‌ها را جدا کنید و آن‌ها را در یک مکان متمرکز قرار دهید. این کمک می‌کند تا انعطاف‌پذیری بیشتری در مدیریت و توسعه برنامه داشته باشید.

با رعایت اصل تک وظیفه‌ای بودن در لاراول، کد شما بهبود می‌یابد و قابلیت خوانایی، تست و توسعه راحت‌تری را خواهد داشت.

روش اشتباه:

public function getFullNameAttribute(): string
{
    if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) {
        return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
    } else {
        return $this->first_name[0] . '. ' . $this->last_name;
    }
}

روش بهتر:

public function getFullNameAttribute(): string
{
    return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort();
}

public function isVerifiedClient(): bool
{
    return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified();
}

public function getFullNameLong(): string
{
    return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
}

public function getFullNameShort(): string
{
    return $this->first_name[0] . '. ' . $this->last_name;
}

 

ایجاد عنوانی از کلمات کلیدی برای تصویر

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

مدل اول که از مدل ResNet50 بدون لایه‌ی کلاس بالا برای استخراج ویژگی‌ها استفاده می‌کنیم، برای تشخیص ویژگی‌های بصری از تصویر استفاده می‌شود. این مدل با استفاده از یک شبکه عصبی عمیق، ویژگی‌های بالادستی متصل به کلاس‌های مختلف تصاویر را استخراج می‌کند.

مدل دوم که از یک مدل شبکه عصبی عمیق به نام SSD300 برای تشخیص اشیاء در تصویر استفاده می‌کنیم. این مدل قادر است تا چندین شیء مختلف را در یک تصویر تشخیص دهد. برای اینکه مدل بتواند اشیاء را به درستی تشخیص دهد، از یک نقشه برچسب استفاده می‌کنیم که شاخص کلاس‌ها را به نام‌های اجسام مختلف نگاشت می‌کند.

با ادغام قابلیت‌های این دو مدل، ابتدا با استفاده از مدل ResNet50 ویژگی‌های تصویر را استخراج می‌کنیم. سپس با استفاده از مدل SSD300 اشیاء موجود در تصویر را تشخیص داده و نام آن‌ها را استخراج می‌کنیم. در نهایت، با استفاده از نام‌های اشیاء شناسایی شده، یک عنوان برای تصویر ایجاد می‌کنیم.

در مجموع، این روش ترکیب قابلیت‌های یک مدل برای استخراج ویژگی‌ها و یک مدل دیگر برای تشخیص اشیاء، منجر به ایجاد یک عنوان بر اساس اشیاء شناسایی شده در تصویر می‌شود.


import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

# Load pre-trained ResNet50 model
model = ResNet50(weights='imagenet')

def generate_title(image_path):
# Load and preprocess the image
img = tf.keras.preprocessing.image.load_img(image_path, target_size=(224, 224))
img_array = tf.keras.preprocessing.image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)

# Make predictions
predictions = model.predict(img_array)
# Decode predictions
decoded_predictions = decode_predictions(predictions, top=10)[0]

# Extract labels from predictions
labels = [label for (_, label, _) in decoded_predictions]

# Generate title based on labels
title = " ".join(labels)

return title

# Example usage
image_path = "example_image.jpg"
title = generate_title(image_path)
print("Generated Title:", title)

 

Hadoop: راه‌اندازی یک خوشه تک‌گره‌ای

هدف
این سند توضیح می‌دهد چگونه یک نصب Hadoop تک‌گره‌ای را راه‌اندازی و پیکربندی کنید تا بتوانید به سرعت عملیات ساده‌ای با استفاده از MapReduce Hadoop و سیستم فایل توزیع‌شده Hadoop (HDFS) انجام دهید.

توجه: تمام خوشه‌های Hadoop تولیدی از Kerberos برای احراز هویت تماس‌گیران و دسترسی امن به داده‌های HDFS استفاده می‌کنند، همچنین دسترسی محدود به خدمات محاسباتی (YARN و غیره) را محدود می‌کنند.این دستورالعمل‌ها شامل ادغام با هیچ سرویس Kerberos نمی‌شوند، همه کسانی که یک خوشه تولیدی را ایجاد می‌کنند باید اتصال به زیرساخت Kerberos سازمان خود را به عنوان بخش کلیدی از پیاده‌سازی در نظر بگیرند.

پیش‌نیازها
پلتفرم‌های پشتیبانی شده
GNU/Linux به عنوان یک پلتفرم توسعه و تولید پشتیبانی می‌شود. Hadoop در خوشه‌های GNU/Linux با 2000 گره نشان داده شده است.

نرم‌افزارهای مورد نیاز

– باید Java™ نصب باشد. نسخه‌های پیشنهادی Java در HadoopJavaVersions توصیف شده است.
– ssh باید نصب شده و sshd باید در حال اجرا باشد تا از اسکریپت‌های Hadoop استفاده شود که دیمون‌های Hadoop را از راه دور مدیریت می‌کنند، در صورت استفاده از اسکریپت‌های start و stop اختیاری. علاوه بر این، توصیه می‌شود که pdsh نیز نصب شود تا مدیریت بهتری از منابع ssh انجام شود.

نصب نرم‌افزار
اگر خوشه شما دارای نرم‌افزارهای لازم نباشد، باید آن‌ها را نصب کنید.

برای مثال در لینوکس اوبونتو:

$ sudo apt-get install ssh
$ sudo apt-get install pdsh

دانلود
برای دریافت یک توزیع Hadoop، یک نسخه پایدار اخیر را از یکی از آینه‌های دانلود Apache بارگیری کنید.
آماده‌سازی برای شروع خوشه Hadoop
بسته‌ی Hadoop دانلود شده را باز کنید. در توزیع، فایل etc/hadoop/hadoop-env.sh را ویرایش کنید و برخی پارامترها را به شکل زیر تعریف کنید:

# مقدار دهی به ریشه نصب جاوا

export JAVA_HOME=/usr/java/latest

امتحان دستور زیر را انجام دهید:

$ bin/hadoop

این دستور مستندات استفاده از اسکریپت hadoop را نمایش می‌دهد.

اکنون شما آماده شروع خوشه Hadoop خود در یکی از سه حالت پشتیبانی شده هستید:

– حالت محلی (Standalone)
– حالت نیمه-توزیع‌شده
– حالت کاملاً توزیع‌شده

عملیات مستقل
به طور پیش‌فرض، Hadoop برای اجرا در حالت غیرتوزیع‌شده تنظیم شده است، به عنوان یک فرآیند جاوا تکی این برای اشکال‌زدایی مفید است.

مثال زیر دایرکتوری conf را کپی می‌کند تا برای ورود به استفاده شود و سپس هر تطابق با عبارت منظم داده شده را پیدا و نمایش می‌دهد. خروجی به دایرکتوری خروجی داده می‌شود.

$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output ‘dfs[a-z.]+’
$ cat output/*

عملیات نیمه-توزیع‌شده
Hadoop همچنین می‌تواند در حالت نیمه-توزیع‌شده بر روی یک گره تکی اجرا شود که در آن هر دیمون Hadoop در یک پردازش جاوا جداگانه اجرا می‌شود.

پیکربندی
از موارد زیر استفاده کنید:

etc/hadoop/core-site.xml:

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
etc/hadoop/hdfs-site.xml:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
راه‌اندازی اتصال SSH بدون نیاز به گذرواژه
اکنون بررسی کنید که بتوانید به localhost بدون نیاز به گذرواژه متصل شوید:

$ ssh localhost
اگر نتوانید بدون نیاز به گذرواژه به localhost متصل شوید، دستورات زیر را اجرا کنید:

$ ssh-keygen -t rsa -P ” -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

اجرا
دستورات زیر برای اجرای یک کار MapReduce به صورت محلی استفاده می‌شوند. اگر می‌خواهید یک کار را بر روی YARN اجرا کنید، راهنمای YARN در یک گره تک را ببینید.

فرمت داده‌سازی فایل سیستم:

$ bin/hdfs namenode -format

شروع دیمون NameNode و دیمون DataNode:

 

$ sbin/start-dfs.sh

خروجی لاگ دیمون Hadoop در دایرکتوری $HADOOP_LOG_DIR نوشته می‌شود (به صورت پیش‌فرض در $HADOOP_HOME/logs).

صفحه وب NameNode را مشاهده کنید؛ به طور پیش‌فرض در دسترس است:

NameNode – http://localhost:9870/

پوشه‌های HDFS لازم برای اجرای کارهای MapReduce را ایجاد کنید:

$ bin/hdfs dfs -mkdir -p /user/<username>

فایل‌های ورودی را به فایل‌سیستم توزیع‌شده کپی کنید:

$ bin/hdfs dfs -mkdir input
$ bin/hdfs dfs -put etc/hadoop/*.xml input

چندین نمونه از مثال‌های ارائه شده را اجرا کنید:

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output ‘dfs[a-z.]+’

فایل‌های خروجی را بررسی کنید: فایل‌های خروجی را از فایل‌سیستم توزیع‌شده به فایل‌سیستم محلی کپی کرده و آن‌ها را بررسی کنید:

$ bin/hdfs dfs -get output output
$ cat output/*

یا

فایل‌های خروجی را در فایل‌سیستم توزیع‌شده مشاهده کنید:

$ bin/hdfs dfs -cat output/*

وقتی کار تمام شد، دیمون‌ها را با دستور زیر متوقف کنید:

$ sbin/stop-dfs.sh

YARN در یک گره تک
می‌توانید یک کار MapReduce را در YARN به حالت نیمه-توزیع‌شده اجرا کنید با تنظیم چندین پارامتر و اجرای دیمون ResourceManager و دیمون NodeManager به علاوه.

دستورات زیر فرض می‌کنند که مراحل ۱ تا ۴ از دستورات فوق از قبل انجام شده است.

پارامترها را به صورت زیر پیکربندی کنید:

etc/hadoop/mapred-site.xml:

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,

HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>

دیمون ResourceManager و دیمون NodeManager را راه‌اندازی کنید:

$ sbin/start-yarn.sh

صفحه وب ResourceManager را مشاهده کنید؛ به طور پیش‌فرض در دسترس است:

ResourceManager – http://localhost:8088/

یک کار MapReduce را اجرا کنید.

وقتی کار تمام شد، دیمون‌ها را با دستور زیر متوقف کنید:

$ sbin/stop-yarn.sh