1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 package org.apache.hadoop.io;
20 
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Date;
24 import java.util.EnumSet;
25 import java.util.HashMap;
26 import java.util.Map;
27 import java.util.Random;
28 
29 import org.apache.hadoop.conf.Configuration;
30 import org.apache.hadoop.conf.Configured;
31 import org.apache.hadoop.fs.FileStatus;
32 import org.apache.hadoop.fs.FileSystem;
33 import org.apache.hadoop.fs.Path;
34 import org.apache.hadoop.io.compress.CompressionCodec;
35 import org.apache.hadoop.io.compress.GzipCodec;
36 import org.apache.hadoop.io.Text;
37 import org.apache.hadoop.mapred.*;
38 import org.apache.hadoop.util.StringUtils;
39 import org.apache.hadoop.util.Tool;
40 import org.apache.hadoop.util.ToolRunner;
41 
42 public class FileBench extends Configured implements Tool {
43 
printUsage()44   static int printUsage() {
45     ToolRunner.printGenericCommandUsage(System.out);
46     System.out.println(
47 "Usage: Task list:           -[no]r -[no]w\n" +
48 "       Format:              -[no]seq -[no]txt\n" +
49 "       CompressionCodec:    -[no]zip -[no]pln\n" +
50 "       CompressionType:     -[no]blk -[no]rec\n" +
51 "       Required:            -dir <working dir>\n" +
52 "All valid combinations are implicitly enabled, unless an option is enabled\n" +
53 "explicitly. For example, specifying \"-zip\", excludes -pln,\n" +
54 "unless they are also explicitly included, as in \"-pln -zip\"\n" +
55 "Note that CompressionType params only apply to SequenceFiles\n\n" +
56 "Useful options to set:\n" +
57 "-D fs.defaultFS=\"file:///\" \\\n" +
58 "-D fs.file.impl=org.apache.hadoop.fs.RawLocalFileSystem \\\n" +
59 "-D filebench.file.bytes=$((10*1024*1024*1024)) \\\n" +
60 "-D filebench.key.words=5 \\\n" +
61 "-D filebench.val.words=20\n");
62     return -1;
63   }
64 
65   static String[] keys;
66   static String[] values;
67   static StringBuilder sentence = new StringBuilder();
68 
generateSentence(Random r, int noWords)69   private static String generateSentence(Random r, int noWords) {
70     sentence.setLength(0);
71     for (int i=0; i < noWords; ++i) {
72       sentence.append(words[r.nextInt(words.length)]);
73       sentence.append(" ");
74     }
75     return sentence.toString();
76   }
77 
78   // fill keys, values with ~1.5 blocks for block-compressed seq fill
fillBlocks(JobConf conf)79   private static void fillBlocks(JobConf conf) {
80     Random r = new Random();
81     long seed = conf.getLong("filebench.seed", -1);
82     if (seed > 0) {
83       r.setSeed(seed);
84     }
85 
86     int keylen = conf.getInt("filebench.key.words", 5);
87     int vallen = conf.getInt("filebench.val.words", 20);
88     int acc = (3 * conf.getInt("io.seqfile.compress.blocksize", 1000000)) >> 1;
89     ArrayList<String> k = new ArrayList<String>();
90     ArrayList<String> v = new ArrayList<String>();
91     for (int i = 0; acc > 0; ++i) {
92       String s = generateSentence(r, keylen);
93       acc -= s.length();
94       k.add(s);
95       s = generateSentence(r, vallen);
96       acc -= s.length();
97       v.add(s);
98     }
99     keys = k.toArray(new String[0]);
100     values = v.toArray(new String[0]);
101   }
102 
103   @SuppressWarnings("unchecked") // OutputFormat instantiation
writeBench(JobConf conf)104   static long writeBench(JobConf conf) throws IOException {
105     long filelen = conf.getLong("filebench.file.bytes", 5 * 1024 * 1024 * 1024);
106     Text key = new Text();
107     Text val = new Text();
108 
109     final String fn = conf.get("test.filebench.name", "");
110     final Path outd = FileOutputFormat.getOutputPath(conf);
111     conf.set("mapred.work.output.dir", outd.toString());
112     OutputFormat outf = conf.getOutputFormat();
113     RecordWriter<Text,Text> rw =
114       outf.getRecordWriter(outd.getFileSystem(conf), conf, fn,
115                            Reporter.NULL);
116     try {
117       long acc = 0L;
118       Date start = new Date();
119       for (int i = 0; acc < filelen; ++i) {
120         i %= keys.length;
121         key.set(keys[i]);
122         val.set(values[i]);
123         rw.write(key, val);
124         acc += keys[i].length();
125         acc += values[i].length();
126       }
127       Date end = new Date();
128       return end.getTime() - start.getTime();
129     } finally {
130       rw.close(Reporter.NULL);
131     }
132   }
133 
134   @SuppressWarnings("unchecked") // InputFormat instantiation
readBench(JobConf conf)135   static long readBench(JobConf conf) throws IOException {
136     InputFormat inf = conf.getInputFormat();
137     final String fn = conf.get("test.filebench.name", "");
138     Path pin = new Path(FileInputFormat.getInputPaths(conf)[0], fn);
139     FileStatus in = pin.getFileSystem(conf).getFileStatus(pin);
140     RecordReader rr = inf.getRecordReader(new FileSplit(pin, 0, in.getLen(),
141                                           (String[])null), conf, Reporter.NULL);
142     try {
143       Object key = rr.createKey();
144       Object val = rr.createValue();
145       Date start = new Date();
146       while (rr.next(key, val));
147       Date end = new Date();
148       return end.getTime() - start.getTime();
149     } finally {
150       rr.close();
151     }
152   }
153 
main(String[] args)154   public static void main(String[] args) throws Exception {
155     int res = ToolRunner.run(new Configuration(), new FileBench(), args);
156     System.exit(res);
157   }
158 
159   /**
160    * Process params from command line and run set of benchmarks specified.
161    */
run(String[] argv)162   public int run(String[] argv) throws IOException {
163     JobConf job = new JobConf(getConf());
164     EnumSet<CCodec> cc = null;
165     EnumSet<CType> ct = null;
166     EnumSet<Format> f = null;
167     EnumSet<RW> rw = null;
168     Path root = null;
169     FileSystem fs = FileSystem.get(job);
170     for(int i = 0; i < argv.length; ++i) {
171       try {
172         if ("-dir".equals(argv[i])) {
173           root = new Path(argv[++i]).makeQualified(fs);
174           System.out.println("DIR: " + root.toString());
175         } else if ("-seed".equals(argv[i])) {
176           job.setLong("filebench.seed", Long.valueOf(argv[++i]));
177         } else if (argv[i].startsWith("-no")) {
178           String arg = argv[i].substring(3);
179           cc = rem(CCodec.class, cc, arg);
180           ct = rem(CType.class, ct, arg);
181           f =  rem(Format.class, f, arg);
182           rw = rem(RW.class, rw, arg);
183         } else {
184           String arg = argv[i].substring(1);
185           cc = add(CCodec.class, cc, arg);
186           ct = add(CType.class, ct, arg);
187           f =  add(Format.class, f, arg);
188           rw = add(RW.class, rw, arg);
189         }
190       } catch (Exception e) {
191         throw (IOException)new IOException().initCause(e);
192       }
193     }
194     if (null == root) {
195       System.out.println("Missing -dir param");
196       printUsage();
197       return -1;
198     }
199 
200     fillBlocks(job);
201     job.setOutputKeyClass(Text.class);
202     job.setOutputValueClass(Text.class);
203     FileInputFormat.setInputPaths(job, root);
204     FileOutputFormat.setOutputPath(job, root);
205 
206     if (null == cc) cc = EnumSet.allOf(CCodec.class);
207     if (null == ct) ct = EnumSet.allOf(CType.class);
208     if (null == f)  f  = EnumSet.allOf(Format.class);
209     if (null == rw) rw = EnumSet.allOf(RW.class);
210     for (RW rwop : rw) {
211       for (Format fmt : f) {
212         fmt.configure(job);
213         for (CCodec cod : cc) {
214           cod.configure(job);
215           if (!(fmt == Format.txt || cod == CCodec.pln)) {
216             for (CType typ : ct) {
217               String fn =
218                 StringUtils.toUpperCase(fmt.name()) + "_" +
219                 StringUtils.toUpperCase(cod.name()) + "_" +
220                 StringUtils.toUpperCase(typ.name());
221               typ.configure(job);
222               System.out.print(
223                   StringUtils.toUpperCase(rwop.name()) + " " + fn + ": ");
224               System.out.println(rwop.exec(fn, job) / 1000 +
225                   " seconds");
226             }
227           } else {
228             String fn =
229               StringUtils.toUpperCase(fmt.name()) + "_" +
230               StringUtils.toUpperCase(cod.name());
231             Path p = new Path(root, fn);
232             if (rwop == RW.r && !fs.exists(p)) {
233               fn += cod.getExt();
234             }
235             System.out.print(
236                 StringUtils.toUpperCase(rwop.name()) + " " + fn + ": ");
237             System.out.println(rwop.exec(fn, job) / 1000 +
238                 " seconds");
239           }
240         }
241       }
242     }
243     return 0;
244   }
245 
246   // overwrought argument processing and wordlist follow
247   enum CCodec {
248     zip(GzipCodec.class, ".gz"), pln(null, "");
249 
250     Class<? extends CompressionCodec> inf;
251     String ext;
CCodec(Class<? extends CompressionCodec> inf, String ext)252     CCodec(Class<? extends CompressionCodec> inf, String ext) {
253       this.inf = inf;
254       this.ext = ext;
255     }
configure(JobConf job)256     public void configure(JobConf job) {
257       if (inf != null) {
258         job.setBoolean("mapred.output.compress", true);
259         job.setClass("mapred.output.compression.codec", inf,
260             CompressionCodec.class);
261       } else {
262         job.setBoolean("mapred.output.compress", false);
263       }
264     }
getExt()265     public String getExt() { return ext; }
266   }
267   enum CType {
268     blk("BLOCK"),
269     rec("RECORD");
270 
271     String typ;
CType(String typ)272     CType(String typ) { this.typ = typ; }
configure(JobConf job)273     public void configure(JobConf job) {
274       job.set("mapred.map.output.compression.type", typ);
275       job.set("mapred.output.compression.type", typ);
276     }
277   }
278   enum Format {
279     seq(SequenceFileInputFormat.class, SequenceFileOutputFormat.class),
280     txt(TextInputFormat.class, TextOutputFormat.class);
281 
282     Class<? extends InputFormat> inf;
283     Class<? extends OutputFormat> of;
Format(Class<? extends InputFormat> inf, Class<? extends OutputFormat> of)284     Format(Class<? extends InputFormat> inf, Class<? extends OutputFormat> of) {
285       this.inf = inf;
286       this.of = of;
287     }
configure(JobConf job)288     public void configure(JobConf job) {
289       if (null != inf) job.setInputFormat(inf);
290       if (null != of) job.setOutputFormat(of);
291     }
292   }
293   enum RW {
w()294     w() {
295       public long exec(String fn, JobConf job) throws IOException {
296         job.set("test.filebench.name", fn);
297         return writeBench(job);
298       }
299     },
300 
r()301     r() {
302       public long exec(String fn, JobConf job) throws IOException {
303         job.set("test.filebench.name", fn);
304         return readBench(job);
305       }
306     };
307 
exec(String fn, JobConf job)308     public abstract long exec(String fn, JobConf job) throws IOException;
309   }
310   static Map<Class<? extends Enum>, Map<String,? extends Enum>> fullmap
311     = new HashMap<Class<? extends Enum>, Map<String,? extends Enum>>();
312   static {
313     // can't effectively use Enum::valueOf
314     Map<String,CCodec> m1 = new HashMap<String,CCodec>();
v.name()315     for (CCodec v : CCodec.values()) m1.put(v.name(), v);
fullmap.put(CCodec.class, m1)316     fullmap.put(CCodec.class, m1);
317     Map<String,CType> m2 = new HashMap<String,CType>();
v.name()318     for (CType v : CType.values()) m2.put(v.name(), v);
fullmap.put(CType.class, m2)319     fullmap.put(CType.class, m2);
320     Map<String,Format> m3 = new HashMap<String,Format>();
v.name()321     for (Format v : Format.values()) m3.put(v.name(), v);
fullmap.put(Format.class, m3)322     fullmap.put(Format.class, m3);
323     Map<String,RW> m4 = new HashMap<String,RW>();
v.name()324     for (RW v : RW.values()) m4.put(v.name(), v);
fullmap.put(RW.class, m4)325     fullmap.put(RW.class, m4);
326   }
327 
rem(Class<T> c, EnumSet<T> set, String s)328   public static <T extends Enum<T>> EnumSet<T> rem(Class<T> c,
329       EnumSet<T> set, String s) {
330     if (null != fullmap.get(c) && fullmap.get(c).get(s) != null) {
331       if (null == set) {
332         set = EnumSet.allOf(c);
333       }
334       set.remove(fullmap.get(c).get(s));
335     }
336     return set;
337   }
338 
339   @SuppressWarnings("unchecked")
add(Class<T> c, EnumSet<T> set, String s)340   public static <T extends Enum<T>> EnumSet<T> add(Class<T> c,
341       EnumSet<T> set, String s) {
342     if (null != fullmap.get(c) && fullmap.get(c).get(s) != null) {
343       if (null == set) {
344         set = EnumSet.noneOf(c);
345       }
346       set.add((T)fullmap.get(c).get(s));
347     }
348     return set;
349   }
350 
351   /**
352    * A random list of 1000 words from /usr/share/dict/words
353    */
354   private static final String[] words = {
355     "diurnalness", "Homoiousian", "spiranthic", "tetragynian",
356     "silverhead", "ungreat", "lithograph", "exploiter",
357     "physiologian", "by", "hellbender", "Filipendula",
358     "undeterring", "antiscolic", "pentagamist", "hypoid",
359     "cacuminal", "sertularian", "schoolmasterism", "nonuple",
360     "gallybeggar", "phytonic", "swearingly", "nebular",
361     "Confervales", "thermochemically", "characinoid", "cocksuredom",
362     "fallacious", "feasibleness", "debromination", "playfellowship",
363     "tramplike", "testa", "participatingly", "unaccessible",
364     "bromate", "experientialist", "roughcast", "docimastical",
365     "choralcelo", "blightbird", "peptonate", "sombreroed",
366     "unschematized", "antiabolitionist", "besagne", "mastication",
367     "bromic", "sviatonosite", "cattimandoo", "metaphrastical",
368     "endotheliomyoma", "hysterolysis", "unfulminated", "Hester",
369     "oblongly", "blurredness", "authorling", "chasmy",
370     "Scorpaenidae", "toxihaemia", "Dictograph", "Quakerishly",
371     "deaf", "timbermonger", "strammel", "Thraupidae",
372     "seditious", "plerome", "Arneb", "eristically",
373     "serpentinic", "glaumrie", "socioromantic", "apocalypst",
374     "tartrous", "Bassaris", "angiolymphoma", "horsefly",
375     "kenno", "astronomize", "euphemious", "arsenide",
376     "untongued", "parabolicness", "uvanite", "helpless",
377     "gemmeous", "stormy", "templar", "erythrodextrin",
378     "comism", "interfraternal", "preparative", "parastas",
379     "frontoorbital", "Ophiosaurus", "diopside", "serosanguineous",
380     "ununiformly", "karyological", "collegian", "allotropic",
381     "depravity", "amylogenesis", "reformatory", "epidymides",
382     "pleurotropous", "trillium", "dastardliness", "coadvice",
383     "embryotic", "benthonic", "pomiferous", "figureheadship",
384     "Megaluridae", "Harpa", "frenal", "commotion",
385     "abthainry", "cobeliever", "manilla", "spiciferous",
386     "nativeness", "obispo", "monilioid", "biopsic",
387     "valvula", "enterostomy", "planosubulate", "pterostigma",
388     "lifter", "triradiated", "venialness", "tum",
389     "archistome", "tautness", "unswanlike", "antivenin",
390     "Lentibulariaceae", "Triphora", "angiopathy", "anta",
391     "Dawsonia", "becomma", "Yannigan", "winterproof",
392     "antalgol", "harr", "underogating", "ineunt",
393     "cornberry", "flippantness", "scyphostoma", "approbation",
394     "Ghent", "Macraucheniidae", "scabbiness", "unanatomized",
395     "photoelasticity", "eurythermal", "enation", "prepavement",
396     "flushgate", "subsequentially", "Edo", "antihero",
397     "Isokontae", "unforkedness", "porriginous", "daytime",
398     "nonexecutive", "trisilicic", "morphiomania", "paranephros",
399     "botchedly", "impugnation", "Dodecatheon", "obolus",
400     "unburnt", "provedore", "Aktistetae", "superindifference",
401     "Alethea", "Joachimite", "cyanophilous", "chorograph",
402     "brooky", "figured", "periclitation", "quintette",
403     "hondo", "ornithodelphous", "unefficient", "pondside",
404     "bogydom", "laurinoxylon", "Shiah", "unharmed",
405     "cartful", "noncrystallized", "abusiveness", "cromlech",
406     "japanned", "rizzomed", "underskin", "adscendent",
407     "allectory", "gelatinousness", "volcano", "uncompromisingly",
408     "cubit", "idiotize", "unfurbelowed", "undinted",
409     "magnetooptics", "Savitar", "diwata", "ramosopalmate",
410     "Pishquow", "tomorn", "apopenptic", "Haversian",
411     "Hysterocarpus", "ten", "outhue", "Bertat",
412     "mechanist", "asparaginic", "velaric", "tonsure",
413     "bubble", "Pyrales", "regardful", "glyphography",
414     "calabazilla", "shellworker", "stradametrical", "havoc",
415     "theologicopolitical", "sawdust", "diatomaceous", "jajman",
416     "temporomastoid", "Serrifera", "Ochnaceae", "aspersor",
417     "trailmaking", "Bishareen", "digitule", "octogynous",
418     "epididymitis", "smokefarthings", "bacillite", "overcrown",
419     "mangonism", "sirrah", "undecorated", "psychofugal",
420     "bismuthiferous", "rechar", "Lemuridae", "frameable",
421     "thiodiazole", "Scanic", "sportswomanship", "interruptedness",
422     "admissory", "osteopaedion", "tingly", "tomorrowness",
423     "ethnocracy", "trabecular", "vitally", "fossilism",
424     "adz", "metopon", "prefatorial", "expiscate",
425     "diathermacy", "chronist", "nigh", "generalizable",
426     "hysterogen", "aurothiosulphuric", "whitlowwort", "downthrust",
427     "Protestantize", "monander", "Itea", "chronographic",
428     "silicize", "Dunlop", "eer", "componental",
429     "spot", "pamphlet", "antineuritic", "paradisean",
430     "interruptor", "debellator", "overcultured", "Florissant",
431     "hyocholic", "pneumatotherapy", "tailoress", "rave",
432     "unpeople", "Sebastian", "thermanesthesia", "Coniferae",
433     "swacking", "posterishness", "ethmopalatal", "whittle",
434     "analgize", "scabbardless", "naught", "symbiogenetically",
435     "trip", "parodist", "columniform", "trunnel",
436     "yawler", "goodwill", "pseudohalogen", "swangy",
437     "cervisial", "mediateness", "genii", "imprescribable",
438     "pony", "consumptional", "carposporangial", "poleax",
439     "bestill", "subfebrile", "sapphiric", "arrowworm",
440     "qualminess", "ultraobscure", "thorite", "Fouquieria",
441     "Bermudian", "prescriber", "elemicin", "warlike",
442     "semiangle", "rotular", "misthread", "returnability",
443     "seraphism", "precostal", "quarried", "Babylonism",
444     "sangaree", "seelful", "placatory", "pachydermous",
445     "bozal", "galbulus", "spermaphyte", "cumbrousness",
446     "pope", "signifier", "Endomycetaceae", "shallowish",
447     "sequacity", "periarthritis", "bathysphere", "pentosuria",
448     "Dadaism", "spookdom", "Consolamentum", "afterpressure",
449     "mutter", "louse", "ovoviviparous", "corbel",
450     "metastoma", "biventer", "Hydrangea", "hogmace",
451     "seizing", "nonsuppressed", "oratorize", "uncarefully",
452     "benzothiofuran", "penult", "balanocele", "macropterous",
453     "dishpan", "marten", "absvolt", "jirble",
454     "parmelioid", "airfreighter", "acocotl", "archesporial",
455     "hypoplastral", "preoral", "quailberry", "cinque",
456     "terrestrially", "stroking", "limpet", "moodishness",
457     "canicule", "archididascalian", "pompiloid", "overstaid",
458     "introducer", "Italical", "Christianopaganism", "prescriptible",
459     "subofficer", "danseuse", "cloy", "saguran",
460     "frictionlessly", "deindividualization", "Bulanda", "ventricous",
461     "subfoliar", "basto", "scapuloradial", "suspend",
462     "stiffish", "Sphenodontidae", "eternal", "verbid",
463     "mammonish", "upcushion", "barkometer", "concretion",
464     "preagitate", "incomprehensible", "tristich", "visceral",
465     "hemimelus", "patroller", "stentorophonic", "pinulus",
466     "kerykeion", "brutism", "monstership", "merciful",
467     "overinstruct", "defensibly", "bettermost", "splenauxe",
468     "Mormyrus", "unreprimanded", "taver", "ell",
469     "proacquittal", "infestation", "overwoven", "Lincolnlike",
470     "chacona", "Tamil", "classificational", "lebensraum",
471     "reeveland", "intuition", "Whilkut", "focaloid",
472     "Eleusinian", "micromembrane", "byroad", "nonrepetition",
473     "bacterioblast", "brag", "ribaldrous", "phytoma",
474     "counteralliance", "pelvimetry", "pelf", "relaster",
475     "thermoresistant", "aneurism", "molossic", "euphonym",
476     "upswell", "ladhood", "phallaceous", "inertly",
477     "gunshop", "stereotypography", "laryngic", "refasten",
478     "twinling", "oflete", "hepatorrhaphy", "electrotechnics",
479     "cockal", "guitarist", "topsail", "Cimmerianism",
480     "larklike", "Llandovery", "pyrocatechol", "immatchable",
481     "chooser", "metrocratic", "craglike", "quadrennial",
482     "nonpoisonous", "undercolored", "knob", "ultratense",
483     "balladmonger", "slait", "sialadenitis", "bucketer",
484     "magnificently", "unstipulated", "unscourged", "unsupercilious",
485     "packsack", "pansophism", "soorkee", "percent",
486     "subirrigate", "champer", "metapolitics", "spherulitic",
487     "involatile", "metaphonical", "stachyuraceous", "speckedness",
488     "bespin", "proboscidiform", "gul", "squit",
489     "yeelaman", "peristeropode", "opacousness", "shibuichi",
490     "retinize", "yote", "misexposition", "devilwise",
491     "pumpkinification", "vinny", "bonze", "glossing",
492     "decardinalize", "transcortical", "serphoid", "deepmost",
493     "guanajuatite", "wemless", "arval", "lammy",
494     "Effie", "Saponaria", "tetrahedral", "prolificy",
495     "excerpt", "dunkadoo", "Spencerism", "insatiately",
496     "Gilaki", "oratorship", "arduousness", "unbashfulness",
497     "Pithecolobium", "unisexuality", "veterinarian", "detractive",
498     "liquidity", "acidophile", "proauction", "sural",
499     "totaquina", "Vichyite", "uninhabitedness", "allegedly",
500     "Gothish", "manny", "Inger", "flutist",
501     "ticktick", "Ludgatian", "homotransplant", "orthopedical",
502     "diminutively", "monogoneutic", "Kenipsim", "sarcologist",
503     "drome", "stronghearted", "Fameuse", "Swaziland",
504     "alen", "chilblain", "beatable", "agglomeratic",
505     "constitutor", "tendomucoid", "porencephalous", "arteriasis",
506     "boser", "tantivy", "rede", "lineamental",
507     "uncontradictableness", "homeotypical", "masa", "folious",
508     "dosseret", "neurodegenerative", "subtransverse", "Chiasmodontidae",
509     "palaeotheriodont", "unstressedly", "chalcites", "piquantness",
510     "lampyrine", "Aplacentalia", "projecting", "elastivity",
511     "isopelletierin", "bladderwort", "strander", "almud",
512     "iniquitously", "theologal", "bugre", "chargeably",
513     "imperceptivity", "meriquinoidal", "mesophyte", "divinator",
514     "perfunctory", "counterappellant", "synovial", "charioteer",
515     "crystallographical", "comprovincial", "infrastapedial", "pleasurehood",
516     "inventurous", "ultrasystematic", "subangulated", "supraoesophageal",
517     "Vaishnavism", "transude", "chrysochrous", "ungrave",
518     "reconciliable", "uninterpleaded", "erlking", "wherefrom",
519     "aprosopia", "antiadiaphorist", "metoxazine", "incalculable",
520     "umbellic", "predebit", "foursquare", "unimmortal",
521     "nonmanufacture", "slangy", "predisputant", "familist",
522     "preaffiliate", "friarhood", "corelysis", "zoonitic",
523     "halloo", "paunchy", "neuromimesis", "aconitine",
524     "hackneyed", "unfeeble", "cubby", "autoschediastical",
525     "naprapath", "lyrebird", "inexistency", "leucophoenicite",
526     "ferrogoslarite", "reperuse", "uncombable", "tambo",
527     "propodiale", "diplomatize", "Russifier", "clanned",
528     "corona", "michigan", "nonutilitarian", "transcorporeal",
529     "bought", "Cercosporella", "stapedius", "glandularly",
530     "pictorially", "weism", "disilane", "rainproof",
531     "Caphtor", "scrubbed", "oinomancy", "pseudoxanthine",
532     "nonlustrous", "redesertion", "Oryzorictinae", "gala",
533     "Mycogone", "reappreciate", "cyanoguanidine", "seeingness",
534     "breadwinner", "noreast", "furacious", "epauliere",
535     "omniscribent", "Passiflorales", "uninductive", "inductivity",
536     "Orbitolina", "Semecarpus", "migrainoid", "steprelationship",
537     "phlogisticate", "mesymnion", "sloped", "edificator",
538     "beneficent", "culm", "paleornithology", "unurban",
539     "throbless", "amplexifoliate", "sesquiquintile", "sapience",
540     "astucious", "dithery", "boor", "ambitus",
541     "scotching", "uloid", "uncompromisingness", "hoove",
542     "waird", "marshiness", "Jerusalem", "mericarp",
543     "unevoked", "benzoperoxide", "outguess", "pyxie",
544     "hymnic", "euphemize", "mendacity", "erythremia",
545     "rosaniline", "unchatteled", "lienteria", "Bushongo",
546     "dialoguer", "unrepealably", "rivethead", "antideflation",
547     "vinegarish", "manganosiderite", "doubtingness", "ovopyriform",
548     "Cephalodiscus", "Muscicapa", "Animalivora", "angina",
549     "planispheric", "ipomoein", "cuproiodargyrite", "sandbox",
550     "scrat", "Munnopsidae", "shola", "pentafid",
551     "overstudiousness", "times", "nonprofession", "appetible",
552     "valvulotomy", "goladar", "uniarticular", "oxyterpene",
553     "unlapsing", "omega", "trophonema", "seminonflammable",
554     "circumzenithal", "starer", "depthwise", "liberatress",
555     "unleavened", "unrevolting", "groundneedle", "topline",
556     "wandoo", "umangite", "ordinant", "unachievable",
557     "oversand", "snare", "avengeful", "unexplicit",
558     "mustafina", "sonable", "rehabilitative", "eulogization",
559     "papery", "technopsychology", "impressor", "cresylite",
560     "entame", "transudatory", "scotale", "pachydermatoid",
561     "imaginary", "yeat", "slipped", "stewardship",
562     "adatom", "cockstone", "skyshine", "heavenful",
563     "comparability", "exprobratory", "dermorhynchous", "parquet",
564     "cretaceous", "vesperal", "raphis", "undangered",
565     "Glecoma", "engrain", "counteractively", "Zuludom",
566     "orchiocatabasis", "Auriculariales", "warriorwise", "extraorganismal",
567     "overbuilt", "alveolite", "tetchy", "terrificness",
568     "widdle", "unpremonished", "rebilling", "sequestrum",
569     "equiconvex", "heliocentricism", "catabaptist", "okonite",
570     "propheticism", "helminthagogic", "calycular", "giantly",
571     "wingable", "golem", "unprovided", "commandingness",
572     "greave", "haply", "doina", "depressingly",
573     "subdentate", "impairment", "decidable", "neurotrophic",
574     "unpredict", "bicorporeal", "pendulant", "flatman",
575     "intrabred", "toplike", "Prosobranchiata", "farrantly",
576     "toxoplasmosis", "gorilloid", "dipsomaniacal", "aquiline",
577     "atlantite", "ascitic", "perculsive", "prospectiveness",
578     "saponaceous", "centrifugalization", "dinical", "infravaginal",
579     "beadroll", "affaite", "Helvidian", "tickleproof",
580     "abstractionism", "enhedge", "outwealth", "overcontribute",
581     "coldfinch", "gymnastic", "Pincian", "Munychian",
582     "codisjunct", "quad", "coracomandibular", "phoenicochroite",
583     "amender", "selectivity", "putative", "semantician",
584     "lophotrichic", "Spatangoidea", "saccharogenic", "inferent",
585     "Triconodonta", "arrendation", "sheepskin", "taurocolla",
586     "bunghole", "Machiavel", "triakistetrahedral", "dehairer",
587     "prezygapophysial", "cylindric", "pneumonalgia", "sleigher",
588     "emir", "Socraticism", "licitness", "massedly",
589     "instructiveness", "sturdied", "redecrease", "starosta",
590     "evictor", "orgiastic", "squdge", "meloplasty",
591     "Tsonecan", "repealableness", "swoony", "myesthesia",
592     "molecule", "autobiographist", "reciprocation", "refective",
593     "unobservantness", "tricae", "ungouged", "floatability",
594     "Mesua", "fetlocked", "chordacentrum", "sedentariness",
595     "various", "laubanite", "nectopod", "zenick",
596     "sequentially", "analgic", "biodynamics", "posttraumatic",
597     "nummi", "pyroacetic", "bot", "redescend",
598     "dispermy", "undiffusive", "circular", "trillion",
599     "Uraniidae", "ploration", "discipular", "potentness",
600     "sud", "Hu", "Eryon", "plugger",
601     "subdrainage", "jharal", "abscission", "supermarket",
602     "countergabion", "glacierist", "lithotresis", "minniebush",
603     "zanyism", "eucalypteol", "sterilely", "unrealize",
604     "unpatched", "hypochondriacism", "critically", "cheesecutter",
605   };
606 }
607