2017-07-14 4 views
0

Je doute que les données soient partitionnées en fichiers pièce si les données sont faussées. Si possible, aidez-moi à clarifier cela.Comment les données sont divisées en fichiers pièce dans sqoop

Disons ceci ma table department avec department_id comme clé primaire.

mysql> select * from departments; 
2 Fitness 
3 Footwear 
4 Apparel 
5 Golf 
6 Outdoors 
7 Fan Shop 

Si je sqoop import en mentionnant -m 1 dans la commande d'importation, je sais que je vais avoir qu'un seul fichier partie généré avec tous les enregistrements qui.

Maintenant, j'ai exécuté la commande sans spécifier aucun mappeur. Donc, par défaut, il devrait prendre 4 mappeurs et il a créé 4 fichiers de partie dans HDFS. Voici comment les documents ont été distribués par fichier de pièce.

[[email protected] ~]$ hadoop fs -cat /user/cloudera/departments/part-m-00000 
2,Fitness 
3,Footwear 
[[email protected] ~]$ hadoop fs -cat /user/cloudera/departments/part-m-00001 
4,Apparel 
[[email protected] ~]$ hadoop fs -cat /user/cloudera/departments/part-m-00002 
5,Golf 
[[email protected] ~]$ hadoop fs -cat /user/cloudera/departments/part-m-00003 
6,Outdoors 
7,Fan Shop 

Selon la BoundingValsQuery, Min (department_id) = 2, Max (department_id) = 8 et 4 mappeurs doivent être utilisées par défaut. Lors du calcul, chaque mappeur doit obtenir (8-2) /4=1.5 enregistrements.

Ici, je ne comprends pas comment distribuer les données. Je ne pouvais pas comprendre comment 2 enregistrements sont venus en partie-m-00000 et seulement un en partie-m-00001, partie-m-00002 et encore deux en partie-m-00003.

+0

vous devriez expliquer mieux que vous voulez si vous voulez que quelqu'un vous aide. Vous devriez au moins expliquer ce que vous voulez accomplir. –

+0

Je voulais savoir comment les données sont réparties entre les fichiers pièce, c'est-à-dire quel enregistrement va dans quel fichier pièce. – iamteja

+0

Sqoop crée une requête sql pour chaque mappeur. Vous pouvez vérifier le SQL de tous les nœuds de travailleurs. Pouvez-vous exécuter toute requête sql sur votre serveur sql et partager le résultat? –

Répondre

0

Si vous avez l'occasion de regarder dans la bibliothèque. Il y a une séquence d'étapes impliquées.

Travail Sqoop Lit les enregistrements. via DBRecordReader

org.apache.sqoop.mapreduce.db.DBRecordReader 

Deux méthodes vont travailler ici.

méthode 1.

protected ResultSet executeQuery(String query) throws SQLException { 
Integer fetchSize = dbConf.getFetchSize(); 
/*get fetchSize according to split which is calculated via getSplits() method of 
org.apache.sqoop.mapreduce.db.DBInputFormat.And no. of splits are calculated 
via no. of (count from table/no. of mappers). */ 
} 

Calcul de Split: -

org.apache.sqoop.mapreduce.db.DBInputFormat 
public List<InputSplit> getSplits(JobContext job) throws IOException { 
.......//here splits are calculated accroding to count of source table 
.......query.append("SELECT COUNT(*) FROM " + tableName); 
} 

méthode 2.

protected String getSelectQuery() { 
    if (dbConf.getInputQuery() == null) { 
     query.append("SELECT "); 

     for (int i = 0; i < fieldNames.length; i++) { 
     query.append(fieldNames[i]); 
     if (i != fieldNames.length -1) { 
      query.append(", "); 
     } 
     } 

     query.append(" FROM ").append(tableName); 
     query.append(" AS ").append(tableName); 
     if (conditions != null && conditions.length() > 0) { 
     query.append(" WHERE (").append(conditions).append(")"); 
     } 

     String orderBy = dbConf.getInputOrderBy(); 
     if (orderBy != null && orderBy.length() > 0) { 
     query.append(" ORDER BY ").append(orderBy); 
     } 
    } else { 
     //PREBUILT QUERY 
     query.append(dbConf.getInputQuery()); 
    } 

    try {// main logic to decide division of records between mappers. 
     query.append(" LIMIT ").append(split.getLength()); 
     query.append(" OFFSET ").append(split.getStart()); 
    } catch (IOException ex) { 
     // Ignore, will not throw. 
    } 

    return query.toString(); 
    } 

départ pour la section de code dans les commentaires logique principale .... ... Ici des enregistrements sont divisés selon LIMIT et OFFSET. Et cette logique est implémentée différemment pour chaque SGBDR. il suffit de chercher org.apache.sqoop.mapreduce.db.OracleDBRecordReader il a peu d'implémentation différente de la méthode getSelectQuery().

Espérons que cela donne une idée rapide de la façon dont les enregistrements sont divisés en différents mappeurs.

+0

@iamteja - Est-ce que cela a résolu votre problème? – syadav