Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add hdfs sink partitioning sample

  • Loading branch information...
commit 2af401524ce7947bfbefdd828cb5f5992ce916fc 1 parent cfd2969
@jvalkeal jvalkeal authored trisberg committed
View
479 hdfs-partitioning/README.asciidoc
@@ -0,0 +1,479 @@
+= HDFS Sink Partitioning
+
+These samples demonstrate functionality available when using the `hdfs` sink and its partitioning features. We have 9 different test scenarios with source data sample files. See https://github.com/spring-projects/spring-xd/wiki/Sinks#hadoop-hdfs[hdfs sink documentation].
+
+.Notes for tests
+- Output from ‘hadoop fs ls’ has been manually modified to show only size, time and path.
+- Tests using ctrl-1, ctrl-2 special characters doesn’t show up in ‘hadoop fs cat’ when pasted to this document. They are visible from the command line though.
+- Finding reactor-ip source tcp address. Use “runtime modules” and “runtime container” to match Container Id and Host where source is running. Default port is 3000. You can send any data to it by piping it via netcat, i.e. “cat hash-100000.txt | nc node3 3000”. If running singlenode instance, address would always be localhost.
+- In these instructions, tests are run using Spring XD in distributed mode with three `hdfs` sinks. However, it's perfectly all right to run these using a singlenode installation. If you want to have only one `hdfs` sink, leave out the `properties` option when using `stream deploy` command. With singlenode you just have a slightly different output when listing files.
+
+== Test 1 - Simple time|hdfs with partitionPath
+
+With this test you can see that new partitioned files are opened when we get past the next minute boundary. Pattern used in `dateFormat` is resolved with current timestamp.
+
+[source,text]
+----
+xd:>stream create --name test1 --definition "time|hdfs --idleTimeout=10000 --partitionPath=dateFormat('yyyy/MM/dd/HH/mm')"
+xd:>stream deploy --name test1 --properties "module.hdfs.count=3"
+----
+
+Keep the stream running and list created files. Files having a suffix `.tmp` are currently open for write operation.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test1
+ 0 2014-05-22 19:25 /xd/test1/2014
+ 0 2014-05-22 19:25 /xd/test1/2014/05
+ 0 2014-05-22 19:25 /xd/test1/2014/05/22
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/25
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-0.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-1.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-2.txt
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/26
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-0.txt.tmp
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-1.txt.tmp
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-2.txt.tmp
+----
+
+Three XD containers will have its own writer and rolling part in file name is initialized on demand so we can write into a same directory even if we don’t have uuid identifier enabled. Idle timeout is closing old files when we get past the minute boundaries (or whatever is denoted by the partition path)
+
+[source,text]
+----
+xd:>stream destroy --name test1
+xd:>hadoop fs ls --recursive true --dir /xd/test1
+ 0 2014-05-22 19:25 /xd/test1/2014
+ 0 2014-05-22 19:25 /xd/test1/2014/05
+ 0 2014-05-22 19:25 /xd/test1/2014/05/22
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/25
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-0.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-1.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/25/test1-2.txt
+ 0 2014-05-22 19:26 /xd/test1/2014/05/22/19/26
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-0.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-1.txt
+140 2014-05-22 19:26 /xd/test1/2014/05/22/19/26/test1-2.txt
+----
+
+
+== Test 2 - Simple time|hdfs without partitionPath
+
+With this test we can see that new partitioned files are opened without using partitionPath. If you setup fixedDelay and idleTimeout so that the writers will get timeouts, you’ll see how new rolling part is opened even if it’s a distributed writer. If using a singlenode you'd see only one file open at any time.
+
+[source,text]
+----
+xd:>stream create --name test2 --definition "time --fixedDelay=5|hdfs --idleTimeout=10000"
+xd:>stream deploy --name test2 --properties "module.hdfs.count=3"
+----
+
+Keep the stream running and list created files.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test2
+40 2014-05-22 19:46 /xd/test2/test2-0.txt
+20 2014-05-22 19:46 /xd/test2/test2-1.txt
+ 0 2014-05-22 19:45 /xd/test2/test2-2.txt.tmp
+ 0 2014-05-22 19:46 /xd/test2/test2-3.txt.tmp
+ 0 2014-05-22 19:46 /xd/test2/test2-4.txt.tmp
+----
+
+== Test 3 - Simple time|hdfs without partitionPath with uuid
+
+Same as test2 but we use uuid in file names. Uuid will add a unique file name per writer so the rolling part is incremented within a writer itself, not globally.
+
+[source,text]
+----
+xd:>stream create --name test3 --definition "time --fixedDelay=5|hdfs --idleTimeout=10000 --fileUuid=true"
+xd:>stream deploy --name test3 --properties "module.hdfs.count=3"
+----
+
+Keep the stream running and list created files.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test3
+ 0 2014-05-22 20:03 /xd/test3/test3-0a659f17-7a98-4f1b-8528-66eb2d3a33a2-0.txt.tmp
+20 2014-05-22 20:03 /xd/test3/test3-351baa09-a175-433a-b176-c15ff594471c-0.txt
+ 0 2014-05-22 20:03 /xd/test3/test3-351baa09-a175-433a-b176-c15ff594471c-1.txt.tmp
+40 2014-05-22 20:03 /xd/test3/test3-96858e6a-7840-4c65-90eb-42dc42ab953e-0.txt
+----
+
+== Test 4 - Simple time|transform|hdfs partitioning by content
+
+In this test we use time to get dummy tick, use transform to create a random content and finally use path() and dateFormat() to construct a path from a payload. This is a sample where data is delimited with ctrl-1 and ctrl-2 special characters and first part is the app id to be used for partitioning.
+
+[source,text]
+----
+xd:>stream create --name test4 --definition "time | transform --expression=\"'APP'+T(Math).round(T(Math).random()*5)+'\u0001foo\u0002bar'\" | hdfs --idleTimeout=10000 --partitionPath=path(dateFormat('yyyy/MM/dd/HH'),payload.split('\u0001')[0])"
+xd:>stream deploy --name test4 --properties "module.hdfs.count=3"
+----
+
+You should see partitioning by 6 different app id’s and rolling parts because different writers are writing into a same directory.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test4
+ 0 2014-05-22 20:16 /xd/test4/2014
+ 0 2014-05-22 20:16 /xd/test4/2014/05
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP0
+13 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP0/test4-0.txt
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP0/test4-1.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP1
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP1/test4-0.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP1/test4-1.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP1/test4-2.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP2
+26 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP2/test4-0.txt
+26 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP2/test4-1.txt
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP2/test4-2.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP3
+39 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP3/test4-0.txt
+13 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP3/test4-1.txt
+13 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP3/test4-2.txt
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP3/test4-3.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP4
+26 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP4/test4-0.txt
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP4/test4-1.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP4/test4-2.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP4/test4-3.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP5
+13 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP5/test4-0.txt
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP5/test4-1.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP5/test4-2.txt.tmp
+ 0 2014-05-22 20:16 /xd/test4/2014/05/22/20/APP5/test4-3.txt.tmp
+----
+
+Let’s just check that content is routed correctly.
+
+[source,text]
+----
+xd:>hadoop fs cat /xd/test4/2014/05/22/20/APP0/test4-0.txt
+APP0foobar
+xd:>hadoop fs cat /xd/test4/2014/05/22/20/APP2/test4-1.txt
+APP2foobar
+APP2foobar
+----
+
+== Test 5 - Simple reactor-ip|hdfs partitioning by dateFormat and list
+
+We use the ctrl delimited data pre-written in app1to10-*.txt files. Feed this data into hdfs sinks via reactor-ip source. See notes how to find reactor tcp port and how to feed data into it.
+We simply use dateFormat and list partitioning to collect entries from APP1-APP5 to 1TO5 and APP6-APP10 to 6TO10. We enable fileUuid and use idleTimeout to close files at some point while stream is still deployed.
+
+NOTE: If defined list is not resolved, simple ‘list’ will be used instead of ‘XXX_list’. This works as a fallback for data outside of specified lists.
+
+Path part with list() partitioning is suffixed with “_list”, these suffixes were chosen to mimic kitesdk.
+
+[source,text]
+----
+xd:>stream create --name test5 --definition "reactor-ip | hdfs --idleTimeout=30000 --fileUuid=true --partitionPath=path(dateFormat('yyyy/MM/dd'),list(payload.split('\u0001')[0],{{'1TO5','APP1','APP2','APP3','APP4','APP5'},{'6TO10','APP6','APP7','APP8','APP9','APP10'}}))"
+xd:>stream deploy --name test5 --properties "module.hdfs.count=3,module.reactor-ip.count=1"
+----
+
+Send sample data to `reactor-ip` source.
+
+[source,text]
+----
+# cat app1to10-1000000.txt | nc localhost 3000
+----
+
+When all data is ingested into sinks, we should eventually see files to be closed and data partitioned into 6 different files. You could have more files if stream chokes and timeout occurs with a writer.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test5
+ 0 2014-05-22 20:47 /xd/test5/2014
+ 0 2014-05-22 20:47 /xd/test5/2014/05
+ 0 2014-05-22 20:47 /xd/test5/2014/05/22
+ 0 2014-05-22 20:56 /xd/test5/2014/05/22/1TO5_list
+2225054 2014-05-22 20:56 /xd/test5/2014/05/22/1TO5_list/test5-376d862c-9fd9-4639-8e12-3d6e604985d5-0.txt
+2034890 2014-05-22 20:56 /xd/test5/2014/05/22/1TO5_list/test5-7be2abd1-3ac8-41f4-8668-451b25fc1068-0.txt
+2232880 2014-05-22 20:56 /xd/test5/2014/05/22/1TO5_list/test5-c31e86f1-cf72-4a16-94dd-c4d72a8e3244-0.txt
+ 0 2014-05-22 20:56 /xd/test5/2014/05/22/6TO10_list
+2261695 2014-05-22 20:56 /xd/test5/2014/05/22/6TO10_list/test5-376d862c-9fd9-4639-8e12-3d6e604985d5-0.txt
+2070202 2014-05-22 20:56 /xd/test5/2014/05/22/6TO10_list/test5-7be2abd1-3ac8-41f4-8668-451b25fc1068-0.txt
+2275437 2014-05-22 20:56 /xd/test5/2014/05/22/6TO10_list/test5-c31e86f1-cf72-4a16-94dd-c4d72a8e3244-0.txt
+----
+
+Let’s just check one of these files to see that data for APP1-APP5 were partitioned correctly
+
+[source,text]
+----
+xd:>hadoop fs copyToLocal --from /xd/test5/2014/05/22/1TO5_list/test5-376d862c-9fd9-4639-8e12-3d6e604985d5-0.txt --to /tmp
+
+$ tail -10 /tmp/test5-376d862c-9fd9-4639-8e12-3d6e604985d5-0.txt
+APP5foobar
+APP3foobar
+APP5foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP3foobar
+APP2foobar
+APP2foobar
+APP2foobar
+----
+
+
+
+== Test 6 - Simple reactor-ip|hdfs partitioning by dateFormat and range
+
+In this sample we take a simple counter data from 1 to 7500 prefixed with ‘XXX’ and partition by an Integer range:
+
+[source,text]
+----
+XXX1
+
+XXX1234
+
+XXX7500
+----
+
+The range() partition function takes a key as first argument and list as a second argument. Behind the scenes this is using jvm’s binarySearch which works on an Object level so we can pass in anything. Thought meaningful range match only works if passed in Object are of same type like Integers. Range is defined by a binarySearch itself so mostly it is to match against an upper bound except the last range in a list. Having a list of `{1000,3000,5000}` means that everything above 3000 will be matched with 5000. If that is an issue then simply adding Integer.MAX_VALUE as last range would overflow everything above 5000 into a new partition.
+
+Path part with range() partitioning is suffixed with “_range”.
+
+[source,text]
+----
+xd:>stream create --name test6 --definition "reactor-ip | hdfs --idleTimeout=30000 --fileUuid=true --partitionPath=path(dateFormat('yyyy/MM/dd'),range(T(Integer).parseInt(payload.substring(3)),{1000,3000,5000}))"
+xd:>stream deploy --name test6 --properties "module.hdfs.count=3,module.reactor-ip.count=1"
+----
+
+Send sample data to `reactor-ip` source.
+
+[source,text]
+----
+# cat counters-7500.txt | nc localhost 3000
+----
+
+These 7500 data items would then go into 3 different partitions and every writer would naturally have its own partition files totalling of 9 files with 3 containers.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test6
+ 0 2014-05-22 21:50 /xd/test6/2014
+ 0 2014-05-22 21:50 /xd/test6/2014/05
+ 0 2014-05-22 21:50 /xd/test6/2014/05/22
+ 0 2014-05-22 21:51 /xd/test6/2014/05/22/1000_range
+ 2126 2014-05-22 21:51 /xd/test6/2014/05/22/1000_range/test6-17590e6b-78e6-42c3-a8be-419a4376e3c9-0.txt
+ 2313 2014-05-22 21:51 /xd/test6/2014/05/22/1000_range/test6-43044089-0f93-423a-afae-f191f50e7bd8-0.txt
+ 2454 2014-05-22 21:51 /xd/test6/2014/05/22/1000_range/test6-4fc6a25d-d24f-413f-aeb2-0e33efde037a-0.txt
+ 0 2014-05-22 21:51 /xd/test6/2014/05/22/3000_range
+ 4576 2014-05-22 21:51 /xd/test6/2014/05/22/3000_range/test6-17590e6b-78e6-42c3-a8be-419a4376e3c9-0.txt
+ 5744 2014-05-22 21:51 /xd/test6/2014/05/22/3000_range/test6-43044089-0f93-423a-afae-f191f50e7bd8-0.txt
+ 5680 2014-05-22 21:51 /xd/test6/2014/05/22/3000_range/test6-4fc6a25d-d24f-413f-aeb2-0e33efde037a-0.txt
+ 0 2014-05-22 21:51 /xd/test6/2014/05/22/5000_range
+ 9816 2014-05-22 21:51 /xd/test6/2014/05/22/5000_range/test6-17590e6b-78e6-42c3-a8be-419a4376e3c9-0.txt
+12616 2014-05-22 21:51 /xd/test6/2014/05/22/5000_range/test6-43044089-0f93-423a-afae-f191f50e7bd8-0.txt
+13568 2014-05-22 21:51 /xd/test6/2014/05/22/5000_range/test6-4fc6a25d-d24f-413f-aeb2-0e33efde037a-0.txt
+----
+
+== Test 7 - Simple reactor-ip|hdfs partitioning by dateFormat and hash
+
+In this we take a simple counter data which have two fields separate by comma, first field is an app id(APP1 - APP100) and second field a counter (1 - 10000):
+[source,text]
+----
+APP2,1
+APP88,2
+APP42,3
+APP8,4
+
+APP47,9998
+APP57,9999
+APP33,10000
+----
+
+The focus here is to have an even distribution of partition files, so that when files are processed we would not have mixed small and large files. We know that there are 10000 items in this file and 100 different app id’s. Let’s just try to partition with Object hashCode and its modulo with 7 buckets.
+
+Hashing is using “Object.hashCode() % buckets”. Path part with range() partitioning is suffixed with “_hash”.
+
+[source,text]
+----
+xd:>stream create --name test7 --definition "reactor-ip | hdfs --idleTimeout=30000 --fileUuid=true --partitionPath=path(dateFormat('yyyy/MM/dd'),hash(payload.split(',')[0],7))"
+xd:>stream deploy --name test7 --properties "module.hdfs.count=3,module.reactor-ip.count=1"
+----
+
+Send sample data to `reactor-ip` source.
+
+[source,text]
+----
+# cat hash-10000.txt | nc localhost 3000
+----
+
+Checking the files sizes on left side shows that if bucket size is chosen wisely, depending on a data, we should get pretty good distribution into 7 buckets throughout 3 writers into total of 21 files.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test7
+ 0 2014-05-22 22:37 /xd/test7/2014
+ 0 2014-05-22 22:37 /xd/test7/2014/05
+ 0 2014-05-22 22:37 /xd/test7/2014/05/22
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/0_hash
+5627 2014-05-22 22:38 /xd/test7/2014/05/22/0_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+5213 2014-05-22 22:38 /xd/test7/2014/05/22/0_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+5194 2014-05-22 22:38 /xd/test7/2014/05/22/0_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/1_hash
+6033 2014-05-22 22:38 /xd/test7/2014/05/22/1_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+5274 2014-05-22 22:38 /xd/test7/2014/05/22/1_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+5516 2014-05-22 22:38 /xd/test7/2014/05/22/1_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/2_hash
+4836 2014-05-22 22:38 /xd/test7/2014/05/22/2_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+4356 2014-05-22 22:38 /xd/test7/2014/05/22/2_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+4469 2014-05-22 22:38 /xd/test7/2014/05/22/2_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/3_hash
+5478 2014-05-22 22:38 /xd/test7/2014/05/22/3_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+4934 2014-05-22 22:38 /xd/test7/2014/05/22/3_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+4562 2014-05-22 22:38 /xd/test7/2014/05/22/3_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/4_hash
+5152 2014-05-22 22:38 /xd/test7/2014/05/22/4_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+4644 2014-05-22 22:38 /xd/test7/2014/05/22/4_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+5252 2014-05-22 22:38 /xd/test7/2014/05/22/4_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/5_hash
+5531 2014-05-22 22:38 /xd/test7/2014/05/22/5_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+4690 2014-05-22 22:38 /xd/test7/2014/05/22/5_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+4974 2014-05-22 22:38 /xd/test7/2014/05/22/5_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+ 0 2014-05-22 22:38 /xd/test7/2014/05/22/6_hash
+5651 2014-05-22 22:38 /xd/test7/2014/05/22/6_hash/test7-50d88b45-9870-4c32-93ce-14ce01d46937-0.txt
+5195 2014-05-22 22:38 /xd/test7/2014/05/22/6_hash/test7-567a420d-b2a5-45af-bc26-15199d220ebc-0.txt
+5475 2014-05-22 22:38 /xd/test7/2014/05/22/6_hash/test7-9dae96c5-bde7-4e0d-b7bb-c82ff4d1115d-0.txt
+----
+
+
+== Test 8 - Simple reactor-ip|hdfs partitioning by dateFormat with given field value
+
+In this we take a simple counter data which have two fields separated by comma, first field is a date `yyyy-MM-dd` and second field is a counter `1 - 10000`:
+[source,text]
+----
+1970-01-01,1
+1970-01-01,2
+1970-01-01,3
+
+1970-01-06,9998
+1970-01-06,9999
+1970-01-06,10000
+----
+
+On default if a second argument passed to dateFormat() function is a String it is treated as an timestamp which is then used to convert against first argument instead of assuming that data conversion should be resolved from a SI message timestamp.
+
+NOTE: See partition paths resolved to 70’s instead of present day.
+
+[source,text]
+----
+xd:>stream create --name test8 --definition "reactor-ip | hdfs --idleTimeout=30000 --fileUuid=true --partitionPath=path(dateFormat('yyyy/MM/dd',payload.split(',')[0]))"
+xd:>stream deploy --name test8 --properties "module.hdfs.count=3,module.reactor-ip.count=1"
+----
+
+Send sample data to `reactor-ip` source.
+
+[source,text]
+----
+# cat date-counters-default-10000.txt | nc localhost 3000
+----
+
+List files and see how data is partitioned.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd/test8
+ 0 2014-05-23 12:41 /xd/test8
+ 0 2014-05-23 12:41 /xd/test8/1970
+ 0 2014-05-23 12:41 /xd/test8/1970/01
+ 0 2014-05-23 12:42 /xd/test8/1970/01/01
+11888 2014-05-23 12:42 /xd/test8/1970/01/01/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 7177 2014-05-23 12:42 /xd/test8/1970/01/01/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 6308 2014-05-23 12:42 /xd/test8/1970/01/01/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+ 0 2014-05-23 12:42 /xd/test8/1970/01/02
+11776 2014-05-23 12:42 /xd/test8/1970/01/02/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 8320 2014-05-23 12:42 /xd/test8/1970/01/02/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 7552 2014-05-23 12:42 /xd/test8/1970/01/02/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+ 0 2014-05-23 12:42 /xd/test8/1970/01/03
+10704 2014-05-23 12:42 /xd/test8/1970/01/03/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 9280 2014-05-23 12:42 /xd/test8/1970/01/03/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 7664 2014-05-23 12:42 /xd/test8/1970/01/03/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+ 0 2014-05-23 12:42 /xd/test8/1970/01/04
+ 9424 2014-05-23 12:42 /xd/test8/1970/01/04/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 8912 2014-05-23 12:42 /xd/test8/1970/01/04/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 9312 2014-05-23 12:42 /xd/test8/1970/01/04/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+ 0 2014-05-23 12:42 /xd/test8/1970/01/05
+10272 2014-05-23 12:42 /xd/test8/1970/01/05/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 8640 2014-05-23 12:42 /xd/test8/1970/01/05/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 8736 2014-05-23 12:42 /xd/test8/1970/01/05/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+ 0 2014-05-23 12:42 /xd/test8/1970/01/06
+ 8385 2014-05-23 12:42 /xd/test8/1970/01/06/test8-0bbc109f-5261-4fdc-a3d5-0b84a7f04c8d-0.txt
+ 7008 2014-05-23 12:42 /xd/test8/1970/01/06/test8-9658625c-b6ac-443c-b691-7db5c1605e60-0.txt
+ 7536 2014-05-23 12:42 /xd/test8/1970/01/06/test8-99de2617-c0c5-4d7e-a873-786d50ffff3a-0.txt
+----
+
+== Test 9 - Simple reactor-ip|hdfs partitioning by dateFormat with given field value and custom format
+
+Same as test 8 but first field in a data has a different format.
+In this we take a simple counter data which have two fields separated by comma, first field is a date `yyyy-MM-dd_HH:MM:SS` and second field is a counter `1 - 10000`:
+[source,text]
+----
+1970-01-01_01:00:50,1
+1970-01-01_01:01:40,2
+1970-01-01_01:02:30,3
+
+1970-01-06_01:02:30,9998
+1970-01-06_19:52:30,9999
+1970-01-06_19:53:20,10000
+----
+
+Third parameter in dateFormat() can be a representation of a custom format used to parse a value from a second parameter. This would allow to parse any supported date/timestamp out from a message payload and translate it to a partition path which is i.e. based on log entry’s timestamp instead of SI’s Message timestamp.
+
+[source,text]
+----
+xd:>stream create --name test9 --definition "reactor-ip | hdfs --idleTimeout=30000 --fileUuid=true --partitionPath=path(dateFormat('yyyy/MM/dd',payload.split(',')[0],'yyyy-MM-DD_HH:MM:SS'))"
+xd:>stream deploy --name test9 --properties "module.hdfs.count=3,module.reactor-ip.count=1"
+----
+
+Send sample data to `reactor-ip` source.
+
+[source,text]
+----
+# cat date-counters-custom-10000.txt | nc localhost 3000
+----
+
+List files and see how data is partitioned.
+
+[source,text]
+----
+xd:>hadoop fs ls --recursive true --dir /xd
+ 0 2014-05-23 11:18 /xd/app
+ 2789 2014-05-23 11:18 /xd/app/modules.yml
+ 3451 2014-05-23 11:18 /xd/app/servers.yml
+18657 2014-05-23 11:18 /xd/app/spring-xd-yarn-1.0.0.BUILD-SNAPSHOT.zip
+60819 2014-05-23 11:18 /xd/app/spring-xd-yarn-appmaster-1.0.0.BUILD-SNAPSHOT.jar
+ 0 2014-05-23 13:32 /xd/test9
+ 0 2014-05-23 13:32 /xd/test9/1970
+ 0 2014-05-23 13:32 /xd/test9/1970/01
+ 0 2014-05-23 13:33 /xd/test9/1970/01/01
+16912 2014-05-23 13:33 /xd/test9/1970/01/01/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+11500 2014-05-23 13:33 /xd/test9/1970/01/01/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+11856 2014-05-23 13:33 /xd/test9/1970/01/01/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+ 0 2014-05-23 13:33 /xd/test9/1970/01/02
+16400 2014-05-23 13:33 /xd/test9/1970/01/02/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+13675 2014-05-23 13:33 /xd/test9/1970/01/02/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+13125 2014-05-23 13:33 /xd/test9/1970/01/02/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+ 0 2014-05-23 13:33 /xd/test9/1970/01/03
+14175 2014-05-23 13:33 /xd/test9/1970/01/03/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+14775 2014-05-23 13:33 /xd/test9/1970/01/03/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+14250 2014-05-23 13:33 /xd/test9/1970/01/03/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+ 0 2014-05-23 13:33 /xd/test9/1970/01/04
+18350 2014-05-23 13:33 /xd/test9/1970/01/04/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+12425 2014-05-23 13:33 /xd/test9/1970/01/04/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+12425 2014-05-23 13:33 /xd/test9/1970/01/04/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+ 0 2014-05-23 13:33 /xd/test9/1970/01/05
+17675 2014-05-23 13:33 /xd/test9/1970/01/05/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+14025 2014-05-23 13:33 /xd/test9/1970/01/05/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+11500 2014-05-23 13:33 /xd/test9/1970/01/05/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+ 0 2014-05-23 13:33 /xd/test9/1970/01/06
+16051 2014-05-23 13:33 /xd/test9/1970/01/06/test9-33e19563-cb6b-4bbd-a058-736f4d486640-0.txt
+ 9875 2014-05-23 13:33 /xd/test9/1970/01/06/test9-3e3a5d16-ac8f-4274-bff8-4203b338880d-0.txt
+ 9900 2014-05-23 13:33 /xd/test9/1970/01/06/test9-a192f6d7-9312-4fec-b730-6c4e5206232c-0.txt
+----
+
View
1,000 hdfs-partitioning/app1to10-1000.txt
@@ -0,0 +1,1000 @@
+APP8foobar
+APP3foobar
+APP8foobar
+APP2foobar
+APP7foobar
+APP8foobar
+APP10foobar
+APP2foobar
+APP3foobar
+APP6foobar
+APP2foobar
+APP6foobar
+APP10foobar
+APP7foobar
+APP1foobar
+APP3foobar
+APP10foobar
+APP10foobar
+APP2foobar
+APP7foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP9foobar
+APP2foobar
+APP9foobar
+APP10foobar
+APP4foobar
+APP8foobar
+APP1foobar
+APP9foobar
+APP9foobar
+APP7foobar
+APP9foobar
+APP10foobar
+APP5foobar
+APP1foobar
+APP4foobar
+APP1foobar
+APP9foobar
+APP2foobar
+APP6foobar
+APP9foobar
+APP2foobar
+APP8foobar
+APP7foobar
+APP6foobar
+APP7foobar
+APP7foobar
+APP7foobar
+APP4foobar
+APP7foobar
+APP9foobar
+APP1foobar
+APP7foobar
+APP9foobar
+APP2foobar
+APP2foobar
+APP5foobar
+APP6foobar
+APP9foobar
+APP5foobar
+APP5foobar
+APP7foobar
+APP7foobar
+APP10foobar
+APP3foobar
+APP8foobar
+APP7foobar
+APP3foobar
+APP3foobar
+APP6foobar
+APP6foobar
+APP9foobar
+APP2foobar
+APP9foobar
+APP1foobar
+APP4foobar
+APP4foobar
+APP9foobar
+APP8foobar
+APP5foobar
+APP5foobar
+APP4foobar
+APP4foobar
+APP4foobar
+APP9foobar
+APP7foobar
+APP5foobar
+APP1foobar
+APP8foobar
+APP10foobar
+APP2foobar
+APP8foobar
+APP9foobar
+APP9foobar
+APP10foobar
+APP10foobar
+APP5foobar
+APP10foobar
+APP4foobar
+APP5foobar
+APP9foobar
+APP5foobar
+APP4foobar
+APP4foobar
+APP8foobar
+APP8foobar
+APP3foobar
+APP10foobar
+APP4foobar
+APP8foobar
+APP9foobar
+APP7foobar
+APP8foobar
+APP2foobar
+APP7foobar
+APP10foobar
+APP9foobar
+APP9foobar
+APP9foobar
+APP5foobar
+APP3foobar
+APP4foobar
+APP10foobar
+APP10foobar
+APP4foobar
+APP8foobar
+APP2foobar
+APP8foobar
+APP5foobar
+APP10foobar
+APP1foobar
+APP6foobar
+APP3foobar
+APP4foobar
+APP2foobar
+APP8foobar
+APP10foobar
+APP9foobar
+APP6foobar
+APP1foobar
+APP9foobar
+APP3foobar
+APP3foobar
+APP4foobar
+APP5foobar
+APP4foobar
+APP2foobar
+APP5foobar
+APP6foobar
+APP9foobar
+APP10foobar
+APP10foobar
+APP7foobar
+APP10foobar
+APP8foobar
+APP3foobar
+APP7foobar
+APP3foobar
+APP8foobar
+APP2foobar
+APP4foobar
+APP7foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP9foobar
+APP9foobar
+APP6foobar
+APP5foobar
+APP2foobar
+APP3foobar
+APP10foobar
+APP10foobar
+APP7foobar
+APP9foobar
+APP4foobar
+APP5foobar
+APP8foobar
+APP2foobar
+APP6foobar
+APP5foobar
+APP1foobar
+APP1foobar
+APP2foobar
+APP1foobar
+APP2foobar
+APP7foobar
+APP10foobar
+APP2foobar
+APP3foobar
+APP2foobar
+APP9foobar
+APP9foobar
+APP5foobar
+APP4foobar
+APP3foobar
+APP6foobar
+APP8foobar
+APP3foobar
+APP2foobar
+APP6foobar
+APP6foobar
+APP10foobar
+APP3foobar
+APP2foobar
+APP7foobar
+APP4foobar
+APP2foobar
+APP9foobar
+APP7foobar
+APP3foobar
+APP9foobar
+APP5foobar
+APP4foobar
+APP1foobar
+APP2foobar
+APP4foobar
+APP5foobar
+APP3foobar
+APP10foobar
+APP1foobar
+APP6foobar
+APP2foobar
+APP4foobar
+APP9foobar
+APP2foobar
+APP2foobar
+APP10foobar
+APP3foobar
+APP3foobar
+APP10foobar
+APP3foobar
+APP5foobar
+APP2foobar
+APP3foobar
+APP1foobar
+APP6foobar
+APP8foobar
+APP4foobar
+APP9foobar
+APP3foobar
+APP2foobar
+APP7foobar
+APP5foobar
+APP5foobar
+APP7foobar
+APP10foobar
+APP6foobar
+APP5foobar
+APP6foobar
+APP8foobar
+APP2foobar
+APP9foobar
+APP7foobar
+APP1foobar
+APP10foobar
+APP10foobar
+APP9foobar
+APP2foobar
+APP5foobar
+APP8foobar
+APP5foobar
+APP5foobar
+APP2foobar
+APP7foobar
+APP5foobar
+APP10foobar
+APP9foobar
+APP4foobar
+APP1foobar
+APP10foobar
+APP3foobar
+APP3foobar
+APP3foobar
+APP2foobar
+APP2foobar
+APP7foobar
+APP1foobar
+APP1foobar
+APP9foobar
+APP7foobar
+APP8foobar
+APP1foobar
+APP3foobar
+APP4foobar
+APP3foobar
+APP3foobar
+APP6foobar
+APP10foobar
+APP4foobar
+APP2foobar
+APP7foobar
+APP10foobar
+APP5foobar
+APP8foobar
+APP3foobar
+APP1foobar
+APP8foobar
+APP8foobar
+APP2foobar
+APP9foobar
+APP1foobar
+APP6foobar
+APP3foobar
+APP6foobar
+APP4foobar
+APP7foobar
+APP5foobar
+APP2foobar
+APP5foobar
+APP4foobar
+APP3foobar
+APP3foobar
+APP6foobar
+APP3foobar
+APP7foobar
+APP4foobar
+APP6foobar
+APP10foobar
+APP10foobar
+APP6foobar
+APP10foobar
+APP8foobar
+APP7foobar
+APP1foobar
+APP3foobar
+APP1foobar
+APP4foobar
+APP5foobar
+APP9foobar
+APP4foobar
+APP3foobar
+APP4foobar
+APP7foobar
+APP2foobar
+APP1foobar
+APP1foobar
+APP9foobar
+APP5foobar
+APP6foobar
+APP10foobar
+APP3foobar
+APP4foobar
+APP8foobar
+APP1foobar
+APP6foobar
+APP6foobar
+APP3foobar
+APP6foobar
+APP8foobar
+APP1foobar
+APP7foobar
+APP2foobar
+APP4foobar
+APP7foobar
+APP6foobar
+APP10foobar
+APP5foobar
+APP8foobar
+APP2foobar
+APP6foobar
+APP5foobar
+APP4foobar
+APP8foobar
+APP1foobar
+APP6foobar
+APP8foobar
+APP6foobar
+APP3foobar
+APP5foobar
+APP10foobar
+APP9foobar
+APP10foobar
+APP4foobar
+APP5foobar
+APP4foobar
+APP8foobar
+APP2foobar
+APP8foobar
+APP7foobar
+APP2foobar
+APP9foobar
+APP8foobar
+APP4foobar
+APP8foobar
+APP7foobar
+APP7foobar
+APP7foobar
+APP10foobar
+APP8foobar
+APP9foobar
+APP7foobar
+APP5foobar
+APP10foobar
+APP6foobar
+APP7foobar
+APP9foobar
+APP1foobar
+APP5foobar
+APP2foobar
+APP2foobar
+APP6foobar
+APP7foobar
+APP1foobar
+APP6foobar
+APP2foobar
+APP4foobar
+APP2foobar
+APP5foobar
+APP7foobar
+APP4foobar
+APP10foobar
+APP7foobar
+APP1foobar
+APP2foobar
+APP9foobar
+APP6foobar
+APP6foobar
+APP1foobar
+APP9foobar
+APP9foobar
+APP7foobar
+APP7foobar
+APP3foobar
+APP1foobar
+APP4foobar
+APP4foobar
+APP10foobar
+APP3foobar
+APP5foobar
+APP5foobar
+APP7foobar
+APP7foobar
+APP9foobar
+APP1foobar
+APP4foobar
+APP9foobar
+APP4foobar
+APP9foobar
+APP3foobar
+APP5foobar
+APP6foobar
+APP6foobar
+APP6foobar
+APP5foobar
+APP7foobar
+APP5foobar
+APP10foobar
+APP8foobar
+APP1foobar
+APP4foobar
+APP3foobar
+APP9foobar
+APP9foobar
+APP8foobar
+APP1foobar
+APP1foobar
+APP1foobar
+APP3foobar
+APP5foobar
+APP3foobar
+APP9foobar
+APP1foobar
+APP6foobar
+APP9foobar
+APP9foobar
+APP9foobar
+APP6foobar
+APP1foobar
+APP4foobar
+APP1foobar
+APP4foobar
+APP9foobar
+APP10foobar
+APP6foobar
+APP10foobar
+APP2foobar
+APP7foobar
+APP5foobar
+APP9foobar
+APP2foobar
+APP10foobar
+APP1foobar
+APP9foobar
+APP9foobar
+APP5foobar
+APP9foobar
+APP9foobar
+APP10foobar
+APP6foobar
+APP3foobar
+APP1foobar
+APP1foobar
+APP9foobar
+APP10foobar
+APP6foobar
+APP5foobar
+APP1foobar
+APP4foobar
+APP9foobar
+APP6foobar
+APP10foobar
+APP9foobar
+APP10foobar
+APP3foobar
+APP3foobar
+APP6foobar
+APP10foobar
+APP6foobar
+APP5foobar
+APP10foobar
+APP4foobar
+APP1foobar
+APP1foobar
+APP3foobar
+APP2foobar
+APP2foobar
+APP10foobar
+APP8foobar
+APP10foobar
+APP4foobar
+APP8foobar
+APP5foobar
+APP4foobar
+APP9foobar
+APP9foobar
+APP5foobar
+APP3foobar
+APP6foobar
+APP5foobar
+APP4foobar
+APP4foobar
+APP9foobar
+APP4foobar
+APP2foobar
+APP9foobar
+APP9foobar
+APP3foobar
+APP7foobar
+APP4foobar
+APP4foobar
+APP7foobar
+APP9foobar
+APP7foobar
+APP9foobar
+APP6foobar
+APP7foobar
+APP4foobar
+APP10foobar
+APP4foobar
+APP5foobar
+APP8foobar
+APP7foobar
+APP1foobar
+APP3foobar
+APP1foobar
+APP9foobar
+APP1foobar
+APP10foobar
+APP8foobar
+APP4foobar
+APP1foobar
+APP5foobar
+APP4foobar
+APP1foobar
+APP2foobar
+APP5foobar
+APP5foobar
+APP3foobar
+APP5foobar
+APP4foobar
+APP2foobar
+APP7foobar
+APP4foobar
+APP10foobar
+APP6foobar
+APP1foobar
+APP4foobar
+APP9foobar
+APP3foobar
+APP2foobar
+APP1foobar
+APP2foobar
+APP3foobar
+APP3foobar
+APP8foobar
+APP4foobar
+APP8foobar
+APP4foobar
+APP10foobar
+APP5foobar
+APP3foobar
+APP7foobar
+APP4foobar
+APP3foobar
+APP7foobar
+APP7foobar
+APP1foobar
+APP7foobar
+APP1foobar
+APP1foobar
+APP6foobar
+APP9foobar
+APP6foobar
+APP5foobar
+APP9foobar
+APP4foobar
+APP1foobar
+APP6foobar
+APP6foobar
+APP9foobar
+APP8foobar
+APP6foobar
+APP7foobar
+APP9foobar
+APP1foobar
+APP4foobar
+APP6foobar
+APP9foobar
+APP1foobar
+APP1foobar
+APP2foobar
+APP2foobar
+APP8foobar
+APP6foobar
+APP8foobar
+APP6foobar
+APP9foobar
+APP4foobar
+APP8foobar
+APP1foobar
+APP10foobar
+APP6foobar
+APP1foobar
+APP1foobar
+APP4foobar
+APP9foobar
+APP1foobar
+APP3foobar
+APP10foobar
+APP10foobar
+APP9foobar
+APP3foobar
+APP9foobar
+APP2foobar
+APP2foobar
+APP8foobar
+APP5foobar
+APP5foobar
+APP1foobar
+APP4foobar
+APP5foobar
+APP9foobar
+APP9foobar
+APP8foobar
+APP10foobar
+APP6foobar
+APP1foobar
+APP6foobar
+APP1foobar
+APP10foobar
+APP6foobar
+APP1foobar
+APP7foobar
+APP5foobar
+APP2foobar
+APP6foobar
+APP3foobar
+APP6foobar
+APP8foobar
+APP9foobar
+APP2foobar
+APP5foobar
+APP1foobar
+APP1foobar
+APP7foobar
+APP6foobar
+APP9foobar
+APP7foobar
+APP6foobar
+APP9foobar
+APP10foobar
+APP5foobar
+APP10foobar
+APP4foobar
+APP9foobar
+APP3foobar
+APP9foobar
+APP3foobar
+APP10foobar
+APP3foobar
+APP2foobar
+APP5foobar
+APP6foobar
+APP8foobar
+APP2foobar
+APP6foobar
+APP6foobar
+APP5foobar
+APP3foobar
+APP6foobar
+APP7foobar
+APP9foobar
+APP4foobar
+APP6foobar
+APP2foobar
+APP6foobar
+APP6foobar
+APP10foobar
+APP2foobar
+APP8foobar
+APP10foobar
+APP5foobar
+APP3foobar
+APP7foobar
+APP9foobar
+APP3foobar
+APP8foobar
+APP2foobar
+APP2foobar
+APP4foobar
+APP4foobar
+APP10foobar
+APP6foobar
+APP2foobar
+APP6foobar
+APP1foobar
+APP1foobar
+APP8foobar
+APP4foobar
+APP2foobar
+APP8foobar
+APP5foobar
+APP1foobar
+APP5foobar
+APP3foobar
+APP7foobar
+APP4foobar
+APP1foobar
+APP8foobar
+APP1foobar
+APP4foobar
+APP6foobar
+APP4foobar
+APP6foobar
+APP7foobar
+APP2foobar
+APP1foobar
+APP2foobar
+APP4foobar
+APP8foobar
+APP5foobar
+APP4foobar
+APP7foobar
+APP4foobar
+APP2foobar
+APP2foobar
+APP6foobar
+APP10foobar
+APP1foobar
+APP8foobar
+APP4foobar
+APP5foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP10foobar
+APP8foobar
+APP3foobar
+APP4foobar
+APP10foobar
+APP2foobar
+APP3foobar
+APP5foobar
+APP1foobar
+APP4foobar
+APP10foobar
+APP5foobar
+APP2foobar
+APP7foobar
+APP1foobar
+APP1foobar
+APP2foobar
+APP1foobar
+APP5foobar
+APP6foobar
+APP5foobar
+APP10foobar
+APP10foobar
+APP1foobar
+APP9foobar
+APP7foobar
+APP10foobar
+APP10foobar
+APP2foobar
+APP5foobar
+APP10foobar
+APP3foobar
+APP2foobar
+APP9foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP7foobar
+APP8foobar
+APP8foobar
+APP5foobar
+APP3foobar
+APP4foobar
+APP1foobar
+APP4foobar
+APP10foobar
+APP6foobar
+APP7foobar
+APP1foobar
+APP2foobar
+APP9foobar
+APP6foobar
+APP6foobar
+APP3foobar
+APP5foobar
+APP8foobar
+APP5foobar
+APP7foobar
+APP5foobar
+APP2foobar
+APP10foobar
+APP9foobar
+APP3foobar
+APP2foobar
+APP3foobar
+APP6foobar
+APP9foobar
+APP3foobar
+APP6foobar
+APP5foobar
+APP3foobar
+APP4foobar
+APP7foobar
+APP8foobar
+APP5foobar
+APP2foobar
+APP2foobar
+APP8foobar
+APP2foobar
+APP3foobar
+APP3foobar
+APP6foobar
+APP7foobar
+APP3foobar
+APP2foobar
+APP4foobar
+APP2foobar
+APP8foobar
+APP10foobar
+APP8foobar
+APP1foobar
+APP10foobar
+APP1foobar
+APP9foobar
+APP7foobar
+APP6foobar
+APP10foobar
+APP7foobar
+APP4foobar
+APP4foobar
+APP4foobar
+APP3foobar
+APP8foobar
+APP1foobar
+APP10foobar
+APP6foobar
+APP9foobar
+APP9foobar
+APP9foobar
+APP10foobar
+APP1foobar
+APP10foobar
+APP3foobar
+APP6foobar
+APP3foobar
+APP3foobar
+APP5foobar
+APP6foobar
+APP4foobar
+APP6foobar
+APP4foobar
+APP2foobar
+APP1foobar
+APP6foobar
+APP10foobar
+APP9foobar
+APP5foobar
+APP4foobar
+APP2foobar
+APP3foobar
+APP1foobar
+APP3foobar
+APP2foobar
+APP10foobar
+APP1foobar
+APP9foobar
+APP6foobar
+APP2foobar
+APP3foobar
+APP8foobar
+APP1foobar
+APP7foobar
+APP4foobar
+APP8foobar
+APP8foobar
+APP9foobar
+APP4foobar
+APP4foobar
+APP1foobar
+APP2foobar
+APP1foobar
+APP3foobar
+APP10foobar
+APP6foobar
+APP3foobar
+APP8foobar
+APP1foobar
+APP1foobar
+APP9foobar
+APP10foobar
+APP9foobar
+APP3foobar
+APP4foobar
+APP9foobar
+APP4foobar
+APP1foobar
+APP1foobar
+APP8foobar
+APP9foobar
+APP7foobar
+APP6foobar
+APP4foobar
+APP7foobar
+APP6foobar
+APP1foobar
+APP3foobar
+APP2foobar
+APP3foobar
+APP5foobar
+APP5foobar
+APP10foobar
+APP5foobar
+APP4foobar
+APP4foobar
+APP8foobar
+APP6foobar
+APP2foobar
+APP1foobar
+APP2foobar
+APP4foobar
+APP7foobar
+APP2foobar
+APP9foobar
+APP1foobar
+APP10foobar
+APP4foobar
+APP3foobar
+APP9foobar
+APP4foobar
+APP6foobar
+APP5foobar
+APP1foobar
+APP2foobar
+APP3foobar
+APP2foobar
+APP3foobar
+APP5foobar
+APP7foobar
+APP1foobar
+APP6foobar
+APP5foobar
+APP2foobar
+APP3foobar
+APP5foobar
+APP1foobar
+APP10foobar
+APP10foobar
+APP2foobar
+APP7foobar
+APP2foobar
+APP8foobar
+APP6foobar
+APP3foobar
+APP4foobar
+APP5foobar
+APP8foobar
+APP3foobar
+APP5foobar
+APP6foobar
+APP3foobar
+APP2foobar
+APP3foobar
View
10,000 hdfs-partitioning/app1to10-10000.txt
10,000 additions, 0 deletions not shown
View
1,000,000 hdfs-partitioning/app1to10-1000000.txt
1,000,000 additions, 0 deletions not shown
View
100,000 hdfs-partitioning/counters-100000.txt
100,000 additions, 0 deletions not shown
View
7,500 hdfs-partitioning/counters-7500.txt
@@ -0,0 +1,7500 @@
+XXX1
+XXX2
+XXX3
+XXX4
+XXX5
+XXX6
+XXX7
+XXX8
+XXX9
+XXX10
+XXX11
+XXX12
+XXX13
+XXX14
+XXX15
+XXX16
+XXX17
+XXX18
+XXX19
+XXX20
+XXX21
+XXX22
+XXX23
+XXX24
+XXX25
+XXX26
+XXX27
+XXX28
+XXX29
+XXX30
+XXX31
+XXX32
+XXX33
+XXX34
+XXX35
+XXX36
+XXX37
+XXX38
+XXX39
+XXX40
+XXX41
+XXX42
+XXX43
+XXX44
+XXX45
+XXX46
+XXX47
+XXX48
+XXX49
+XXX50
+XXX51
+XXX52
+XXX53
+XXX54
+XXX55
+XXX56
+XXX57
+XXX58
+XXX59
+XXX60
+XXX61
+XXX62
+XXX63
+XXX64
+XXX65
+XXX66
+XXX67
+XXX68
+XXX69
+XXX70
+XXX71
+XXX72
+XXX73
+XXX74
+XXX75
+XXX76
+XXX77
+XXX78
+XXX79
+XXX80
+XXX81
+XXX82
+XXX83
+XXX84
+XXX85
+XXX86
+XXX87
+XXX88
+XXX89
+XXX90
+XXX91
+XXX92
+XXX93
+XXX94
+XXX95
+XXX96
+XXX97
+XXX98
+XXX99
+XXX100
+XXX101
+XXX102
+XXX103
+XXX104
+XXX105
+XXX106
+XXX107
+XXX108
+XXX109
+XXX110
+XXX111
+XXX112
+XXX113
+XXX114
+XXX115
+XXX116
+XXX117
+XXX118
+XXX119
+XXX120
+XXX121
+XXX122
+XXX123
+XXX124
+XXX125
+XXX126
+XXX127
+XXX128
+XXX129
+XXX130
+XXX131
+XXX132
+XXX133
+XXX134
+XXX135
+XXX136
+XXX137
+XXX138
+XXX139
+XXX140
+XXX141
+XXX142
+XXX143
+XXX144
+XXX145
+XXX146
+XXX147
+XXX148
+XXX149
+XXX150
+XXX151
+XXX152
+XXX153
+XXX154
+XXX155
+XXX156
+XXX157
+XXX158
+XXX159
+XXX160
+XXX161
+XXX162
+XXX163
+XXX164
+XXX165
+XXX166
+XXX167
+XXX168
+XXX169
+XXX170
+XXX171
+XXX172
+XXX173
+XXX174
+XXX175
+XXX176
+XXX177
+XXX178
+XXX179
+XXX180
+XXX181
+XXX182
+XXX183
+XXX184
+XXX185
+XXX186
+XXX187
+XXX188
+XXX189
+XXX190
+XXX191
+XXX192
+XXX193
+XXX194
+XXX195
+XXX196
+XXX197
+XXX198
+XXX199
+XXX200
+XXX201
+XXX202
+XXX203
+XXX204
+XXX205
+XXX206
+XXX207
+XXX208
+XXX209
+XXX210
+XXX211
+XXX212
+XXX213
+XXX214
+XXX215
+XXX216
+XXX217
+XXX218
+XXX219
+XXX220
+XXX221
+XXX222
+XXX223
+XXX224
+XXX225
+XXX226
+XXX227
+XXX228
+XXX229
+XXX230
+XXX231
+XXX232
+XXX233
+XXX234
+XXX235
+XXX236
+XXX237
+XXX238
+XXX239
+XXX240
+XXX241
+XXX242
+XXX243
+XXX244
+XXX245
+XXX246
+XXX247
+XXX248
+XXX249
+XXX250
+XXX251
+XXX252
+XXX253
+XXX254
+XXX255
+XXX256
+XXX257
+XXX258
+XXX259
+XXX260
+XXX261
+XXX262
+XXX263
+XXX264
+XXX265
+XXX266
+XXX267
+XXX268
+XXX269
+XXX270
+XXX271
+XXX272
+XXX273
+XXX274
+XXX275
+XXX276
+XXX277
+XXX278
+XXX279
+XXX280
+XXX281
+XXX282
+XXX283
+XXX284
+XXX285
+XXX286
+XXX287
+XXX288
+XXX289
+XXX290
+XXX291
+XXX292
+XXX293
+XXX294
+XXX295
+XXX296
+XXX297
+XXX298
+XXX299
+XXX300
+XXX301
+XXX302
+XXX303
+XXX304
+XXX305
+XXX306
+XXX307
+XXX308
+XXX309
+XXX310
+XXX311
+XXX312
+XXX313
+XXX314
+XXX315
+XXX316
+XXX317
+XXX318
+XXX319
+XXX320
+XXX321
+XXX322
+XXX323
+XXX324
+XXX325
+XXX326
+XXX327
+XXX328
+XXX329
+XXX330
+XXX331
+XXX332
+XXX333
+XXX334
+XXX335
+XXX336
+XXX337
+XXX338
+XXX339
+XXX340
+XXX341
+XXX342
+XXX343
+XXX344
+XXX345
+XXX346
+XXX347
+XXX348
+XXX349
+XXX350
+XXX351
+XXX352
+XXX353
+XXX354
+XXX355
+XXX356
+XXX357
+XXX358
+XXX359
+XXX360
+XXX361
+XXX362
+XXX363
+XXX364
+XXX365
+XXX366
+XXX367
+XXX368
+XXX369
+XXX370
+XXX371
+XXX372
+XXX373
+XXX374
+XXX375
+XXX376
+XXX377
+XXX378
+XXX379
+XXX380
+XXX381
+XXX382
+XXX383
+XXX384
+XXX385
+XXX386
+XXX387
+XXX388
+XXX389
+XXX390
+XXX391
+XXX392
+XXX393
+XXX394
+XXX395
+XXX396
+XXX397
+XXX398
+XXX399
+XXX400
+XXX401
+XXX402
+XXX403
+XXX404
+XXX405
+XXX406
+XXX407
+XXX408
+XXX409
+XXX410
+XXX411
+XXX412
+XXX413
+XXX414
+XXX415
+XXX416
+XXX417
+XXX418
+XXX419
+XXX420
+XXX421
+XXX422
+XXX423
+XXX424
+XXX425
+XXX426
+XXX427
+XXX428
+XXX429
+XXX430
+XXX431
+XXX432
+XXX433
+XXX434
+XXX435
+XXX436
+XXX437
+XXX438
+XXX439
+XXX440
+XXX441
+XXX442
+XXX443
+XXX444
+XXX445
+XXX446
+XXX447
+XXX448
+XXX449
+XXX450
+XXX451
+XXX452
+XXX453
+XXX454
+XXX455
+XXX456
+XXX457
+XXX458
+XXX459
+XXX460
+XXX461
+XXX462
+XXX463
+XXX464
+XXX465
+XXX466
+XXX467
+XXX468
+XXX469
+XXX470
+XXX471
+XXX472
+XXX473
+XXX474
+XXX475
+XXX476
+XXX477
+XXX478
+XXX479
+XXX480
+XXX481
+XXX482
+XXX483
+XXX484
+XXX485
+XXX486
+XXX487
+XXX488
+XXX489
+XXX490
+XXX491
+XXX492
+XXX493
+XXX494
+XXX495
+XXX496
+XXX497
+XXX498
+XXX499
+XXX500
+XXX501
+XXX502
+XXX503
+XXX504
+XXX505
+XXX506
+XXX507
+XXX508
+XXX509
+XXX510
+XXX511
+XXX512
+XXX513
+XXX514
+XXX515
+XXX516
+XXX517
+XXX518
+XXX519
+XXX520
+XXX521
+XXX522
+XXX523
+XXX524
+XXX525
+XXX526
+XXX527
+XXX528
+XXX529
+XXX530
+XXX531
+XXX532
+XXX533
+XXX534
+XXX535
+XXX536
+XXX537
+XXX538
+XXX539
+XXX540
+XXX541
+XXX542
+XXX543
+XXX544
+XXX545
+XXX546
+XXX547
+XXX548
+XXX549
+XXX550
+XXX551
+XXX552
+XXX553
+XXX554
+XXX555
+XXX556
+XXX557
+XXX558
+XXX559
+XXX560
+XXX561
+XXX562
+XXX563
+XXX564
+XXX565
+XXX566
+XXX567
+XXX568
+XXX569
+XXX570
+XXX571
+XXX572
+XXX573
+XXX574
+XXX575
+XXX576
+XXX577
+XXX578
+XXX579
+XXX580
+XXX581
+XXX582
+XXX583
+XXX584
+XXX585
+XXX586
+XXX587
+XXX588
+XXX589
+XXX590
+XXX591
+XXX592
+XXX593
+XXX594
+XXX595
+XXX596
+XXX597
+XXX598
+XXX599
+XXX600
+XXX601
+XXX602
+XXX603
+XXX604
+XXX605
+XXX606
+XXX607
+XXX608
+XXX609
+XXX610
+XXX611
+XXX612
+XXX613
+XXX614
+XXX615
+XXX616
+XXX617
+XXX618
+XXX619
+XXX620
+XXX621
+XXX622
+XXX623
+XXX624
+XXX625
+XXX626
+XXX627
+XXX628
+XXX629
+XXX630
+XXX631
+XXX632
+XXX633
+XXX634
+XXX635
+XXX636
+XXX637
+XXX638
+XXX639
+XXX640
+XXX641
+XXX642
+XXX643
+XXX644
+XXX645
+XXX646
+XXX647
+XXX648
+XXX649
+XXX650
+XXX651
+XXX652
+XXX653
+XXX654
+XXX655
+XXX656
+XXX657
+XXX658
+XXX659
+XXX660
+XXX661
+XXX662
+XXX663
+XXX664
+XXX665
+XXX666
+XXX667
+XXX668
+XXX669
+XXX670
+XXX671
+XXX672
+XXX673
+XXX674
+XXX675
+XXX676
+XXX677
+XXX678
+XXX679
+XXX680
+XXX681
+XXX682
+XXX683
+XXX684
+XXX685
+XXX686
+XXX687
+XXX688
+XXX689
+XXX690
+XXX691
+XXX692
+XXX693
+XXX694
+XXX695
+XXX696
+XXX697
+XXX698
+XXX699
+XXX700
+XXX701
+XXX702
+XXX703
+XXX704
+XXX705
+XXX706
+XXX707
+XXX708
+XXX709
+XXX710
+XXX711
+XXX712
+XXX713
+XXX714
+XXX715
+XXX716
+XXX717
+XXX718
+XXX719
+XXX720
+XXX721
+XXX722
+XXX723
+XXX724
+XXX725
+XXX726
+XXX727
+XXX728
+XXX729
+XXX730
+XXX731
+XXX732
+XXX733
+XXX734
+XXX735
+XXX736
+XXX737
+XXX738
+XXX739
+XXX740
+XXX741
+XXX742
+XXX743
+XXX744
+XXX745
+XXX746
+XXX747
+XXX748
+XXX749
+XXX750
+XXX751
+XXX752
+XXX753
+XXX754
+XXX755
+XXX756
+XXX757
+XXX758
+XXX759
+XXX760
+XXX761
+XXX762
+XXX763
+XXX764
+XXX765
+XXX766
+XXX767
+XXX768
+XXX769
+XXX770
+XXX771
+XXX772
+XXX773
+XXX774
+XXX775
+XXX776
+XXX777
+XXX778
+XXX779
+XXX780
+XXX781
+XXX782
+XXX783
+XXX784
+XXX785
+XXX786
+XXX787
+XXX788
+XXX789
+XXX790
+XXX791
+XXX792
+XXX793
+XXX794
+XXX795
+XXX796
+XXX797
+XXX798
+XXX799
+XXX800
+XXX801
+XXX802
+XXX803
+XXX804
+XXX805
+XXX806
+XXX807
+XXX808
+XXX809
+XXX810
+XXX811
+XXX812
+XXX813
+XXX814
+XXX815
+XXX816
+XXX817
+XXX818
+XXX819
+XXX820
+XXX821
+XXX822
+XXX823
+XXX824
+XXX825
+XXX826
+XXX827
+XXX828
+XXX829
+XXX830
+XXX831
+XXX832
+XXX833
+XXX834
+XXX835
+XXX836
+XXX837
+XXX838
+XXX839
+XXX840
+XXX841
+XXX842
+XXX843
+XXX844
+XXX845
+XXX846
+XXX847
+XXX848
+XXX849
+XXX850
+XXX851
+XXX852
+XXX853
+XXX854
+XXX855
+XXX856
+XXX857
+XXX858
+XXX859
+XXX860
+XXX861
+XXX862
+XXX863
+XXX864
+XXX865
+XXX866
+XXX867
+XXX868
+XXX869
+XXX870
+XXX871
+XXX872
+XXX873
+XXX874
+XXX875
+XXX876
+XXX877
+XXX878
+XXX879
+XXX880
+XXX881
+XXX882
+XXX883
+XXX884
+XXX885
+XXX886
+XXX887
+XXX888
+XXX889
+XXX890
+XXX891
+XXX892
+XXX893
+XXX894
+XXX895
+XXX896
+XXX897
+XXX898
+XXX899
+XXX900
+XXX901
+XXX902
+XXX903
+XXX904
+XXX905
+XXX906
+XXX907
+XXX908
+XXX909
+XXX910
+XXX911
+XXX912
+XXX913
+XXX914
+XXX915
+XXX916
+XXX917
+XXX918
+XXX919
+XXX920
+XXX921
+XXX922
+XXX923
+XXX924
+XXX925
+XXX926
+XXX927
+XXX928
+XXX929
+XXX930
+XXX931
+XXX932
+XXX933
+XXX934
+XXX935
+XXX936
+XXX937
+XXX938
+XXX939
+XXX940
+XXX941
+XXX942
+XXX943
+XXX944
+XXX945
+XXX946
+XXX947
+XXX948
+XXX949
+XXX950
+XXX951
+XXX952
+XXX953
+XXX954
+XXX955
+XXX956
+XXX957
+XXX958
+XXX959
+XXX960
+XXX961
+XXX962
+XXX963
+XXX964
+XXX965
+XXX966
+XXX967
+XXX968
+XXX969
+XXX970
+XXX971
+XXX972
+XXX973
+XXX974
+XXX975
+XXX976
+XXX977
+XXX978
+XXX979
+XXX980
+XXX981
+XXX982
+XXX983
+XXX984
+XXX985
+XXX986
+XXX987
+XXX988
+XXX989
+XXX990
+XXX991
+XXX992
+XXX993
+XXX994
+XXX995
+XXX996
+XXX997
+XXX998
+XXX999
+XXX1000
+XXX1001
+XXX1002
+XXX1003
+XXX1004
+XXX1005
+XXX1006
+XXX1007
+XXX1008
+XXX1009
+XXX1010
+XXX1011
+XXX1012
+XXX1013
+XXX1014
+XXX1015
+XXX1016
+XXX1017
+XXX1018
+XXX1019
+XXX1020
+XXX1021
+XXX1022
+XXX1023
+XXX1024
+XXX1025
+XXX1026
+XXX1027
+XXX1028
+XXX1029
+XXX1030
+XXX1031
+XXX1032
+XXX1033
+XXX1034
+XXX1035
+XXX1036
+XXX1037
+XXX1038
+XXX1039
+XXX1040
+XXX1041
+XXX1042
+XXX1043
+XXX1044
+XXX1045
+XXX1046
+XXX1047
+XXX1048
+XXX1049
+XXX1050
+XXX1051
+XXX1052
+XXX1053
+XXX1054
+XXX1055
+XXX1056
+XXX1057
+XXX1058
+XXX1059
+XXX1060
+XXX1061
+XXX1062
+XXX1063
+XXX1064
+XXX1065
+XXX1066
+XXX1067
+XXX1068
+XXX1069
+XXX1070
+XXX1071
+XXX1072
+XXX1073
+XXX1074
+XXX1075
+XXX1076
+XXX1077
+XXX1078
+XXX1079
+XXX1080
+XXX1081
+XXX1082
+XXX1083
+XXX1084
+XXX1085
+XXX1086
+XXX1087
+XXX1088
+XXX1089
+XXX1090
+XXX1091
+XXX1092
+XXX1093
+XXX1094
+XXX1095
+XXX1096
+XXX1097
+XXX1098
+XXX1099
+XXX1100
+XXX1101
+XXX1102
+XXX1103
+XXX1104
+XXX1105
+XXX1106
+XXX1107
+XXX1108
+XXX1109
+XXX1110
+XXX1111
+XXX1112
+XXX1113
+XXX1114
+XXX1115
+XXX1116
+XXX1117
+XXX1118
+XXX1119
+XXX1120
+XXX1121
+XXX1122
+XXX1123
+XXX1124
+XXX1125
+XXX1126
+XXX1127
+XXX1128
+XXX1129
+XXX1130
+XXX1131
+XXX1132
+XXX1133
+XXX1134
+XXX1135
+XXX1136
+XXX1137
+XXX1138
+XXX1139
+XXX1140
+XXX1141
+XXX1142
+XXX1143
+XXX1144
+XXX1145
+XXX1146
+XXX1147
+XXX1148
+XXX1149
+XXX1150
+XXX1151
+XXX1152
+XXX1153
+XXX1154
+XXX1155
+XXX1156
+XXX1157
+XXX1158
+XXX1159
+XXX1160
+XXX1161
+XXX1162
+XXX1163
+XXX1164
+XXX1165
+XXX1166
+XXX1167
+XXX1168
+XXX1169
+XXX1170
+XXX1171
+XXX1172
+XXX1173
+XXX1174
+XXX1175
+XXX1176
+XXX1177
+XXX1178
+XXX1179
+XXX1180
+XXX1181
+XXX1182
+XXX1183
+XXX1184
+XXX1185
+XXX1186
+XXX1187
+XXX1188
+XXX1189
+XXX1190
+XXX1191
+XXX1192
+XXX1193
+XXX1194
+XXX1195
+XXX1196
+XXX1197
+XXX1198
+XXX1199
+XXX1200
+XXX1201
+XXX1202
+XXX1203
+XXX1204
+XXX1205
+XXX1206
+XXX1207
+XXX1208
+XXX1209
+XXX1210
+XXX1211
+XXX1212
+XXX1213
+XXX1214
+XXX1215
+XXX1216
+XXX1217
+XXX1218
+XXX1219
+XXX1220
+XXX1221
+XXX1222
+XXX1223
+XXX1224
+XXX1225
+XXX1226
+XXX1227
+XXX1228
+XXX1229
+XXX1230
+XXX1231
+XXX1232
+XXX1233
+XXX1234
+XXX1235
+XXX1236
+XXX1237
+XXX1238
+XXX1239
+XXX1240
+XXX1241
+XXX1242
+XXX1243
+XXX1244
+XXX1245
+XXX1246
+XXX1247
+XXX1248
+XXX1249
+XXX1250
+XXX1251
+XXX1252
+XXX1253
+XXX1254
+XXX1255
+XXX1256
+XXX1257
+XXX1258
+XXX1259
+XXX1260
+XXX1261
+XXX1262
+XXX1263
+XXX1264
+XXX1265
+XXX1266
+XXX1267
+XXX1268
+XXX1269
+XXX1270
+XXX1271
+XXX1272
+XXX1273
+XXX1274
+XXX1275
+XXX1276
+XXX1277
+XXX1278
+XXX1279
+XXX1280
+XXX1281
+XXX1282
+XXX1283
+XXX1284
+XXX1285
+XXX1286
+XXX1287
+XXX1288
+XXX1289
+XXX1290
+XXX1291
+XXX1292
+XXX1293
+XXX1294
+XXX1295
+XXX1296
+XXX1297
+XXX1298
+XXX1299
+XXX1300
+XXX1301
+XXX1302
+XXX1303
+XXX1304
+XXX1305
+XXX1306
+XXX1307
+XXX1308
+XXX1309
+XXX1310
+XXX1311
+XXX1312
+XXX1313
+XXX1314
+XXX1315
+XXX1316
+XXX1317
+XXX1318
+XXX1319
+XXX1320
+XXX1321
+XXX1322
+XXX1323
+XXX1324
+XXX1325
+XXX1326
+XXX1327
+XXX1328
+XXX1329
+XXX1330
+XXX1331
+XXX1332
+XXX1333
+XXX1334
+XXX1335
+XXX1336
+XXX1337
+XXX1338
+XXX1339
+XXX1340
+XXX1341
+XXX1342
+XXX1343
+XXX1344
+XXX1345
+XXX1346
+XXX1347
+XXX1348
+XXX1349
+XXX1350
+XXX1351
+XXX1352
+XXX1353
+XXX1354
+XXX1355
+XXX1356
+XXX1357
+XXX1358
+XXX1359
+XXX1360
+XXX1361
+XXX1362
+XXX1363
+XXX1364
+XXX1365
+XXX1366
+XXX1367
+XXX1368
+XXX1369
+XXX1370
+XXX1371
+XXX1372
+XXX1373
+XXX1374
+XXX1375
+XXX1376
+XXX1377
+XXX1378
+XXX1379
+XXX1380
+XXX1381
+XXX1382
+XXX1383
+XXX1384
+XXX1385
+XXX1386
+XXX1387
+XXX1388
+XXX1389
+XXX1390
+XXX1391
+XXX1392
+XXX1393
+XXX1394
+XXX1395
+XXX1396
+XXX1397
+XXX1398
+XXX1399
+XXX1400
+XXX1401
+XXX1402
+XXX1403
+XXX1404
+XXX1405
+XXX1406
+XXX1407
+XXX1408
+XXX1409
+XXX1410
+XXX1411
+XXX1412
+XXX1413
+XXX1414
+XXX1415
+XXX1416
+XXX1417
+XXX1418
+XXX1419