diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 2e51518..35b44a7 100644 --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -1099,8 +1099,10 @@ HIVESAMPLINGFORORDERBY("hive.optimize.sampling.orderby", false, "Uses sampling on order-by clause for parallel execution."), HIVESAMPLINGNUMBERFORORDERBY("hive.optimize.sampling.orderby.number", 1000, "Total number of samples to be obtained."), - HIVESAMPLINGPERCENTFORORDERBY("hive.optimize.sampling.orderby.percent", 0.1f, new RatioValidator(), + HIVESAMPLINGPERCENTFORORDERBY("hive.optimize.sampling.orderby.percent", 0.0f, new RatioValidator(), "Probability with which a row will be chosen."), + HIVESAMPLINGSPLITPERINPUTFORORDERBY("hive.optimize.sampling.orderby.split.per.input", 1, + "Numbder of splits to make for each table or partition."), // whether to optimize union followed by select followed by filesink // It creates sub-directories in the final output, so should not be turned on in systems diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java index 0ccab02..ed00bff 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FetchOperator.java @@ -317,7 +317,7 @@ static void setFetchOperatorContext(JobConf conf, List paths) { } } - final FetchInputFormatSplit target = iterSplits.next(); + final FetchInputFormatSplit target = nextSplit(); @SuppressWarnings("unchecked") final RecordReader reader = target.getRecordReader(job); @@ -345,7 +345,7 @@ public boolean doNext(WritableComparable key, Writable value) throws IOException return currRecReader; } - protected FetchInputFormatSplit[] getNextSplits() throws Exception { + private FetchInputFormatSplit[] getNextSplits() throws Exception { while (getNextPath()) { // not using FileInputFormat.setInputPaths() here because it forces a connection to the // default file system - which may or may not be online during pure metadata operations @@ -359,7 +359,7 @@ public boolean doNext(WritableComparable key, Writable value) throws IOException Utilities.copyTableJobPropertiesToConf(currDesc.getTableDesc(), job); InputFormat inputFormat = getInputFormatFromCache(formatter, job); - InputSplit[] splits = inputFormat.getSplits(job, 1); + InputSplit[] splits = getSplitsFromPath(inputFormat, job, currPath); FetchInputFormatSplit[] inputSplits = new FetchInputFormatSplit[splits.length]; for (int i = 0; i < splits.length; i++) { inputSplits[i] = new FetchInputFormatSplit(splits[i], inputFormat); @@ -374,6 +374,37 @@ public boolean doNext(WritableComparable key, Writable value) throws IOException return null; } + protected FetchInputFormatSplit nextSplit() { + return iterSplits.next(); + } + + protected void skipAll() throws IOException { + skipCurrentInput(); + while (iterPath != null && iterPath.hasNext()) { + iterPath.next(); + } + } + + protected void skipCurrentInput() throws IOException { + skipCurrentSplit(); + while (iterSplits != null && iterSplits.hasNext()) { + iterSplits.next(); + } + } + + protected void skipCurrentSplit() throws IOException { + if (currRecReader != null) { + currRecReader.close(); + currRecReader = null; + } + currPath = null; + } + + protected InputSplit[] getSplitsFromPath(InputFormat formatter, JobConf conf, Path path) + throws IOException { + return formatter.getSplits(job, 1); + } + private FetchInputFormatSplit[] splitSampling(SplitSample splitSample, FetchInputFormatSplit[] splits) { long totalSize = 0; @@ -420,7 +451,7 @@ public boolean pushRow() throws IOException, HiveException { return row != null; } - protected void pushRow(InspectableObject row) throws HiveException { + protected void pushRow(InspectableObject row) throws IOException, HiveException { operator.processOp(row.o, 0); } @@ -649,7 +680,7 @@ private boolean needConversion(TableDesc tableDesc, List partDesc // for split sampling. shrinkedLength is checked against IOContext.getCurrentBlockStart, // which is from RecordReader.getPos(). So some inputformats which does not support getPos() // like HiveHBaseTableInputFormat cannot be used with this (todo) - private static class FetchInputFormatSplit extends HiveInputFormat.HiveInputSplit { + protected static class FetchInputFormatSplit extends HiveInputFormat.HiveInputSplit { // shrinked size for this split. counter part of this in normal mode is // InputSplitShim.shrinkedLength. diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/PartitionKeySampler.java ql/src/java/org/apache/hadoop/hive/ql/exec/PartitionKeySampler.java index 96f4530..241d2ff 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/PartitionKeySampler.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/PartitionKeySampler.java @@ -37,11 +37,14 @@ import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.FetchWork; import org.apache.hadoop.hive.serde2.objectinspector.InspectableObject; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.WritableComparator; +import org.apache.hadoop.mapred.InputFormat; +import org.apache.hadoop.mapred.InputSplit; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.OutputCollector; @@ -132,58 +135,119 @@ public void writePartitionKeys(Path path, HiveConf conf, JobConf job) throws IOE } } - // random sampling - public static FetchOperator createSampler(FetchWork work, HiveConf conf, JobConf job, - Operator operator) throws HiveException { + public void sampling(FetchWork work, HiveConf conf, JobConf job) + throws HiveException, IOException { + + Operator operator = work.getSource(); + int sampleNum = conf.getIntVar(HiveConf.ConfVars.HIVESAMPLINGNUMBERFORORDERBY); - float samplePercent = conf.getFloatVar(HiveConf.ConfVars.HIVESAMPLINGPERCENTFORORDERBY); - if (samplePercent < 0.0 || samplePercent > 1.0) { + float sampleRatio = conf.getFloatVar(HiveConf.ConfVars.HIVESAMPLINGPERCENTFORORDERBY); + int numSplitsPerInput = conf.getIntVar(HiveConf.ConfVars.HIVESAMPLINGSPLITPERINPUTFORORDERBY); + if (sampleRatio < 0.0 || sampleRatio > 1.0) { throw new IllegalArgumentException("Percentile value must be within the range of 0 to 1."); } - RandomSampler sampler = new RandomSampler(work, job, operator); - sampler.setSampleNum(sampleNum); - sampler.setSamplePercent(samplePercent); - return sampler; + + FetchSampler sampler = new FetchSampler( + work, job, operator, sampleNum, sampleRatio, numSplitsPerInput); + try { + operator.initialize(conf, new ObjectInspector[]{sampler.getOutputObjectInspector()}); + OperatorUtils.setChildrenCollector(operator.getChildOperators(), this); + while (sampler.pushRow()) { } + } finally { + sampler.clearFetchContext(); + } } - private static class RandomSampler extends FetchOperator { + private class FetchSampler extends FetchOperator { - private int sampleNum = 1000; - private float samplePercent = 0.1f; private final Random random = new Random(); + + private final int totalSampleNum; + private final float ratio; + private final int numSplitsPerInput; + + private int numInputs; + private int currInput; + private int numSamplePerInput; + private int prvSampleForInput; + + private int numSplits; + private int currSplit; + private int numSamplePerSplit; + private int prvSampleForSplit; + + public FetchSampler(FetchWork work, JobConf job, Operator operator, + int totalSampleNum, float ratio, int numSplitsPerInput) throws HiveException { + super(work, job, operator, null); + this.totalSampleNum = totalSampleNum; + this.ratio = ratio; + this.numInputs = work.isPartitioned() ? work.getPartDir().size() : 1; + this.numSplitsPerInput = numSplitsPerInput; + + if (LOG.isInfoEnabled()) { + LOG.info("sample.total=" + totalSampleNum); + LOG.info("sample.ratio=" + ratio); + LOG.info("split.per.input=" + numSplitsPerInput); + } + } - private int sampled; + @Override + protected InputSplit[] getSplitsFromPath(InputFormat formatter, JobConf job, Path path) + throws IOException { + currSplit = 0; + numSamplePerInput = totalRemain() / (numInputs - currInput); + prvSampleForInput = sampled.size(); + currInput++; - public RandomSampler(FetchWork work, JobConf job, Operator operator) - throws HiveException { - super(work, job, operator, null); + InputSplit[] splits = formatter.getSplits(job, numSplitsPerInput); + numSplits = splits.length; + + if (LOG.isDebugEnabled()) { + LOG.debug("input.path=" + path + ", sample.per.input=" + numSamplePerInput); + } + return splits; } - public void setSampleNum(int numSample) { - this.sampleNum = numSample; + private int totalRemain() { + return totalSampleNum - sampled.size(); } - public void setSamplePercent(float samplePercent) { - this.samplePercent = samplePercent; + private int inputRemain() { + return numSamplePerInput - (sampled.size() - prvSampleForInput); } @Override - public boolean pushRow() throws IOException, HiveException { - if (!super.pushRow()) { - return false; - } - if (sampled < sampleNum) { - return true; + protected FetchInputFormatSplit nextSplit() { + numSamplePerSplit = inputRemain() / (numSplits - currSplit); + prvSampleForSplit = sampled.size(); + currSplit++; + if (LOG.isDebugEnabled()) { + LOG.debug("sample.per.split=" + numSamplePerSplit); } - flushRow(); - return false; + return super.nextSplit(); } @Override - protected void pushRow(InspectableObject row) throws HiveException { - if (random.nextFloat() < samplePercent) { - sampled++; + protected void pushRow(InspectableObject row) throws HiveException, IOException { + if (ratio <= 0 || random.nextFloat() < ratio) { super.pushRow(row); + int sampleNum = sampled.size(); + if (sampleNum >= prvSampleForSplit + numSamplePerSplit) { + if (LOG.isDebugEnabled()) { + LOG.debug("exceeded sample.per.split=" + (sampleNum - prvSampleForSplit)); + } + skipCurrentSplit(); + } else if (sampleNum >= prvSampleForInput + numSamplePerInput) { + if (LOG.isDebugEnabled()) { + LOG.debug("exceeded sample.per.input=" + (sampleNum - prvSampleForInput)); + } + skipCurrentInput(); + } else if (sampleNum >= totalSampleNum) { + if (LOG.isDebugEnabled()) { + LOG.debug("exceeded sample.total=" + sampleNum); + } + skipAll(); + } } } } diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java index 2227e6f..e152edc 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/mr/ExecDriver.java @@ -48,10 +48,8 @@ import org.apache.hadoop.hive.ql.DriverContext; import org.apache.hadoop.hive.ql.ErrorMsg; import org.apache.hadoop.hive.ql.QueryPlan; -import org.apache.hadoop.hive.ql.exec.FetchOperator; import org.apache.hadoop.hive.ql.exec.HiveTotalOrderPartitioner; import org.apache.hadoop.hive.ql.exec.Operator; -import org.apache.hadoop.hive.ql.exec.OperatorUtils; import org.apache.hadoop.hive.ql.exec.PartitionKeySampler; import org.apache.hadoop.hive.ql.exec.TableScanOperator; import org.apache.hadoop.hive.ql.exec.Task; @@ -76,7 +74,6 @@ import org.apache.hadoop.hive.ql.session.SessionState.LogHelper; import org.apache.hadoop.hive.ql.stats.StatsFactory; import org.apache.hadoop.hive.ql.stats.StatsPublisher; -import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.shims.ShimLoader; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.Text; @@ -499,8 +496,8 @@ private void handleSampling(DriverContext context, MapWork mWork, JobConf job, H Operator topOp = mWork.getAliasToWork().get(alias); PartitionDesc partDesc = mWork.getAliasToPartnInfo().get(alias); - ArrayList paths = mWork.getPaths(); - ArrayList parts = mWork.getPartitionDescs(); + List paths = mWork.getPaths(); + List parts = mWork.getPartitionDescs(paths); List inputPaths = new ArrayList(paths.size()); for (String path : paths) { @@ -534,16 +531,8 @@ private void handleSampling(DriverContext context, MapWork mWork, JobConf job, H fetchWork = new FetchWork(inputPaths, parts, partDesc.getTableDesc()); } fetchWork.setSource(ts); - - // random sampling - FetchOperator fetcher = PartitionKeySampler.createSampler(fetchWork, conf, job, ts); - try { - ts.initialize(conf, new ObjectInspector[]{fetcher.getOutputObjectInspector()}); - OperatorUtils.setChildrenCollector(ts.getChildOperators(), sampler); - while (fetcher.pushRow()) { } - } finally { - fetcher.clearFetchContext(); - } + + sampler.sampling(fetchWork, conf, job); } else { throw new IllegalArgumentException("Invalid sampling type " + mWork.getSamplingType()); } @@ -797,7 +786,7 @@ public static String generateCmdLine(HiveConf hconf, Context ctx) @Override public Collection getMapWork() { - return Collections.singleton(getWork().getMapWork()); + return Collections.singleton(getWork().getMapWork()); } @Override diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java index 9f8c091..02b2f73 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java @@ -463,6 +463,14 @@ public String getIndexIntermediateFile() { return new ArrayList(aliasToPartnInfo.values()); } + public ArrayList getPartitionDescs(List paths) { + ArrayList parts = new ArrayList(); + for (String path : paths) { + parts.add(aliasToPartnInfo.get(pathToAliases.get(path).get(0))); + } + return parts; + } + public LinkedHashMap, OpParseContext> getOpParseCtxMap() { return opParseCtxMap; diff --git ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index ac2cc86..8bbcc30 100644 --- ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -834,6 +834,10 @@ public void printError(String error, String detail) { getErrStream().println(error); LOG.error(error + StringUtils.defaultString(detail)); } + + public boolean isInfoEnabled() { + return LOG.isInfoEnabled(); + } } private static LogHelper _console; diff --git ql/src/test/queries/clientpositive/parallel_orderby.q ql/src/test/queries/clientpositive/parallel_orderby.q index 73c3940..2fc8f50 100644 --- ql/src/test/queries/clientpositive/parallel_orderby.q +++ ql/src/test/queries/clientpositive/parallel_orderby.q @@ -21,3 +21,16 @@ create table total_ordered as select * from src5 order by key, value; desc formatted total_ordered; select * from total_ordered; + +set hive.optimize.sampling.orderby.percent=0.66f; +set hive.optimize.sampling.orderby.split.per.input=3; + +explain +select * from src5 order by key, value; +select * from src5 order by key, value; + +-- partitioned table +explain +select * from srcpart order by key, value; +select * from srcpart order by key, value; + diff --git ql/src/test/results/clientpositive/parallel_orderby.q.out ql/src/test/results/clientpositive/parallel_orderby.q.out index 2f4ac8f..1b5bad7 100644 --- ql/src/test/results/clientpositive/parallel_orderby.q.out +++ ql/src/test/results/clientpositive/parallel_orderby.q.out @@ -297,3 +297,666 @@ POSTHOOK: Input: default@total_ordered 86 val_86 98 val_98 98 val_98 +PREHOOK: query: explain +select * from src5 order by key, value +PREHOOK: type: QUERY +POSTHOOK: query: explain +select * from src5 order by key, value +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: src5 + Statistics: Num rows: 2 Data size: 560 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: key (type: string), value (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 2 Data size: 560 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string), _col1 (type: string) + sort order: ++ + Statistics: Num rows: 2 Data size: 560 Basic stats: COMPLETE Column stats: NONE + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: string), KEY.reducesinkkey1 (type: string) + outputColumnNames: _col0, _col1 + Statistics: Num rows: 2 Data size: 560 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 2 Data size: 560 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select * from src5 order by key, value +PREHOOK: type: QUERY +PREHOOK: Input: default@src5 +#### A masked pattern was here #### +POSTHOOK: query: select * from src5 order by key, value +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src5 +#### A masked pattern was here #### +128 val_128 +128 val_128 +150 val_150 +150 val_150 +165 val_165 +165 val_165 +193 val_193 +193 val_193 +213 val_213 +213 val_213 +213 val_213 +213 val_213 +213 val_214 +213 val_214 +224 val_224 +224 val_224 +238 val_238 +238 val_238 +238 val_239 +238 val_239 +238 val_240 +238 val_240 +255 val_255 +255 val_255 +265 val_265 +265 val_265 +27 val_27 +27 val_27 +273 val_273 +273 val_273 +278 val_278 +278 val_278 +311 val_311 +311 val_311 +369 val_369 +369 val_369 +401 val_401 +401 val_401 +409 val_409 +409 val_409 +484 val_484 +484 val_484 +66 val_66 +66 val_66 +86 val_86 +86 val_86 +98 val_98 +98 val_98 +PREHOOK: query: -- partitioned table +explain +select * from srcpart order by key, value +PREHOOK: type: QUERY +POSTHOOK: query: -- partitioned table +explain +select * from srcpart order by key, value +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: srcpart + Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: key (type: string), value (type: string), ds (type: string), hr (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: string), _col1 (type: string) + sort order: ++ + Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE + value expressions: _col2 (type: string), _col3 (type: string) + Reduce Operator Tree: + Select Operator + expressions: KEY.reducesinkkey0 (type: string), KEY.reducesinkkey1 (type: string), VALUE._col0 (type: string), VALUE._col1 (type: string) + outputColumnNames: _col0, _col1, _col2, _col3 + Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 2000 Data size: 21248 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select * from srcpart order by key, value +PREHOOK: type: QUERY +PREHOOK: Input: default@srcpart +PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=11 +PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=12 +PREHOOK: Input: default@srcpart@ds=2008-04-09/hr=11 +PREHOOK: Input: default@srcpart@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +POSTHOOK: query: select * from srcpart order by key, value +POSTHOOK: type: QUERY +POSTHOOK: Input: default@srcpart +POSTHOOK: Input: default@srcpart@ds=2008-04-08/hr=11 +POSTHOOK: Input: default@srcpart@ds=2008-04-08/hr=12 +POSTHOOK: Input: default@srcpart@ds=2008-04-09/hr=11 +POSTHOOK: Input: default@srcpart@ds=2008-04-09/hr=12 +#### A masked pattern was here #### +0 val_0 2008-04-09 12 +0 val_0 2008-04-09 12 +0 val_0 2008-04-09 12 +10 val_10 2008-04-09 12 +100 val_100 2008-04-09 12 +100 val_100 2008-04-09 12 +103 val_103 2008-04-09 12 +103 val_103 2008-04-09 12 +104 val_104 2008-04-09 12 +104 val_104 2008-04-09 12 +105 val_105 2008-04-09 12 +11 val_11 2008-04-09 12 +111 val_111 2008-04-09 12 +113 val_113 2008-04-09 12 +113 val_113 2008-04-09 12 +114 val_114 2008-04-09 12 +116 val_116 2008-04-09 12 +118 val_118 2008-04-09 12 +118 val_118 2008-04-09 12 +119 val_119 2008-04-09 12 +119 val_119 2008-04-09 12 +119 val_119 2008-04-09 12 +12 val_12 2008-04-09 12 +12 val_12 2008-04-09 12 +120 val_120 2008-04-09 12 +120 val_120 2008-04-09 12 +125 val_125 2008-04-09 12 +125 val_125 2008-04-09 12 +126 val_126 2008-04-09 12 +128 val_128 2008-04-09 12 +128 val_128 2008-04-09 12 +128 val_128 2008-04-09 12 +129 val_129 2008-04-09 12 +129 val_129 2008-04-09 12 +131 val_131 2008-04-09 12 +133 val_133 2008-04-09 12 +134 val_134 2008-04-09 12 +134 val_134 2008-04-09 12 +136 val_136 2008-04-09 12 +137 val_137 2008-04-09 12 +137 val_137 2008-04-09 12 +138 val_138 2008-04-09 12 +138 val_138 2008-04-09 12 +138 val_138 2008-04-09 12 +138 val_138 2008-04-09 12 +143 val_143 2008-04-09 12 +145 val_145 2008-04-09 12 +146 val_146 2008-04-09 12 +146 val_146 2008-04-09 12 +149 val_149 2008-04-09 12 +149 val_149 2008-04-09 12 +15 val_15 2008-04-09 12 +15 val_15 2008-04-09 12 +150 val_150 2008-04-09 12 +152 val_152 2008-04-09 12 +152 val_152 2008-04-09 12 +153 val_153 2008-04-09 12 +155 val_155 2008-04-09 12 +156 val_156 2008-04-09 12 +157 val_157 2008-04-09 12 +158 val_158 2008-04-09 12 +160 val_160 2008-04-09 12 +162 val_162 2008-04-09 12 +163 val_163 2008-04-09 12 +164 val_164 2008-04-09 12 +164 val_164 2008-04-09 12 +165 val_165 2008-04-09 12 +165 val_165 2008-04-09 12 +166 val_166 2008-04-09 12 +167 val_167 2008-04-09 12 +167 val_167 2008-04-09 12 +167 val_167 2008-04-09 12 +168 val_168 2008-04-09 12 +169 val_169 2008-04-09 12 +169 val_169 2008-04-09 12 +169 val_169 2008-04-09 12 +169 val_169 2008-04-09 12 +17 val_17 2008-04-09 12 +170 val_170 2008-04-09 12 +172 val_172 2008-04-09 12 +172 val_172 2008-04-09 12 +174 val_174 2008-04-09 12 +174 val_174 2008-04-09 12 +175 val_175 2008-04-09 12 +175 val_175 2008-04-09 12 +176 val_176 2008-04-09 12 +176 val_176 2008-04-09 12 +177 val_177 2008-04-09 12 +178 val_178 2008-04-09 12 +179 val_179 2008-04-09 12 +179 val_179 2008-04-09 12 +18 val_18 2008-04-09 12 +18 val_18 2008-04-09 12 +180 val_180 2008-04-09 12 +181 val_181 2008-04-09 12 +183 val_183 2008-04-09 12 +186 val_186 2008-04-09 12 +187 val_187 2008-04-09 12 +187 val_187 2008-04-09 12 +187 val_187 2008-04-09 12 +189 val_189 2008-04-09 12 +19 val_19 2008-04-09 12 +190 val_190 2008-04-09 12 +191 val_191 2008-04-09 12 +191 val_191 2008-04-09 12 +192 val_192 2008-04-09 12 +193 val_193 2008-04-09 12 +193 val_193 2008-04-09 12 +193 val_193 2008-04-09 12 +194 val_194 2008-04-09 12 +195 val_195 2008-04-09 12 +195 val_195 2008-04-09 12 +196 val_196 2008-04-09 12 +197 val_197 2008-04-09 12 +197 val_197 2008-04-09 12 +199 val_199 2008-04-09 12 +199 val_199 2008-04-09 12 +199 val_199 2008-04-09 12 +2 val_2 2008-04-09 12 +20 val_20 2008-04-09 12 +200 val_200 2008-04-09 12 +200 val_200 2008-04-09 12 +201 val_201 2008-04-09 12 +202 val_202 2008-04-09 12 +203 val_203 2008-04-09 12 +203 val_203 2008-04-09 12 +205 val_205 2008-04-09 12 +205 val_205 2008-04-09 12 +207 val_207 2008-04-09 12 +207 val_207 2008-04-09 12 +208 val_208 2008-04-09 12 +208 val_208 2008-04-09 12 +208 val_208 2008-04-09 12 +209 val_209 2008-04-09 12 +209 val_209 2008-04-09 12 +213 val_213 2008-04-09 12 +213 val_213 2008-04-09 12 +214 val_214 2008-04-09 12 +216 val_216 2008-04-09 12 +216 val_216 2008-04-09 12 +217 val_217 2008-04-09 12 +217 val_217 2008-04-09 12 +218 val_218 2008-04-09 12 +219 val_219 2008-04-09 12 +219 val_219 2008-04-09 12 +221 val_221 2008-04-09 12 +221 val_221 2008-04-09 12 +222 val_222 2008-04-09 12 +223 val_223 2008-04-09 12 +223 val_223 2008-04-09 12 +224 val_224 2008-04-09 12 +224 val_224 2008-04-09 12 +226 val_226 2008-04-09 12 +228 val_228 2008-04-09 12 +229 val_229 2008-04-09 12 +229 val_229 2008-04-09 12 +230 val_230 2008-04-09 12 +230 val_230 2008-04-09 12 +230 val_230 2008-04-09 12 +230 val_230 2008-04-09 12 +230 val_230 2008-04-09 12 +233 val_233 2008-04-09 12 +233 val_233 2008-04-09 12 +235 val_235 2008-04-09 12 +237 val_237 2008-04-09 12 +237 val_237 2008-04-09 12 +238 val_238 2008-04-09 12 +238 val_238 2008-04-09 12 +239 val_239 2008-04-09 12 +239 val_239 2008-04-09 12 +24 val_24 2008-04-09 12 +24 val_24 2008-04-09 12 +241 val_241 2008-04-09 12 +242 val_242 2008-04-09 12 +242 val_242 2008-04-09 12 +244 val_244 2008-04-09 12 +247 val_247 2008-04-09 12 +248 val_248 2008-04-09 12 +249 val_249 2008-04-09 12 +252 val_252 2008-04-09 12 +255 val_255 2008-04-09 12 +255 val_255 2008-04-09 12 +256 val_256 2008-04-09 12 +256 val_256 2008-04-09 12 +257 val_257 2008-04-09 12 +258 val_258 2008-04-09 12 +26 val_26 2008-04-09 12 +26 val_26 2008-04-09 12 +260 val_260 2008-04-09 12 +262 val_262 2008-04-09 12 +263 val_263 2008-04-09 12 +265 val_265 2008-04-09 12 +265 val_265 2008-04-09 12 +266 val_266 2008-04-09 12 +27 val_27 2008-04-09 12 +272 val_272 2008-04-09 12 +272 val_272 2008-04-09 12 +273 val_273 2008-04-09 12 +273 val_273 2008-04-09 12 +273 val_273 2008-04-09 12 +274 val_274 2008-04-09 12 +275 val_275 2008-04-09 12 +277 val_277 2008-04-09 12 +277 val_277 2008-04-09 12 +277 val_277 2008-04-09 12 +277 val_277 2008-04-09 12 +278 val_278 2008-04-09 12 +278 val_278 2008-04-09 12 +28 val_28 2008-04-09 12 +280 val_280 2008-04-09 12 +280 val_280 2008-04-09 12 +281 val_281 2008-04-09 12 +281 val_281 2008-04-09 12 +282 val_282 2008-04-09 12 +282 val_282 2008-04-09 12 +283 val_283 2008-04-09 12 +284 val_284 2008-04-09 12 +285 val_285 2008-04-09 12 +286 val_286 2008-04-09 12 +287 val_287 2008-04-09 12 +288 val_288 2008-04-09 12 +288 val_288 2008-04-09 12 +289 val_289 2008-04-09 12 +291 val_291 2008-04-09 12 +292 val_292 2008-04-09 12 +296 val_296 2008-04-09 12 +298 val_298 2008-04-09 12 +298 val_298 2008-04-09 12 +298 val_298 2008-04-09 12 +30 val_30 2008-04-09 12 +302 val_302 2008-04-09 12 +305 val_305 2008-04-09 12 +306 val_306 2008-04-09 12 +307 val_307 2008-04-09 12 +307 val_307 2008-04-09 12 +308 val_308 2008-04-09 12 +309 val_309 2008-04-09 12 +309 val_309 2008-04-09 12 +310 val_310 2008-04-09 12 +311 val_311 2008-04-09 12 +311 val_311 2008-04-09 12 +311 val_311 2008-04-09 12 +315 val_315 2008-04-09 12 +316 val_316 2008-04-09 12 +316 val_316 2008-04-09 12 +316 val_316 2008-04-09 12 +317 val_317 2008-04-09 12 +317 val_317 2008-04-09 12 +318 val_318 2008-04-09 12 +318 val_318 2008-04-09 12 +318 val_318 2008-04-09 12 +321 val_321 2008-04-09 12 +321 val_321 2008-04-09 12 +322 val_322 2008-04-09 12 +322 val_322 2008-04-09 12 +323 val_323 2008-04-09 12 +325 val_325 2008-04-09 12 +325 val_325 2008-04-09 12 +327 val_327 2008-04-09 12 +327 val_327 2008-04-09 12 +327 val_327 2008-04-09 12 +33 val_33 2008-04-09 12 +331 val_331 2008-04-09 12 +331 val_331 2008-04-09 12 +332 val_332 2008-04-09 12 +333 val_333 2008-04-09 12 +333 val_333 2008-04-09 12 +335 val_335 2008-04-09 12 +336 val_336 2008-04-09 12 +338 val_338 2008-04-09 12 +339 val_339 2008-04-09 12 +34 val_34 2008-04-09 12 +341 val_341 2008-04-09 12 +342 val_342 2008-04-09 12 +342 val_342 2008-04-09 12 +344 val_344 2008-04-09 12 +344 val_344 2008-04-09 12 +345 val_345 2008-04-09 12 +348 val_348 2008-04-09 12 +348 val_348 2008-04-09 12 +348 val_348 2008-04-09 12 +348 val_348 2008-04-09 12 +348 val_348 2008-04-09 12 +35 val_35 2008-04-09 12 +35 val_35 2008-04-09 12 +35 val_35 2008-04-09 12 +351 val_351 2008-04-09 12 +353 val_353 2008-04-09 12 +353 val_353 2008-04-09 12 +356 val_356 2008-04-09 12 +360 val_360 2008-04-09 12 +362 val_362 2008-04-09 12 +364 val_364 2008-04-09 12 +365 val_365 2008-04-09 12 +366 val_366 2008-04-09 12 +367 val_367 2008-04-09 12 +367 val_367 2008-04-09 12 +368 val_368 2008-04-09 12 +369 val_369 2008-04-09 12 +369 val_369 2008-04-09 12 +369 val_369 2008-04-09 12 +37 val_37 2008-04-09 12 +37 val_37 2008-04-09 12 +373 val_373 2008-04-09 12 +374 val_374 2008-04-09 12 +375 val_375 2008-04-09 12 +377 val_377 2008-04-09 12 +378 val_378 2008-04-09 12 +379 val_379 2008-04-09 12 +382 val_382 2008-04-09 12 +382 val_382 2008-04-09 12 +384 val_384 2008-04-09 12 +384 val_384 2008-04-09 12 +384 val_384 2008-04-09 12 +386 val_386 2008-04-09 12 +389 val_389 2008-04-09 12 +392 val_392 2008-04-09 12 +393 val_393 2008-04-09 12 +394 val_394 2008-04-09 12 +395 val_395 2008-04-09 12 +395 val_395 2008-04-09 12 +396 val_396 2008-04-09 12 +396 val_396 2008-04-09 12 +396 val_396 2008-04-09 12 +397 val_397 2008-04-09 12 +397 val_397 2008-04-09 12 +399 val_399 2008-04-09 12 +399 val_399 2008-04-09 12 +4 val_4 2008-04-09 12 +400 val_400 2008-04-09 12 +401 val_401 2008-04-09 12 +401 val_401 2008-04-09 12 +401 val_401 2008-04-09 12 +401 val_401 2008-04-09 12 +401 val_401 2008-04-09 12 +402 val_402 2008-04-09 12 +403 val_403 2008-04-09 12 +403 val_403 2008-04-09 12 +403 val_403 2008-04-09 12 +404 val_404 2008-04-09 12 +404 val_404 2008-04-09 12 +406 val_406 2008-04-09 12 +406 val_406 2008-04-09 12 +406 val_406 2008-04-09 12 +406 val_406 2008-04-09 12 +407 val_407 2008-04-09 12 +409 val_409 2008-04-09 12 +409 val_409 2008-04-09 12 +409 val_409 2008-04-09 12 +41 val_41 2008-04-09 12 +411 val_411 2008-04-09 12 +413 val_413 2008-04-09 12 +413 val_413 2008-04-09 12 +414 val_414 2008-04-09 12 +414 val_414 2008-04-09 12 +417 val_417 2008-04-09 12 +417 val_417 2008-04-09 12 +417 val_417 2008-04-09 12 +418 val_418 2008-04-09 12 +419 val_419 2008-04-09 12 +42 val_42 2008-04-09 12 +42 val_42 2008-04-09 12 +421 val_421 2008-04-09 12 +424 val_424 2008-04-09 12 +424 val_424 2008-04-09 12 +427 val_427 2008-04-09 12 +429 val_429 2008-04-09 12 +429 val_429 2008-04-09 12 +43 val_43 2008-04-09 12 +430 val_430 2008-04-09 12 +430 val_430 2008-04-09 12 +430 val_430 2008-04-09 12 +431 val_431 2008-04-09 12 +431 val_431 2008-04-09 12 +431 val_431 2008-04-09 12 +432 val_432 2008-04-09 12 +435 val_435 2008-04-09 12 +436 val_436 2008-04-09 12 +437 val_437 2008-04-09 12 +438 val_438 2008-04-09 12 +438 val_438 2008-04-09 12 +438 val_438 2008-04-09 12 +439 val_439 2008-04-09 12 +439 val_439 2008-04-09 12 +44 val_44 2008-04-09 12 +443 val_443 2008-04-09 12 +444 val_444 2008-04-09 12 +446 val_446 2008-04-09 12 +448 val_448 2008-04-09 12 +449 val_449 2008-04-09 12 +452 val_452 2008-04-09 12 +453 val_453 2008-04-09 12 +454 val_454 2008-04-09 12 +454 val_454 2008-04-09 12 +454 val_454 2008-04-09 12 +455 val_455 2008-04-09 12 +457 val_457 2008-04-09 12 +458 val_458 2008-04-09 12 +458 val_458 2008-04-09 12 +459 val_459 2008-04-09 12 +459 val_459 2008-04-09 12 +460 val_460 2008-04-09 12 +462 val_462 2008-04-09 12 +462 val_462 2008-04-09 12 +463 val_463 2008-04-09 12 +463 val_463 2008-04-09 12 +466 val_466 2008-04-09 12 +466 val_466 2008-04-09 12 +466 val_466 2008-04-09 12 +467 val_467 2008-04-09 12 +468 val_468 2008-04-09 12 +468 val_468 2008-04-09 12 +468 val_468 2008-04-09 12 +468 val_468 2008-04-09 12 +469 val_469 2008-04-09 12 +469 val_469 2008-04-09 12 +469 val_469 2008-04-09 12 +469 val_469 2008-04-09 12 +469 val_469 2008-04-09 12 +47 val_47 2008-04-09 12 +470 val_470 2008-04-09 12 +472 val_472 2008-04-09 12 +475 val_475 2008-04-09 12 +477 val_477 2008-04-09 12 +478 val_478 2008-04-09 12 +478 val_478 2008-04-09 12 +479 val_479 2008-04-09 12 +480 val_480 2008-04-09 12 +480 val_480 2008-04-09 12 +480 val_480 2008-04-09 12 +481 val_481 2008-04-09 12 +482 val_482 2008-04-09 12 +483 val_483 2008-04-09 12 +484 val_484 2008-04-09 12 +485 val_485 2008-04-09 12 +487 val_487 2008-04-09 12 +489 val_489 2008-04-09 12 +489 val_489 2008-04-09 12 +489 val_489 2008-04-09 12 +489 val_489 2008-04-09 12 +490 val_490 2008-04-09 12 +491 val_491 2008-04-09 12 +492 val_492 2008-04-09 12 +492 val_492 2008-04-09 12 +493 val_493 2008-04-09 12 +494 val_494 2008-04-09 12 +495 val_495 2008-04-09 12 +496 val_496 2008-04-09 12 +497 val_497 2008-04-09 12 +498 val_498 2008-04-09 12 +498 val_498 2008-04-09 12 +498 val_498 2008-04-09 12 +5 val_5 2008-04-09 12 +5 val_5 2008-04-09 12 +5 val_5 2008-04-09 12 +51 val_51 2008-04-09 12 +51 val_51 2008-04-09 12 +53 val_53 2008-04-09 12 +54 val_54 2008-04-09 12 +57 val_57 2008-04-09 12 +58 val_58 2008-04-09 12 +58 val_58 2008-04-09 12 +64 val_64 2008-04-09 12 +65 val_65 2008-04-09 12 +66 val_66 2008-04-09 12 +67 val_67 2008-04-09 12 +67 val_67 2008-04-09 12 +69 val_69 2008-04-09 12 +70 val_70 2008-04-09 12 +70 val_70 2008-04-09 12 +70 val_70 2008-04-09 12 +72 val_72 2008-04-09 12 +72 val_72 2008-04-09 12 +74 val_74 2008-04-09 12 +76 val_76 2008-04-09 12 +76 val_76 2008-04-09 12 +77 val_77 2008-04-09 12 +78 val_78 2008-04-09 12 +8 val_8 2008-04-09 12 +80 val_80 2008-04-09 12 +82 val_82 2008-04-09 12 +83 val_83 2008-04-09 12 +83 val_83 2008-04-09 12 +84 val_84 2008-04-09 12 +84 val_84 2008-04-09 12 +85 val_85 2008-04-09 12 +86 val_86 2008-04-09 12 +87 val_87 2008-04-09 12 +9 val_9 2008-04-09 12 +90 val_90 2008-04-09 12 +90 val_90 2008-04-09 12 +90 val_90 2008-04-09 12 +92 val_92 2008-04-09 12 +95 val_95 2008-04-09 12 +95 val_95 2008-04-09 12 +96 val_96 2008-04-09 12 +97 val_97 2008-04-09 12 +97 val_97 2008-04-09 12 +98 val_98 2008-04-09 12 +98 val_98 2008-04-09 12