হাদুপে একাধিক মানচিত্রের কাজ শৃঙ্খলাবদ্ধ


124

অনেক বাস্তব-জীবনে আপনি যেখানে ম্যাপ্রেডস প্রয়োগ করেন সেখানে চূড়ান্ত অ্যালগরিদমগুলি বেশ কয়েকটি মানচিত্রের পদক্ষেপ হিসাবে শেষ হয়।

যেমন ম্যাপ 1, হ্রাস 1, মানচিত্র 2, হ্রাস 2 এবং আরও অনেক কিছু।

সুতরাং আপনার সর্বশেষ হ্রাস থেকে আউটপুট রয়েছে যা পরবর্তী মানচিত্রের ইনপুট হিসাবে প্রয়োজন।

মধ্যবর্তী ডেটা হ'ল এমন কিছু যা আপনি (সাধারণভাবে) একবার পাইপলাইন সফলভাবে সমাপ্ত হওয়ার পরে রাখতে চান না। এছাড়াও এই মধ্যবর্তী ডেটা সাধারণভাবে কিছু ডেটা স্ট্রাকচারের (যেমন একটি 'মানচিত্র' বা 'সেট') থাকে তাই আপনি এই কী-মান জোড়গুলি লিখতে এবং পড়তে খুব বেশি প্রচেষ্টা করতে চান না।

হাদুপে এটি করার প্রস্তাবিত উপায় কী?

এমন কোনও (সরল) উদাহরণ রয়েছে যা দেখায় যে কীভাবে পরিষ্কার করার পরে এই মধ্যবর্তী ডেটা সঠিক উপায়ে পরিচালনা করতে হবে?


2
কোন ম্যাপ্রেডস ফ্রেমওয়ার্ক ব্যবহার করছেন?
স্কাফম্যান

1
আমি প্রশ্নটি সম্পাদনা করে স্পষ্ট করে বলতে চেয়েছিলাম আমি হাদুপ সম্পর্কে কথা বলছি।
নীলস বাসজেস

আমি এর জন্য সোয়াইনহার্ড রত্নকে সুপারিশ করব: github.com/Ganglion/swineherd best, Tobias
টোবিয়াস

উত্তর:


57

আমি মনে করি ইয়াহুর বিকাশকারী নেটওয়ার্কের এই টিউটোরিয়ালটি আপনাকে এতে সহায়তা করবে: চেইনিং জবস

আপনি ব্যবহার JobClient.runJob()। প্রথম কাজ থেকে ডেটা আউটপুট পাথ আপনার দ্বিতীয় কাজের ইনপুট পাথ হয়ে যায়। এগুলিকে পার্স করতে এবং কাজের জন্য পরামিতিগুলি সেট করতে আপনার কোডগুলিতে উপযুক্ত কোড সহ যুক্তি হিসাবে পাস করতে হবে।

আমি মনে করি যে উপরের পদ্ধতিটি এখন পুরানো ম্যাপ্রেড এপিআই এর মতোই হতে পারে তবে এটি এখনও কাজ করা উচিত। নতুন ম্যাপ্রেডস এপিআই তে একই রকম পদ্ধতি থাকবে তবে আমি কী তা নিশ্চিত নই।

কোনও কাজ শেষ হওয়ার পরে অন্তর্বর্তী ডেটা সরিয়ে আপনি নিজের কোডটিতে এটি করতে পারেন। আমি আগে যেভাবে এটি করেছি তা হ'ল কিছু ব্যবহার করা:

FileSystem.delete(Path f, boolean recursive);

যেখানে পথটি ডেটা এইচডিএফএসের অবস্থান is আপনাকে নিশ্চিত করতে হবে যে অন্য কোনও কাজের প্রয়োজন না হলে আপনি কেবলমাত্র এই ডেটাটি মুছবেন।


3
ইয়াহু টিউটোরিয়ালের লিঙ্কের জন্য ধন্যবাদ। চেইনিং জবস আসলে আপনি যা চান তা যদি দু'জন একই রানে থাকে। আমি যা খুঁজছিলাম তা হ'ল যদি আপনি আলাদাভাবে এগুলি চালাতে সক্ষম হতে চান তবে সহজ উপায়টি way উল্লিখিত টিউটোরিয়ালে আমি সিকোয়েন্সফিলআউটপুট ফর্ম্যাটটি খুঁজে পেয়েছি "পরবর্তী ম্যাপ্রেইডস জবগুলিতে পড়ার জন্য উপযুক্ত বাইনারি ফাইলগুলি লিখে" এবং ম্যাচিং সিকোয়েন্সফাইলিপুট ফর্ম্যাট যা এটি সবই করা খুব সহজ করে তোলে। ধন্যবাদ।
নীল বাসজেস

20

আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে।

(1) ক্যাসকেডিং কাজ

প্রথম কাজের জন্য জবকনফ অবজেক্ট "জব 1" তৈরি করুন এবং "ইনপুট" ইনপুট ডিরেক্টরি হিসাবে এবং "টেম্প" আউটপুট ডিরেক্টরি হিসাবে সমস্ত পরামিতি সেট করুন। এই কাজটি কার্যকর করুন:

JobClient.run(job1).

এর ঠিক পরে নীচে, দ্বিতীয় কাজের জন্য জবকনফ অবজেক্ট "জব 2" তৈরি করুন এবং "টেম্প" দিয়ে ইনপুটডাইরেক্টরি এবং "আউটপুট" দিয়ে আউটপুট ডিরেক্টরি হিসাবে সমস্ত পরামিতি সেট করুন। এই কাজটি কার্যকর করুন:

JobClient.run(job2).

(২) দুটি জবকনফ অবজেক্ট তৈরি করুন এবং সেগুলির মধ্যে সমস্ত পরামিতি ঠিক ঠিক (1) হিসাবে সেট করুন যা আপনি জবক্লিয়েন্ট.আরুন ব্যবহার করেন না।

তারপরে পরামিতি হিসাবে জোবকনফসের সাহায্যে দুটি জব অবজেক্ট তৈরি করুন:

Job job1=new Job(jobconf1); 
Job job2=new Job(jobconf2);

জবকন্ট্রোল অবজেক্টটি ব্যবহার করে আপনি কাজের নির্ভরতা নির্দিষ্ট করে এবং তারপরে কাজগুলি চালান:

JobControl jbcntrl=new JobControl("jbcntrl");
jbcntrl.addJob(job1);
jbcntrl.addJob(job2);
job2.addDependingJob(job1);
jbcntrl.run();

(3) আপনার যদি মানচিত্র + এর মতো কিছু কাঠামোর প্রয়োজন হয় হ্রাস করুন | মানচিত্র *, আপনি চ্যানম্যাপার এবং চেইনরেডুসার ক্লাসগুলি ব্যবহার করতে পারেন যা হ্যাডোপ সংস্করণ 0.19 এবং এর পরে আসে।


7

এটি করার জন্য বেশ কয়েকটি উপায় রয়েছে। আমি দু'জনের দিকে ফোকাস করব।

একটি হ'ল রিফলের মাধ্যমে ( http://github.com/cwensel/riffle ) নির্ভর জিনিসগুলি সনাক্তকরণ এবং নির্ভরতা (টপোলজিকাল) ক্রমে তাদের 'চালিত' করার জন্য একটি টীকা পাঠাগার।

অথবা আপনি ক্যাসকেডিংয়ে একটি ক্যাসকেড (এবং ম্যাপ্রেইডসফ্লো) ব্যবহার করতে পারেন ( http://www.cascading.org/ )। ভবিষ্যতের সংস্করণ রিফলের টীকাগুলিকে সমর্থন করবে তবে এটি এখন কাঁচা এমআর জবকনফ কাজের সাথে দুর্দান্ত কাজ করে।

এর বৈকল্পিক হ'ল এমআর জবগুলি একেবারে হাতে পরিচালনা করা নয়, তবে ক্যাসকেডিং এপিআই ব্যবহার করে আপনার অ্যাপ্লিকেশন বিকাশ করা উচিত। তারপরে জবকনফ এবং জব চেইন অভ্যন্তরীণভাবে ক্যাসকেডিং পরিকল্পনাকারী এবং ফ্লো ক্লাসগুলির মাধ্যমে পরিচালনা করা হয়।

এইভাবে আপনি আপনার সমস্যার দিকে মনোনিবেশ করে আপনার সময় ব্যয় করেছেন, হ্যাডোপ কাজগুলি পরিচালনা করার মেকানিক্সগুলিতে নয় development এমনকি আপনি আপনার বিকাশ এবং অ্যাপ্লিকেশনগুলি আরও সহজ করার জন্য এমনকি উপরে বিভিন্ন ভাষাগুলিও উপরে রাখতে পারেন (ক্লোজার বা জুরবি জাতীয়)। http://www.cascading.org/modules.html


6

আমি একের পর এক জবকনফ অবজেক্টের সাহায্যে কাজ শৃঙ্খলাবদ্ধ করেছি। আমি কাজের শৃঙ্খলার জন্য ওয়ার্ডকাউন্টের উদাহরণ গ্রহণ করেছি। একটি কাজ নির্ধারণ করে যে প্রদত্ত আউটপুটে একটি শব্দ কতবার পুনরাবৃত্তি করেছে। দ্বিতীয় কাজটি ইনপুট হিসাবে প্রথম কাজের আউটপুট নেয় এবং প্রদত্ত ইনপুটটিতে মোট শব্দ বের করে। নীচে এমন কোড রয়েছে যা ড্রাইভার ক্লাসে স্থাপন করা দরকার।

    //First Job - Counts, how many times a word encountered in a given file 
    JobConf job1 = new JobConf(WordCount.class);
    job1.setJobName("WordCount");

    job1.setOutputKeyClass(Text.class);
    job1.setOutputValueClass(IntWritable.class);

    job1.setMapperClass(WordCountMapper.class);
    job1.setCombinerClass(WordCountReducer.class);
    job1.setReducerClass(WordCountReducer.class);

    job1.setInputFormat(TextInputFormat.class);
    job1.setOutputFormat(TextOutputFormat.class);

    //Ensure that a folder with the "input_data" exists on HDFS and contains the input files
    FileInputFormat.setInputPaths(job1, new Path("input_data"));

    //"first_job_output" contains data that how many times a word occurred in the given file
    //This will be the input to the second job. For second job, input data name should be
    //"first_job_output". 
    FileOutputFormat.setOutputPath(job1, new Path("first_job_output"));

    JobClient.runJob(job1);


    //Second Job - Counts total number of words in a given file

    JobConf job2 = new JobConf(TotalWords.class);
    job2.setJobName("TotalWords");

    job2.setOutputKeyClass(Text.class);
    job2.setOutputValueClass(IntWritable.class);

    job2.setMapperClass(TotalWordsMapper.class);
    job2.setCombinerClass(TotalWordsReducer.class);
    job2.setReducerClass(TotalWordsReducer.class);

    job2.setInputFormat(TextInputFormat.class);
    job2.setOutputFormat(TextOutputFormat.class);

    //Path name for this job should match first job's output path name
    FileInputFormat.setInputPaths(job2, new Path("first_job_output"));

    //This will contain the final output. If you want to send this jobs output
    //as input to third job, then third jobs input path name should be "second_job_output"
    //In this way, jobs can be chained, sending output one to other as input and get the
    //final output
    FileOutputFormat.setOutputPath(job2, new Path("second_job_output"));

    JobClient.runJob(job2);

এই কাজগুলি চালনার আদেশ হ'ল:

বিন / হাদুপ জার টোটাল ওয়ার্ডস।

কমান্ডের জন্য আমাদের চূড়ান্ত কাজের নাম দেওয়া দরকার। উপরের ক্ষেত্রে এটি টোটাল ওয়ার্ডস।


5

কোডে বর্ণিত পদ্ধতিতে আপনি এমআর চেইন চালাতে পারেন।

দয়া করে নোট করুন : কেবলমাত্র ড্রাইভার কোড সরবরাহ করা হয়েছে

public class WordCountSorting {
// here the word keys shall be sorted
      //let us write the wordcount logic first

      public static void main(String[] args)throws IOException,InterruptedException,ClassNotFoundException {
            //THE DRIVER CODE FOR MR CHAIN
            Configuration conf1=new Configuration();
            Job j1=Job.getInstance(conf1);
            j1.setJarByClass(WordCountSorting.class);
            j1.setMapperClass(MyMapper.class);
            j1.setReducerClass(MyReducer.class);

            j1.setMapOutputKeyClass(Text.class);
            j1.setMapOutputValueClass(IntWritable.class);
            j1.setOutputKeyClass(LongWritable.class);
            j1.setOutputValueClass(Text.class);
            Path outputPath=new Path("FirstMapper");
            FileInputFormat.addInputPath(j1,new Path(args[0]));
                  FileOutputFormat.setOutputPath(j1,outputPath);
                  outputPath.getFileSystem(conf1).delete(outputPath);
            j1.waitForCompletion(true);
                  Configuration conf2=new Configuration();
                  Job j2=Job.getInstance(conf2);
                  j2.setJarByClass(WordCountSorting.class);
                  j2.setMapperClass(MyMapper2.class);
                  j2.setNumReduceTasks(0);
                  j2.setOutputKeyClass(Text.class);
                  j2.setOutputValueClass(IntWritable.class);
                  Path outputPath1=new Path(args[1]);
                  FileInputFormat.addInputPath(j2, outputPath);
                  FileOutputFormat.setOutputPath(j2, outputPath1);
                  outputPath1.getFileSystem(conf2).delete(outputPath1, true);
                  System.exit(j2.waitForCompletion(true)?0:1);
      }

}

ক্রম

( JOB1 ) MAP-> REDUCE-> ( JOB2 ) মানচিত্রে
এই কী এখনো সাজানো যেমন একটি treemap ব্যবহার হিসাবে আরো উপায় আছে পেতে করা হয়েছিল
তবুও আমি পথ চাকরি শৃঙ্খলিত করা হয়েছে সম্মুখের আপনার মনোযোগ ফোকাস করতে চান! !
ধন্যবাদ



3

অ্যাপাচি মাহাউট প্রকল্পে এমন কয়েকটি উদাহরণ রয়েছে যা একাধিক মানচিত্রের কাজ একসাথে জড়িত। এর একটি উদাহরণ পাওয়া যাবে:

RecommenderJob.java

http://search-lucene.com/c/Mahout:/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java%7C%7CRecommenderJob


3

আমরা এর ব্যবহার করতে পারি waitForCompletion(true)কাজের মধ্যে নির্ভরতা নির্ধারণ কাজের পদ্ধতিটি করতে পারি।

আমার দৃশ্যে আমার 3 টি কাজ ছিল যা একে অপরের উপর নির্ভরশীল ছিল। ড্রাইভার ক্লাসে আমি নীচের কোডটি ব্যবহার করেছি এবং এটি প্রত্যাশার মতো কাজ করে।

public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub

        CCJobExecution ccJobExecution = new CCJobExecution();

        Job distanceTimeFraudJob = ccJobExecution.configureDistanceTimeFraud(new Configuration(),args[0], args[1]);
        Job spendingFraudJob = ccJobExecution.configureSpendingFraud(new Configuration(),args[0], args[1]);
        Job locationFraudJob = ccJobExecution.configureLocationFraud(new Configuration(),args[0], args[1]);

        System.out.println("****************Started Executing distanceTimeFraudJob ================");
        distanceTimeFraudJob.submit();
        if(distanceTimeFraudJob.waitForCompletion(true))
        {
            System.out.println("=================Completed DistanceTimeFraudJob================= ");
            System.out.println("=================Started Executing spendingFraudJob ================");
            spendingFraudJob.submit();
            if(spendingFraudJob.waitForCompletion(true))
            {
                System.out.println("=================Completed spendingFraudJob================= ");
                System.out.println("=================Started locationFraudJob================= ");
                locationFraudJob.submit();
                if(locationFraudJob.waitForCompletion(true))
                {
                    System.out.println("=================Completed locationFraudJob=================");
                }
            }
        }
    }

আপনার উত্তর কার্যকর করার ক্ষেত্রে এই চাকরিতে কীভাবে যোগদান করবেন সে সম্পর্কে। মূল প্রশ্নটি ছিল সেরা ডেটাস্ট্রাকচার সম্পর্কে। সুতরাং আপনার উত্তর এই নির্দিষ্ট প্রশ্নের জন্য প্রাসঙ্গিক নয়।
নীল বাসজেস

2

নতুন ক্লাস org.apache.hadoop.mapreduce.lib.chain.ChainMapper এই দৃশ্যে সহায়তা করে


1
উত্তরটি ভাল - তবে এটি কী করে সে সম্পর্কে আপনার আরও কিছু বিশদ যুক্ত করা উচিত বা কমপক্ষে একটি এপিআই রেফারেন্সের একটি লিঙ্ক যাতে লোকেরা ভোট দিতে পারে
জেরেমি হাজেক

চ্যানম্যাপার এবং চেইনরেডুসার হ্রাসের আগে 1 বা একাধিক ম্যাপার এবং হ্রাসের পরে 0 বা আরও ম্যাপার ব্যবহার করতে ব্যবহৃত হয় spec (ম্যাপার +) হ্রাস করুন (ম্যাপার *)। আমি যদি স্পষ্টতই ভুল হয়ে থাকি তবে আমাকে সংশোধন করুন তবে আমি মনে করি না যে এই পদ্ধতিটি ওপির অনুরোধ অনুসারে কাজগুলি শৃঙ্খলাবদ্ধভাবে সম্পাদন করবে।
oczkoisse

1

যদিও সেখানে জটিল সার্ভার ভিত্তিক হ্যাডোপ ওয়ার্কফ্লো ইঞ্জিন রয়েছে যেমন, ওজি, আমার কাছে একটি সাধারণ জাভা গ্রন্থাগার রয়েছে যা একাধিক হ্যাডোপ কাজের কার্যপ্রবাহ হিসাবে কার্যকর করতে সক্ষম করে। চাকরির কনফিগারেশন এবং আন্তঃজয় নির্ভরতা নির্ধারণের কার্যপ্রবাহ একটি JSON ফাইলে কনফিগার করা হয়েছে। সমস্ত কিছু বাহ্যিকভাবে কনফিগারযোগ্য এবং কার্যপ্রবাহের অংশ হতে বাস্তবায়ন হ্রাস করার জন্য বিদ্যমান মানচিত্রে কোনও পরিবর্তন প্রয়োজন হয় না।

বিস্তারিত এখানে পাওয়া যাবে। সোথ কোড এবং জারটি গিথুবে উপলভ্য।

http://pkghosh.wordpress.com/2011/05/22/hadoop-orchestration/

প্রণব


1

আমি মনে করি যে পূর্ববর্তী কাজ থেকে সরাসরি ইনপুটগুলি গ্রহণ করতে ওজি ফলাফলযুক্ত কাজগুলিকে সহায়তা করে। এটি জবকন্ট্রোল দিয়ে সম্পাদিত আই / ও অপারেশন এড়িয়ে চলে।


1

আপনি যদি প্রোগ্রামটিমেটিকভাবে আপনার কাজগুলি শৃঙ্খলা করতে চান তবে আপনি জবকন্ট্রোল ব্যবহার করতে পারবেন না। ব্যবহার বেশ সহজ:

JobControl jobControl = new JobControl(name);

এর পরে আপনি কন্ট্রোলডজব উদাহরণগুলি যুক্ত করুন। কন্ট্রোলডজব তার নির্ভরতাগুলির সাথে একটি চাকরিকে সংজ্ঞায়িত করে, সুতরাং কাজের "চেইন" মাপসই স্বয়ংক্রিয়ভাবে ইনপুট এবং আউটপুটগুলিকে প্লাগ করে।

    jobControl.add(new ControlledJob(job, Arrays.asList(controlledjob1, controlledjob2));

    jobControl.run();

চেইন শুরু। আপনি এটি একটি স্পিরিটে থ্রেডে রাখতে চাইবেন। এটি আপনার চেইনটির চলার স্থিতি পরীক্ষা করতে দেয়:

    while (!jobControl.allFinished()) {
        System.out.println("Jobs in waiting state: " + jobControl.getWaitingJobList().size());
        System.out.println("Jobs in ready state: " + jobControl.getReadyJobsList().size());
        System.out.println("Jobs in running state: " + jobControl.getRunningJobList().size());
        List<ControlledJob> successfulJobList = jobControl.getSuccessfulJobList();
        System.out.println("Jobs in success state: " + successfulJobList.size());
        List<ControlledJob> failedJobList = jobControl.getFailedJobList();
        System.out.println("Jobs in failed state: " + failedJobList.size());
    }

0

যেমন আপনি আপনার প্রয়োজনে উল্লেখ করেছেন যে আপনি এমআরজেব 1 এর ও / পি এমআর জব 2 এর আই / পি হতে চান এবং এই ব্যবহারের জন্য আপনি ওজির ওয়ার্কফ্লো ব্যবহার করতে পারেন। এছাড়াও আপনি এইচডিএফএসে আপনার মধ্যবর্তী ডেটা লেখার বিষয়টি বিবেচনা করতে পারেন কারণ এটি পরবর্তী এমআরজব ব্যবহার করবে by এবং কাজটি সম্পূর্ণ হওয়ার পরে আপনি আপনার মধ্যবর্তী ডেটা সাফ করতে পারেন।

<start to="mr-action1"/>
<action name="mr-action1">
   <!-- action for MRJob1-->
   <!-- set output path = /tmp/intermediate/mr1-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="mr-action2">
   <!-- action for MRJob2-->
   <!-- set input path = /tmp/intermediate/mr1-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="success">
        <!-- action for success-->
    <ok to="end"/>
    <error to="end"/>
</action>

<action name="fail">
        <!-- action for fail-->
    <ok to="end"/>
    <error to="end"/>
</action>

<end name="end"/>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.