[120] | 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.mapred; |
---|
| 20 | |
---|
| 21 | import java.io.DataInput; |
---|
| 22 | import java.io.DataOutput; |
---|
| 23 | import java.io.IOException; |
---|
| 24 | import java.util.ArrayList; |
---|
| 25 | import java.util.Date; |
---|
| 26 | import java.util.Iterator; |
---|
| 27 | import java.util.Random; |
---|
| 28 | import java.util.Stack; |
---|
| 29 | |
---|
| 30 | import org.apache.hadoop.conf.Configuration; |
---|
| 31 | import org.apache.hadoop.conf.Configured; |
---|
| 32 | import org.apache.hadoop.fs.FileStatus; |
---|
| 33 | import org.apache.hadoop.fs.FileSystem; |
---|
| 34 | import org.apache.hadoop.fs.Path; |
---|
| 35 | import org.apache.hadoop.io.LongWritable; |
---|
| 36 | import org.apache.hadoop.io.SequenceFile; |
---|
| 37 | import org.apache.hadoop.io.Text; |
---|
| 38 | import org.apache.hadoop.io.Writable; |
---|
| 39 | import org.apache.hadoop.io.WritableComparable; |
---|
| 40 | import org.apache.hadoop.io.WritableUtils; |
---|
| 41 | import org.apache.hadoop.mapred.lib.NullOutputFormat; |
---|
| 42 | import org.apache.hadoop.util.GenericOptionsParser; |
---|
| 43 | import org.apache.hadoop.util.ReflectionUtils; |
---|
| 44 | import org.apache.hadoop.util.Tool; |
---|
| 45 | import org.apache.hadoop.util.ToolRunner; |
---|
| 46 | |
---|
| 47 | public class GenericMRLoadGenerator extends Configured implements Tool { |
---|
| 48 | |
---|
| 49 | protected static int printUsage() { |
---|
| 50 | System.err.println( |
---|
| 51 | "Usage: [-m <maps>] [-r <reduces>]\n" + |
---|
| 52 | " [-keepmap <percent>] [-keepred <percent>]\n" + |
---|
| 53 | " [-indir <path>] [-outdir <path]\n" + |
---|
| 54 | " [-inFormat[Indirect] <InputFormat>] [-outFormat <OutputFormat>]\n" + |
---|
| 55 | " [-outKey <WritableComparable>] [-outValue <Writable>]\n"); |
---|
| 56 | GenericOptionsParser.printGenericCommandUsage(System.err); |
---|
| 57 | return -1; |
---|
| 58 | } |
---|
| 59 | |
---|
| 60 | |
---|
| 61 | /** |
---|
| 62 | * Configure a job given argv. |
---|
| 63 | */ |
---|
| 64 | public static boolean parseArgs(String[] argv, JobConf job) throws IOException { |
---|
| 65 | if (argv.length < 1) { |
---|
| 66 | return 0 == printUsage(); |
---|
| 67 | } |
---|
| 68 | for(int i=0; i < argv.length; ++i) { |
---|
| 69 | if (argv.length == i + 1) { |
---|
| 70 | System.out.println("ERROR: Required parameter missing from " + |
---|
| 71 | argv[i]); |
---|
| 72 | return 0 == printUsage(); |
---|
| 73 | } |
---|
| 74 | try { |
---|
| 75 | if ("-m".equals(argv[i])) { |
---|
| 76 | job.setNumMapTasks(Integer.parseInt(argv[++i])); |
---|
| 77 | } else if ("-r".equals(argv[i])) { |
---|
| 78 | job.setNumReduceTasks(Integer.parseInt(argv[++i])); |
---|
| 79 | } else if ("-inFormat".equals(argv[i])) { |
---|
| 80 | job.setInputFormat( |
---|
| 81 | Class.forName(argv[++i]).asSubclass(InputFormat.class)); |
---|
| 82 | } else if ("-outFormat".equals(argv[i])) { |
---|
| 83 | job.setOutputFormat( |
---|
| 84 | Class.forName(argv[++i]).asSubclass(OutputFormat.class)); |
---|
| 85 | } else if ("-outKey".equals(argv[i])) { |
---|
| 86 | job.setOutputKeyClass( |
---|
| 87 | Class.forName(argv[++i]).asSubclass(WritableComparable.class)); |
---|
| 88 | } else if ("-outValue".equals(argv[i])) { |
---|
| 89 | job.setOutputValueClass( |
---|
| 90 | Class.forName(argv[++i]).asSubclass(Writable.class)); |
---|
| 91 | } else if ("-keepmap".equals(argv[i])) { |
---|
| 92 | job.set("hadoop.sort.map.keep.percent", argv[++i]); |
---|
| 93 | } else if ("-keepred".equals(argv[i])) { |
---|
| 94 | job.set("hadoop.sort.reduce.keep.percent", argv[++i]); |
---|
| 95 | } else if ("-outdir".equals(argv[i])) { |
---|
| 96 | FileOutputFormat.setOutputPath(job, new Path(argv[++i])); |
---|
| 97 | } else if ("-indir".equals(argv[i])) { |
---|
| 98 | FileInputFormat.addInputPaths(job, argv[++i]); |
---|
| 99 | } else if ("-inFormatIndirect".equals(argv[i])) { |
---|
| 100 | job.setClass("mapred.indirect.input.format", |
---|
| 101 | Class.forName(argv[++i]).asSubclass(InputFormat.class), |
---|
| 102 | InputFormat.class); |
---|
| 103 | job.setInputFormat(IndirectInputFormat.class); |
---|
| 104 | } else { |
---|
| 105 | System.out.println("Unexpected argument: " + argv[i]); |
---|
| 106 | return 0 == printUsage(); |
---|
| 107 | } |
---|
| 108 | } catch (NumberFormatException except) { |
---|
| 109 | System.out.println("ERROR: Integer expected instead of " + argv[i]); |
---|
| 110 | return 0 == printUsage(); |
---|
| 111 | } catch (Exception e) { |
---|
| 112 | throw (IOException)new IOException().initCause(e); |
---|
| 113 | } |
---|
| 114 | } |
---|
| 115 | return true; |
---|
| 116 | } |
---|
| 117 | |
---|
| 118 | public int run(String [] argv) throws Exception { |
---|
| 119 | JobConf job = new JobConf(getConf()); |
---|
| 120 | job.setJarByClass(GenericMRLoadGenerator.class); |
---|
| 121 | job.setMapperClass(SampleMapper.class); |
---|
| 122 | job.setReducerClass(SampleReducer.class); |
---|
| 123 | if (!parseArgs(argv, job)) { |
---|
| 124 | return -1; |
---|
| 125 | } |
---|
| 126 | |
---|
| 127 | if (null == FileOutputFormat.getOutputPath(job)) { |
---|
| 128 | // No output dir? No writes |
---|
| 129 | job.setOutputFormat(NullOutputFormat.class); |
---|
| 130 | } |
---|
| 131 | |
---|
| 132 | if (0 == FileInputFormat.getInputPaths(job).length) { |
---|
| 133 | // No input dir? Generate random data |
---|
| 134 | System.err.println("No input path; ignoring InputFormat"); |
---|
| 135 | confRandom(job); |
---|
| 136 | } else if (null != job.getClass("mapred.indirect.input.format", null)) { |
---|
| 137 | // specified IndirectInputFormat? Build src list |
---|
| 138 | JobClient jClient = new JobClient(job); |
---|
| 139 | Path sysdir = jClient.getSystemDir(); |
---|
| 140 | Random r = new Random(); |
---|
| 141 | Path indirInputFile = new Path(sysdir, |
---|
| 142 | Integer.toString(r.nextInt(Integer.MAX_VALUE), 36) + "_files"); |
---|
| 143 | job.set("mapred.indirect.input.file", indirInputFile.toString()); |
---|
| 144 | SequenceFile.Writer writer = SequenceFile.createWriter( |
---|
| 145 | sysdir.getFileSystem(job), job, indirInputFile, |
---|
| 146 | LongWritable.class, Text.class, |
---|
| 147 | SequenceFile.CompressionType.NONE); |
---|
| 148 | try { |
---|
| 149 | for (Path p : FileInputFormat.getInputPaths(job)) { |
---|
| 150 | FileSystem fs = p.getFileSystem(job); |
---|
| 151 | Stack<Path> pathstack = new Stack<Path>(); |
---|
| 152 | pathstack.push(p); |
---|
| 153 | while (!pathstack.empty()) { |
---|
| 154 | for (FileStatus stat : fs.listStatus(pathstack.pop())) { |
---|
| 155 | if (stat.isDir()) { |
---|
| 156 | if (!stat.getPath().getName().startsWith("_")) { |
---|
| 157 | pathstack.push(stat.getPath()); |
---|
| 158 | } |
---|
| 159 | } else { |
---|
| 160 | writer.sync(); |
---|
| 161 | writer.append(new LongWritable(stat.getLen()), |
---|
| 162 | new Text(stat.getPath().toUri().toString())); |
---|
| 163 | } |
---|
| 164 | } |
---|
| 165 | } |
---|
| 166 | } |
---|
| 167 | } finally { |
---|
| 168 | writer.close(); |
---|
| 169 | } |
---|
| 170 | } |
---|
| 171 | |
---|
| 172 | Date startTime = new Date(); |
---|
| 173 | System.out.println("Job started: " + startTime); |
---|
| 174 | JobClient.runJob(job); |
---|
| 175 | Date endTime = new Date(); |
---|
| 176 | System.out.println("Job ended: " + endTime); |
---|
| 177 | System.out.println("The job took " + |
---|
| 178 | (endTime.getTime() - startTime.getTime()) /1000 + |
---|
| 179 | " seconds."); |
---|
| 180 | |
---|
| 181 | return 0; |
---|
| 182 | } |
---|
| 183 | |
---|
| 184 | /** |
---|
| 185 | * Main driver/hook into ToolRunner. |
---|
| 186 | */ |
---|
| 187 | public static void main(String[] argv) throws Exception { |
---|
| 188 | int res = |
---|
| 189 | ToolRunner.run(new Configuration(), new GenericMRLoadGenerator(), argv); |
---|
| 190 | System.exit(res); |
---|
| 191 | } |
---|
| 192 | |
---|
| 193 | static class RandomInputFormat implements InputFormat { |
---|
| 194 | |
---|
| 195 | public InputSplit[] getSplits(JobConf conf, int numSplits) { |
---|
| 196 | InputSplit[] splits = new InputSplit[numSplits]; |
---|
| 197 | for (int i = 0; i < numSplits; ++i) { |
---|
| 198 | splits[i] = new IndirectInputFormat.IndirectSplit( |
---|
| 199 | new Path("ignore" + i), 1); |
---|
| 200 | } |
---|
| 201 | return splits; |
---|
| 202 | } |
---|
| 203 | |
---|
| 204 | public RecordReader<Text,Text> getRecordReader(InputSplit split, |
---|
| 205 | JobConf job, Reporter reporter) throws IOException { |
---|
| 206 | final IndirectInputFormat.IndirectSplit clSplit = |
---|
| 207 | (IndirectInputFormat.IndirectSplit)split; |
---|
| 208 | return new RecordReader<Text,Text>() { |
---|
| 209 | boolean once = true; |
---|
| 210 | public boolean next(Text key, Text value) { |
---|
| 211 | if (once) { |
---|
| 212 | key.set(clSplit.getPath().toString()); |
---|
| 213 | once = false; |
---|
| 214 | return true; |
---|
| 215 | } |
---|
| 216 | return false; |
---|
| 217 | } |
---|
| 218 | public Text createKey() { return new Text(); } |
---|
| 219 | public Text createValue() { return new Text(); } |
---|
| 220 | public long getPos() { return 0; } |
---|
| 221 | public void close() { } |
---|
| 222 | public float getProgress() { return 0.0f; } |
---|
| 223 | }; |
---|
| 224 | } |
---|
| 225 | } |
---|
| 226 | |
---|
| 227 | static enum Counters { RECORDS_WRITTEN, BYTES_WRITTEN } |
---|
| 228 | |
---|
| 229 | static class RandomMapOutput extends MapReduceBase |
---|
| 230 | implements Mapper<Text,Text,Text,Text> { |
---|
| 231 | StringBuilder sentence = new StringBuilder(); |
---|
| 232 | int keymin; |
---|
| 233 | int keymax; |
---|
| 234 | int valmin; |
---|
| 235 | int valmax; |
---|
| 236 | long bytesToWrite; |
---|
| 237 | Random r = new Random(); |
---|
| 238 | |
---|
| 239 | private int generateSentence(Text t, int noWords) { |
---|
| 240 | sentence.setLength(0); |
---|
| 241 | --noWords; |
---|
| 242 | for (int i = 0; i < noWords; ++i) { |
---|
| 243 | sentence.append(words[r.nextInt(words.length)]); |
---|
| 244 | sentence.append(" "); |
---|
| 245 | } |
---|
| 246 | if (noWords >= 0) sentence.append(words[r.nextInt(words.length)]); |
---|
| 247 | t.set(sentence.toString()); |
---|
| 248 | return sentence.length(); |
---|
| 249 | } |
---|
| 250 | |
---|
| 251 | public void configure(JobConf job) { |
---|
| 252 | bytesToWrite = job.getLong("test.randomtextwrite.bytes_per_map", |
---|
| 253 | 1*1024*1024*1024); |
---|
| 254 | keymin = job.getInt("test.randomtextwrite.min_words_key", 5); |
---|
| 255 | keymax = job.getInt("test.randomtextwrite.max_words_key", 10); |
---|
| 256 | valmin = job.getInt("test.randomtextwrite.min_words_value", 5); |
---|
| 257 | valmax = job.getInt("test.randomtextwrite.max_words_value", 10); |
---|
| 258 | } |
---|
| 259 | |
---|
| 260 | public void map(Text key, Text val, OutputCollector<Text,Text> output, |
---|
| 261 | Reporter reporter) throws IOException { |
---|
| 262 | long acc = 0L; |
---|
| 263 | long recs = 0; |
---|
| 264 | final int keydiff = keymax - keymin; |
---|
| 265 | final int valdiff = valmax - valmin; |
---|
| 266 | for (long i = 0L; acc < bytesToWrite; ++i) { |
---|
| 267 | int recacc = 0; |
---|
| 268 | recacc += generateSentence(key, keymin + |
---|
| 269 | (0 == keydiff ? 0 : r.nextInt(keydiff))); |
---|
| 270 | recacc += generateSentence(val, valmin + |
---|
| 271 | (0 == valdiff ? 0 : r.nextInt(valdiff))); |
---|
| 272 | output.collect(key, val); |
---|
| 273 | ++recs; |
---|
| 274 | acc += recacc; |
---|
| 275 | reporter.incrCounter(Counters.BYTES_WRITTEN, recacc); |
---|
| 276 | reporter.incrCounter(Counters.RECORDS_WRITTEN, 1); |
---|
| 277 | reporter.setStatus(acc + "/" + (bytesToWrite - acc) + " bytes"); |
---|
| 278 | } |
---|
| 279 | reporter.setStatus("Wrote " + recs + " records"); |
---|
| 280 | } |
---|
| 281 | |
---|
| 282 | } |
---|
| 283 | |
---|
| 284 | /** |
---|
| 285 | * When no input dir is specified, generate random data. |
---|
| 286 | */ |
---|
| 287 | protected static void confRandom(JobConf job) |
---|
| 288 | throws IOException { |
---|
| 289 | // from RandomWriter |
---|
| 290 | job.setInputFormat(RandomInputFormat.class); |
---|
| 291 | job.setMapperClass(RandomMapOutput.class); |
---|
| 292 | |
---|
| 293 | final ClusterStatus cluster = new JobClient(job).getClusterStatus(); |
---|
| 294 | int numMapsPerHost = job.getInt("test.randomtextwrite.maps_per_host", 10); |
---|
| 295 | long numBytesToWritePerMap = |
---|
| 296 | job.getLong("test.randomtextwrite.bytes_per_map", 1*1024*1024*1024); |
---|
| 297 | if (numBytesToWritePerMap == 0) { |
---|
| 298 | throw new IOException( |
---|
| 299 | "Cannot have test.randomtextwrite.bytes_per_map set to 0"); |
---|
| 300 | } |
---|
| 301 | long totalBytesToWrite = job.getLong("test.randomtextwrite.total_bytes", |
---|
| 302 | numMapsPerHost * numBytesToWritePerMap * cluster.getTaskTrackers()); |
---|
| 303 | int numMaps = (int)(totalBytesToWrite / numBytesToWritePerMap); |
---|
| 304 | if (numMaps == 0 && totalBytesToWrite > 0) { |
---|
| 305 | numMaps = 1; |
---|
| 306 | job.setLong("test.randomtextwrite.bytes_per_map", totalBytesToWrite); |
---|
| 307 | } |
---|
| 308 | job.setNumMapTasks(numMaps); |
---|
| 309 | } |
---|
| 310 | |
---|
| 311 | |
---|
| 312 | // Sampling // |
---|
| 313 | |
---|
| 314 | static abstract class SampleMapReduceBase<K extends WritableComparable, |
---|
| 315 | V extends Writable> |
---|
| 316 | extends MapReduceBase { |
---|
| 317 | |
---|
| 318 | private long total; |
---|
| 319 | private long kept = 0; |
---|
| 320 | private float keep; |
---|
| 321 | |
---|
| 322 | protected void setKeep(float keep) { |
---|
| 323 | this.keep = keep; |
---|
| 324 | } |
---|
| 325 | |
---|
| 326 | protected void emit(K key, V val, OutputCollector<K,V> out) |
---|
| 327 | throws IOException { |
---|
| 328 | ++total; |
---|
| 329 | while((float) kept / total < keep) { |
---|
| 330 | ++kept; |
---|
| 331 | out.collect(key, val); |
---|
| 332 | } |
---|
| 333 | } |
---|
| 334 | } |
---|
| 335 | |
---|
| 336 | public static class SampleMapper<K extends WritableComparable, V extends Writable> |
---|
| 337 | extends SampleMapReduceBase<K,V> implements Mapper<K,V,K,V> { |
---|
| 338 | |
---|
| 339 | public void configure(JobConf job) { |
---|
| 340 | setKeep(job.getFloat("hadoop.sort.map.keep.percent", (float)100.0) / |
---|
| 341 | (float)100.0); |
---|
| 342 | } |
---|
| 343 | |
---|
| 344 | public void map(K key, V val, |
---|
| 345 | OutputCollector<K,V> output, Reporter reporter) |
---|
| 346 | throws IOException { |
---|
| 347 | emit(key, val, output); |
---|
| 348 | } |
---|
| 349 | |
---|
| 350 | } |
---|
| 351 | |
---|
| 352 | public static class SampleReducer<K extends WritableComparable, V extends Writable> |
---|
| 353 | extends SampleMapReduceBase<K,V> implements Reducer<K,V,K,V> { |
---|
| 354 | |
---|
| 355 | public void configure(JobConf job) { |
---|
| 356 | setKeep(job.getFloat("hadoop.sort.reduce.keep.percent", (float)100.0) / |
---|
| 357 | (float)100.0); |
---|
| 358 | } |
---|
| 359 | |
---|
| 360 | public void reduce(K key, Iterator<V> values, |
---|
| 361 | OutputCollector<K,V> output, Reporter reporter) |
---|
| 362 | throws IOException { |
---|
| 363 | while (values.hasNext()) { |
---|
| 364 | emit(key, values.next(), output); |
---|
| 365 | } |
---|
| 366 | } |
---|
| 367 | |
---|
| 368 | } |
---|
| 369 | |
---|
| 370 | // Indirect reads // |
---|
| 371 | |
---|
| 372 | /** |
---|
| 373 | * Obscures the InputFormat and location information to simulate maps |
---|
| 374 | * reading input from arbitrary locations ("indirect" reads). |
---|
| 375 | */ |
---|
| 376 | static class IndirectInputFormat implements InputFormat { |
---|
| 377 | |
---|
| 378 | static class IndirectSplit implements InputSplit { |
---|
| 379 | Path file; |
---|
| 380 | long len; |
---|
| 381 | public IndirectSplit() { } |
---|
| 382 | public IndirectSplit(Path file, long len) { |
---|
| 383 | this.file = file; |
---|
| 384 | this.len = len; |
---|
| 385 | } |
---|
| 386 | public Path getPath() { return file; } |
---|
| 387 | public long getLength() { return len; } |
---|
| 388 | public String[] getLocations() throws IOException { |
---|
| 389 | return new String[]{}; |
---|
| 390 | } |
---|
| 391 | public void write(DataOutput out) throws IOException { |
---|
| 392 | WritableUtils.writeString(out, file.toString()); |
---|
| 393 | WritableUtils.writeVLong(out, len); |
---|
| 394 | } |
---|
| 395 | public void readFields(DataInput in) throws IOException { |
---|
| 396 | file = new Path(WritableUtils.readString(in)); |
---|
| 397 | len = WritableUtils.readVLong(in); |
---|
| 398 | } |
---|
| 399 | } |
---|
| 400 | |
---|
| 401 | public InputSplit[] getSplits(JobConf job, int numSplits) |
---|
| 402 | throws IOException { |
---|
| 403 | |
---|
| 404 | Path src = new Path(job.get("mapred.indirect.input.file", null)); |
---|
| 405 | FileSystem fs = src.getFileSystem(job); |
---|
| 406 | |
---|
| 407 | ArrayList<IndirectSplit> splits = new ArrayList<IndirectSplit>(numSplits); |
---|
| 408 | LongWritable key = new LongWritable(); |
---|
| 409 | Text value = new Text(); |
---|
| 410 | for (SequenceFile.Reader sl = new SequenceFile.Reader(fs, src, job); |
---|
| 411 | sl.next(key, value);) { |
---|
| 412 | splits.add(new IndirectSplit(new Path(value.toString()), key.get())); |
---|
| 413 | } |
---|
| 414 | |
---|
| 415 | return splits.toArray(new IndirectSplit[splits.size()]); |
---|
| 416 | } |
---|
| 417 | |
---|
| 418 | public RecordReader getRecordReader(InputSplit split, JobConf job, |
---|
| 419 | Reporter reporter) throws IOException { |
---|
| 420 | InputFormat indirIF = (InputFormat)ReflectionUtils.newInstance( |
---|
| 421 | job.getClass("mapred.indirect.input.format", |
---|
| 422 | SequenceFileInputFormat.class), job); |
---|
| 423 | IndirectSplit is = ((IndirectSplit)split); |
---|
| 424 | return indirIF.getRecordReader(new FileSplit(is.getPath(), 0, |
---|
| 425 | is.getLength(), (String[])null), |
---|
| 426 | job, reporter); |
---|
| 427 | } |
---|
| 428 | } |
---|
| 429 | |
---|
| 430 | /** |
---|
| 431 | * A random list of 1000 words from /usr/share/dict/words |
---|
| 432 | */ |
---|
| 433 | private static final String[] words = { |
---|
| 434 | "diurnalness", "Homoiousian", "spiranthic", "tetragynian", |
---|
| 435 | "silverhead", "ungreat", "lithograph", "exploiter", |
---|
| 436 | "physiologian", "by", "hellbender", "Filipendula", |
---|
| 437 | "undeterring", "antiscolic", "pentagamist", "hypoid", |
---|
| 438 | "cacuminal", "sertularian", "schoolmasterism", "nonuple", |
---|
| 439 | "gallybeggar", "phytonic", "swearingly", "nebular", |
---|
| 440 | "Confervales", "thermochemically", "characinoid", "cocksuredom", |
---|
| 441 | "fallacious", "feasibleness", "debromination", "playfellowship", |
---|
| 442 | "tramplike", "testa", "participatingly", "unaccessible", |
---|
| 443 | "bromate", "experientialist", "roughcast", "docimastical", |
---|
| 444 | "choralcelo", "blightbird", "peptonate", "sombreroed", |
---|
| 445 | "unschematized", "antiabolitionist", "besagne", "mastication", |
---|
| 446 | "bromic", "sviatonosite", "cattimandoo", "metaphrastical", |
---|
| 447 | "endotheliomyoma", "hysterolysis", "unfulminated", "Hester", |
---|
| 448 | "oblongly", "blurredness", "authorling", "chasmy", |
---|
| 449 | "Scorpaenidae", "toxihaemia", "Dictograph", "Quakerishly", |
---|
| 450 | "deaf", "timbermonger", "strammel", "Thraupidae", |
---|
| 451 | "seditious", "plerome", "Arneb", "eristically", |
---|
| 452 | "serpentinic", "glaumrie", "socioromantic", "apocalypst", |
---|
| 453 | "tartrous", "Bassaris", "angiolymphoma", "horsefly", |
---|
| 454 | "kenno", "astronomize", "euphemious", "arsenide", |
---|
| 455 | "untongued", "parabolicness", "uvanite", "helpless", |
---|
| 456 | "gemmeous", "stormy", "templar", "erythrodextrin", |
---|
| 457 | "comism", "interfraternal", "preparative", "parastas", |
---|
| 458 | "frontoorbital", "Ophiosaurus", "diopside", "serosanguineous", |
---|
| 459 | "ununiformly", "karyological", "collegian", "allotropic", |
---|
| 460 | "depravity", "amylogenesis", "reformatory", "epidymides", |
---|
| 461 | "pleurotropous", "trillium", "dastardliness", "coadvice", |
---|
| 462 | "embryotic", "benthonic", "pomiferous", "figureheadship", |
---|
| 463 | "Megaluridae", "Harpa", "frenal", "commotion", |
---|
| 464 | "abthainry", "cobeliever", "manilla", "spiciferous", |
---|
| 465 | "nativeness", "obispo", "monilioid", "biopsic", |
---|
| 466 | "valvula", "enterostomy", "planosubulate", "pterostigma", |
---|
| 467 | "lifter", "triradiated", "venialness", "tum", |
---|
| 468 | "archistome", "tautness", "unswanlike", "antivenin", |
---|
| 469 | "Lentibulariaceae", "Triphora", "angiopathy", "anta", |
---|
| 470 | "Dawsonia", "becomma", "Yannigan", "winterproof", |
---|
| 471 | "antalgol", "harr", "underogating", "ineunt", |
---|
| 472 | "cornberry", "flippantness", "scyphostoma", "approbation", |
---|
| 473 | "Ghent", "Macraucheniidae", "scabbiness", "unanatomized", |
---|
| 474 | "photoelasticity", "eurythermal", "enation", "prepavement", |
---|
| 475 | "flushgate", "subsequentially", "Edo", "antihero", |
---|
| 476 | "Isokontae", "unforkedness", "porriginous", "daytime", |
---|
| 477 | "nonexecutive", "trisilicic", "morphiomania", "paranephros", |
---|
| 478 | "botchedly", "impugnation", "Dodecatheon", "obolus", |
---|
| 479 | "unburnt", "provedore", "Aktistetae", "superindifference", |
---|
| 480 | "Alethea", "Joachimite", "cyanophilous", "chorograph", |
---|
| 481 | "brooky", "figured", "periclitation", "quintette", |
---|
| 482 | "hondo", "ornithodelphous", "unefficient", "pondside", |
---|
| 483 | "bogydom", "laurinoxylon", "Shiah", "unharmed", |
---|
| 484 | "cartful", "noncrystallized", "abusiveness", "cromlech", |
---|
| 485 | "japanned", "rizzomed", "underskin", "adscendent", |
---|
| 486 | "allectory", "gelatinousness", "volcano", "uncompromisingly", |
---|
| 487 | "cubit", "idiotize", "unfurbelowed", "undinted", |
---|
| 488 | "magnetooptics", "Savitar", "diwata", "ramosopalmate", |
---|
| 489 | "Pishquow", "tomorn", "apopenptic", "Haversian", |
---|
| 490 | "Hysterocarpus", "ten", "outhue", "Bertat", |
---|
| 491 | "mechanist", "asparaginic", "velaric", "tonsure", |
---|
| 492 | "bubble", "Pyrales", "regardful", "glyphography", |
---|
| 493 | "calabazilla", "shellworker", "stradametrical", "havoc", |
---|
| 494 | "theologicopolitical", "sawdust", "diatomaceous", "jajman", |
---|
| 495 | "temporomastoid", "Serrifera", "Ochnaceae", "aspersor", |
---|
| 496 | "trailmaking", "Bishareen", "digitule", "octogynous", |
---|
| 497 | "epididymitis", "smokefarthings", "bacillite", "overcrown", |
---|
| 498 | "mangonism", "sirrah", "undecorated", "psychofugal", |
---|
| 499 | "bismuthiferous", "rechar", "Lemuridae", "frameable", |
---|
| 500 | "thiodiazole", "Scanic", "sportswomanship", "interruptedness", |
---|
| 501 | "admissory", "osteopaedion", "tingly", "tomorrowness", |
---|
| 502 | "ethnocracy", "trabecular", "vitally", "fossilism", |
---|
| 503 | "adz", "metopon", "prefatorial", "expiscate", |
---|
| 504 | "diathermacy", "chronist", "nigh", "generalizable", |
---|
| 505 | "hysterogen", "aurothiosulphuric", "whitlowwort", "downthrust", |
---|
| 506 | "Protestantize", "monander", "Itea", "chronographic", |
---|
| 507 | "silicize", "Dunlop", "eer", "componental", |
---|
| 508 | "spot", "pamphlet", "antineuritic", "paradisean", |
---|
| 509 | "interruptor", "debellator", "overcultured", "Florissant", |
---|
| 510 | "hyocholic", "pneumatotherapy", "tailoress", "rave", |
---|
| 511 | "unpeople", "Sebastian", "thermanesthesia", "Coniferae", |
---|
| 512 | "swacking", "posterishness", "ethmopalatal", "whittle", |
---|
| 513 | "analgize", "scabbardless", "naught", "symbiogenetically", |
---|
| 514 | "trip", "parodist", "columniform", "trunnel", |
---|
| 515 | "yawler", "goodwill", "pseudohalogen", "swangy", |
---|
| 516 | "cervisial", "mediateness", "genii", "imprescribable", |
---|
| 517 | "pony", "consumptional", "carposporangial", "poleax", |
---|
| 518 | "bestill", "subfebrile", "sapphiric", "arrowworm", |
---|
| 519 | "qualminess", "ultraobscure", "thorite", "Fouquieria", |
---|
| 520 | "Bermudian", "prescriber", "elemicin", "warlike", |
---|
| 521 | "semiangle", "rotular", "misthread", "returnability", |
---|
| 522 | "seraphism", "precostal", "quarried", "Babylonism", |
---|
| 523 | "sangaree", "seelful", "placatory", "pachydermous", |
---|
| 524 | "bozal", "galbulus", "spermaphyte", "cumbrousness", |
---|
| 525 | "pope", "signifier", "Endomycetaceae", "shallowish", |
---|
| 526 | "sequacity", "periarthritis", "bathysphere", "pentosuria", |
---|
| 527 | "Dadaism", "spookdom", "Consolamentum", "afterpressure", |
---|
| 528 | "mutter", "louse", "ovoviviparous", "corbel", |
---|
| 529 | "metastoma", "biventer", "Hydrangea", "hogmace", |
---|
| 530 | "seizing", "nonsuppressed", "oratorize", "uncarefully", |
---|
| 531 | "benzothiofuran", "penult", "balanocele", "macropterous", |
---|
| 532 | "dishpan", "marten", "absvolt", "jirble", |
---|
| 533 | "parmelioid", "airfreighter", "acocotl", "archesporial", |
---|
| 534 | "hypoplastral", "preoral", "quailberry", "cinque", |
---|
| 535 | "terrestrially", "stroking", "limpet", "moodishness", |
---|
| 536 | "canicule", "archididascalian", "pompiloid", "overstaid", |
---|
| 537 | "introducer", "Italical", "Christianopaganism", "prescriptible", |
---|
| 538 | "subofficer", "danseuse", "cloy", "saguran", |
---|
| 539 | "frictionlessly", "deindividualization", "Bulanda", "ventricous", |
---|
| 540 | "subfoliar", "basto", "scapuloradial", "suspend", |
---|
| 541 | "stiffish", "Sphenodontidae", "eternal", "verbid", |
---|
| 542 | "mammonish", "upcushion", "barkometer", "concretion", |
---|
| 543 | "preagitate", "incomprehensible", "tristich", "visceral", |
---|
| 544 | "hemimelus", "patroller", "stentorophonic", "pinulus", |
---|
| 545 | "kerykeion", "brutism", "monstership", "merciful", |
---|
| 546 | "overinstruct", "defensibly", "bettermost", "splenauxe", |
---|
| 547 | "Mormyrus", "unreprimanded", "taver", "ell", |
---|
| 548 | "proacquittal", "infestation", "overwoven", "Lincolnlike", |
---|
| 549 | "chacona", "Tamil", "classificational", "lebensraum", |
---|
| 550 | "reeveland", "intuition", "Whilkut", "focaloid", |
---|
| 551 | "Eleusinian", "micromembrane", "byroad", "nonrepetition", |
---|
| 552 | "bacterioblast", "brag", "ribaldrous", "phytoma", |
---|
| 553 | "counteralliance", "pelvimetry", "pelf", "relaster", |
---|
| 554 | "thermoresistant", "aneurism", "molossic", "euphonym", |
---|
| 555 | "upswell", "ladhood", "phallaceous", "inertly", |
---|
| 556 | "gunshop", "stereotypography", "laryngic", "refasten", |
---|
| 557 | "twinling", "oflete", "hepatorrhaphy", "electrotechnics", |
---|
| 558 | "cockal", "guitarist", "topsail", "Cimmerianism", |
---|
| 559 | "larklike", "Llandovery", "pyrocatechol", "immatchable", |
---|
| 560 | "chooser", "metrocratic", "craglike", "quadrennial", |
---|
| 561 | "nonpoisonous", "undercolored", "knob", "ultratense", |
---|
| 562 | "balladmonger", "slait", "sialadenitis", "bucketer", |
---|
| 563 | "magnificently", "unstipulated", "unscourged", "unsupercilious", |
---|
| 564 | "packsack", "pansophism", "soorkee", "percent", |
---|
| 565 | "subirrigate", "champer", "metapolitics", "spherulitic", |
---|
| 566 | "involatile", "metaphonical", "stachyuraceous", "speckedness", |
---|
| 567 | "bespin", "proboscidiform", "gul", "squit", |
---|
| 568 | "yeelaman", "peristeropode", "opacousness", "shibuichi", |
---|
| 569 | "retinize", "yote", "misexposition", "devilwise", |
---|
| 570 | "pumpkinification", "vinny", "bonze", "glossing", |
---|
| 571 | "decardinalize", "transcortical", "serphoid", "deepmost", |
---|
| 572 | "guanajuatite", "wemless", "arval", "lammy", |
---|
| 573 | "Effie", "Saponaria", "tetrahedral", "prolificy", |
---|
| 574 | "excerpt", "dunkadoo", "Spencerism", "insatiately", |
---|
| 575 | "Gilaki", "oratorship", "arduousness", "unbashfulness", |
---|
| 576 | "Pithecolobium", "unisexuality", "veterinarian", "detractive", |
---|
| 577 | "liquidity", "acidophile", "proauction", "sural", |
---|
| 578 | "totaquina", "Vichyite", "uninhabitedness", "allegedly", |
---|
| 579 | "Gothish", "manny", "Inger", "flutist", |
---|
| 580 | "ticktick", "Ludgatian", "homotransplant", "orthopedical", |
---|
| 581 | "diminutively", "monogoneutic", "Kenipsim", "sarcologist", |
---|
| 582 | "drome", "stronghearted", "Fameuse", "Swaziland", |
---|
| 583 | "alen", "chilblain", "beatable", "agglomeratic", |
---|
| 584 | "constitutor", "tendomucoid", "porencephalous", "arteriasis", |
---|
| 585 | "boser", "tantivy", "rede", "lineamental", |
---|
| 586 | "uncontradictableness", "homeotypical", "masa", "folious", |
---|
| 587 | "dosseret", "neurodegenerative", "subtransverse", "Chiasmodontidae", |
---|
| 588 | "palaeotheriodont", "unstressedly", "chalcites", "piquantness", |
---|
| 589 | "lampyrine", "Aplacentalia", "projecting", "elastivity", |
---|
| 590 | "isopelletierin", "bladderwort", "strander", "almud", |
---|
| 591 | "iniquitously", "theologal", "bugre", "chargeably", |
---|
| 592 | "imperceptivity", "meriquinoidal", "mesophyte", "divinator", |
---|
| 593 | "perfunctory", "counterappellant", "synovial", "charioteer", |
---|
| 594 | "crystallographical", "comprovincial", "infrastapedial", "pleasurehood", |
---|
| 595 | "inventurous", "ultrasystematic", "subangulated", "supraoesophageal", |
---|
| 596 | "Vaishnavism", "transude", "chrysochrous", "ungrave", |
---|
| 597 | "reconciliable", "uninterpleaded", "erlking", "wherefrom", |
---|
| 598 | "aprosopia", "antiadiaphorist", "metoxazine", "incalculable", |
---|
| 599 | "umbellic", "predebit", "foursquare", "unimmortal", |
---|
| 600 | "nonmanufacture", "slangy", "predisputant", "familist", |
---|
| 601 | "preaffiliate", "friarhood", "corelysis", "zoonitic", |
---|
| 602 | "halloo", "paunchy", "neuromimesis", "aconitine", |
---|
| 603 | "hackneyed", "unfeeble", "cubby", "autoschediastical", |
---|
| 604 | "naprapath", "lyrebird", "inexistency", "leucophoenicite", |
---|
| 605 | "ferrogoslarite", "reperuse", "uncombable", "tambo", |
---|
| 606 | "propodiale", "diplomatize", "Russifier", "clanned", |
---|
| 607 | "corona", "michigan", "nonutilitarian", "transcorporeal", |
---|
| 608 | "bought", "Cercosporella", "stapedius", "glandularly", |
---|
| 609 | "pictorially", "weism", "disilane", "rainproof", |
---|
| 610 | "Caphtor", "scrubbed", "oinomancy", "pseudoxanthine", |
---|
| 611 | "nonlustrous", "redesertion", "Oryzorictinae", "gala", |
---|
| 612 | "Mycogone", "reappreciate", "cyanoguanidine", "seeingness", |
---|
| 613 | "breadwinner", "noreast", "furacious", "epauliere", |
---|
| 614 | "omniscribent", "Passiflorales", "uninductive", "inductivity", |
---|
| 615 | "Orbitolina", "Semecarpus", "migrainoid", "steprelationship", |
---|
| 616 | "phlogisticate", "mesymnion", "sloped", "edificator", |
---|
| 617 | "beneficent", "culm", "paleornithology", "unurban", |
---|
| 618 | "throbless", "amplexifoliate", "sesquiquintile", "sapience", |
---|
| 619 | "astucious", "dithery", "boor", "ambitus", |
---|
| 620 | "scotching", "uloid", "uncompromisingness", "hoove", |
---|
| 621 | "waird", "marshiness", "Jerusalem", "mericarp", |
---|
| 622 | "unevoked", "benzoperoxide", "outguess", "pyxie", |
---|
| 623 | "hymnic", "euphemize", "mendacity", "erythremia", |
---|
| 624 | "rosaniline", "unchatteled", "lienteria", "Bushongo", |
---|
| 625 | "dialoguer", "unrepealably", "rivethead", "antideflation", |
---|
| 626 | "vinegarish", "manganosiderite", "doubtingness", "ovopyriform", |
---|
| 627 | "Cephalodiscus", "Muscicapa", "Animalivora", "angina", |
---|
| 628 | "planispheric", "ipomoein", "cuproiodargyrite", "sandbox", |
---|
| 629 | "scrat", "Munnopsidae", "shola", "pentafid", |
---|
| 630 | "overstudiousness", "times", "nonprofession", "appetible", |
---|
| 631 | "valvulotomy", "goladar", "uniarticular", "oxyterpene", |
---|
| 632 | "unlapsing", "omega", "trophonema", "seminonflammable", |
---|
| 633 | "circumzenithal", "starer", "depthwise", "liberatress", |
---|
| 634 | "unleavened", "unrevolting", "groundneedle", "topline", |
---|
| 635 | "wandoo", "umangite", "ordinant", "unachievable", |
---|
| 636 | "oversand", "snare", "avengeful", "unexplicit", |
---|
| 637 | "mustafina", "sonable", "rehabilitative", "eulogization", |
---|
| 638 | "papery", "technopsychology", "impressor", "cresylite", |
---|
| 639 | "entame", "transudatory", "scotale", "pachydermatoid", |
---|
| 640 | "imaginary", "yeat", "slipped", "stewardship", |
---|
| 641 | "adatom", "cockstone", "skyshine", "heavenful", |
---|
| 642 | "comparability", "exprobratory", "dermorhynchous", "parquet", |
---|
| 643 | "cretaceous", "vesperal", "raphis", "undangered", |
---|
| 644 | "Glecoma", "engrain", "counteractively", "Zuludom", |
---|
| 645 | "orchiocatabasis", "Auriculariales", "warriorwise", "extraorganismal", |
---|
| 646 | "overbuilt", "alveolite", "tetchy", "terrificness", |
---|
| 647 | "widdle", "unpremonished", "rebilling", "sequestrum", |
---|
| 648 | "equiconvex", "heliocentricism", "catabaptist", "okonite", |
---|
| 649 | "propheticism", "helminthagogic", "calycular", "giantly", |
---|
| 650 | "wingable", "golem", "unprovided", "commandingness", |
---|
| 651 | "greave", "haply", "doina", "depressingly", |
---|
| 652 | "subdentate", "impairment", "decidable", "neurotrophic", |
---|
| 653 | "unpredict", "bicorporeal", "pendulant", "flatman", |
---|
| 654 | "intrabred", "toplike", "Prosobranchiata", "farrantly", |
---|
| 655 | "toxoplasmosis", "gorilloid", "dipsomaniacal", "aquiline", |
---|
| 656 | "atlantite", "ascitic", "perculsive", "prospectiveness", |
---|
| 657 | "saponaceous", "centrifugalization", "dinical", "infravaginal", |
---|
| 658 | "beadroll", "affaite", "Helvidian", "tickleproof", |
---|
| 659 | "abstractionism", "enhedge", "outwealth", "overcontribute", |
---|
| 660 | "coldfinch", "gymnastic", "Pincian", "Munychian", |
---|
| 661 | "codisjunct", "quad", "coracomandibular", "phoenicochroite", |
---|
| 662 | "amender", "selectivity", "putative", "semantician", |
---|
| 663 | "lophotrichic", "Spatangoidea", "saccharogenic", "inferent", |
---|
| 664 | "Triconodonta", "arrendation", "sheepskin", "taurocolla", |
---|
| 665 | "bunghole", "Machiavel", "triakistetrahedral", "dehairer", |
---|
| 666 | "prezygapophysial", "cylindric", "pneumonalgia", "sleigher", |
---|
| 667 | "emir", "Socraticism", "licitness", "massedly", |
---|
| 668 | "instructiveness", "sturdied", "redecrease", "starosta", |
---|
| 669 | "evictor", "orgiastic", "squdge", "meloplasty", |
---|
| 670 | "Tsonecan", "repealableness", "swoony", "myesthesia", |
---|
| 671 | "molecule", "autobiographist", "reciprocation", "refective", |
---|
| 672 | "unobservantness", "tricae", "ungouged", "floatability", |
---|
| 673 | "Mesua", "fetlocked", "chordacentrum", "sedentariness", |
---|
| 674 | "various", "laubanite", "nectopod", "zenick", |
---|
| 675 | "sequentially", "analgic", "biodynamics", "posttraumatic", |
---|
| 676 | "nummi", "pyroacetic", "bot", "redescend", |
---|
| 677 | "dispermy", "undiffusive", "circular", "trillion", |
---|
| 678 | "Uraniidae", "ploration", "discipular", "potentness", |
---|
| 679 | "sud", "Hu", "Eryon", "plugger", |
---|
| 680 | "subdrainage", "jharal", "abscission", "supermarket", |
---|
| 681 | "countergabion", "glacierist", "lithotresis", "minniebush", |
---|
| 682 | "zanyism", "eucalypteol", "sterilely", "unrealize", |
---|
| 683 | "unpatched", "hypochondriacism", "critically", "cheesecutter", |
---|
| 684 | }; |
---|
| 685 | } |
---|