Любые предложения для чтения двух разных наборов данных в Hadoop одновременно? - PullRequest
0 голосов
/ 11 апреля 2011

Уважаемый hadooper: я новичок в hadoop и недавно пытаюсь реализовать алгоритм.

Этот алгоритм должен вычислять матрицу, которая представляет различный рейтинг для каждой двух пар песен.Я уже сделал это, и на выходе получилась разреженная матрица 600000 * 600000, которую я сохранил в своей HDFS.Давайте назовем этот набор данных A (размер = 160G)

Теперь мне нужно прочитать профили пользователей, чтобы предсказать их рейтинг для конкретной песни.Итак, мне нужно сначала прочитать профиль пользователя (размером 5G), позвольте вызвать этот набор данных B, а затем рассчитать, используя набор данных A.

Но теперь я не знаю, как читать два набора данныхиз одной программы Hadoop.Или я могу прочитать набор данных B в ОЗУ, а затем выполнить вычисления? (Я полагаю, что не могу, потому что HDFS - это распределенная система, и я не могу прочитать набор данных B в память одной машины).1008 * Есть предложения?

Ответы [ 2 ]

0 голосов
/ 21 марта 2014

Вы можете использовать две функции карты, каждая функция карты может обрабатывать один набор данных, если вы хотите реализовать различную обработку. Вы должны зарегистрировать свою карту с вашей работой Conf. Например:

           public static class FullOuterJoinStdDetMapper extends MapReduceBase implements Mapper <LongWritable ,Text ,Text, Text>
    {
            private String person_name, book_title,file_tag="person_book#";
            private String emit_value = new String();
            //emit_value = "";
            public void map(LongWritable key, Text values, OutputCollector<Text,Text>output, Reporter reporter)
                     throws IOException
            {
                    String line = values.toString();
                    try
                    {
                            String[] person_detail = line.split(",");
                            person_name = person_detail[0].trim();
                            book_title = person_detail[1].trim();
                    }
                    catch (ArrayIndexOutOfBoundsException e)
                    {
                            person_name = "student name missing";
                     }
                    emit_value = file_tag + person_name;
                    output.collect(new Text(book_title), new Text(emit_value));
            }

    }


       public static class FullOuterJoinResultDetMapper extends MapReduceBase implements  Mapper <LongWritable ,Text ,Text, Text>
     {
            private String author_name, book_title,file_tag="auth_book#";
            private String emit_value = new String();

// emit_value = ""; Открытая недействительная карта (LongWritable ключ, Текстовые значения, OutputCollectoroutput, Reporter Reporter) бросает IOException { String line = values.toString (); пытаться { String [] author_detail = line.split (","); author_name = author_detail [1] .trim (); book_title = author_detail [0] .trim (); } catch (ArrayIndexOutOfBoundsException e) { author_name = "Не отображается на экзамене"; }

                          emit_value = file_tag + author_name;                                     
                         output.collect(new Text(book_title), new Text(emit_value));
                 }

             }


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

           if(args.length !=3)
                    {
                            System.out.println("Input outpur file missing");
                            System.exit(-1);
                    }


            Configuration conf = new Configuration();
            String [] argum = new GenericOptionsParser(conf,args).getRemainingArgs();
            conf.set("mapred.textoutputformat.separator", ",");
            JobConf mrjob = new JobConf();
            mrjob.setJobName("Inner_Join");
            mrjob.setJarByClass(FullOuterJoin.class);

            MultipleInputs.addInputPath(mrjob,new Path(argum[0]),TextInputFormat.class,FullOuterJoinStdDetMapper.class);
            MultipleInputs.addInputPath(mrjob,new Path(argum[1]),TextInputFormat.class,FullOuterJoinResultDetMapper.class);

            FileOutputFormat.setOutputPath(mrjob,new Path(args[2]));
            mrjob.setReducerClass(FullOuterJoinReducer.class);

            mrjob.setOutputKeyClass(Text.class);
            mrjob.setOutputValueClass(Text.class);

            JobClient.runJob(mrjob);
    }
0 голосов
/ 12 апреля 2011

Haddop позволяет использовать разные форматы ввода карт для разных папок. Таким образом, вы можете читать из нескольких источников данных и затем приводить их к определенному типу в функции Map, т. Е. В одном случае вы получаете (String, User) в другом (String, SongSongRaiting) и ваша подпись Map - (String, Object). Второй шаг - это алгоритм выбора рекомендаций, каким-то образом объедините эти данные, чтобы у агрегатора было наименьшее количество информации, достаточное для расчета рекомендации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...