Investigating the 900GB “Collection #1-5” password leaks with R
timogrossenbacher.ch
timogrossenbacher.ch
That's just 700MB of data... On my 5 year old middle-class PC this took 12 seconds with sort and uniq.
$ wc -l email30m
31000000 email30m
$ time sort email30m | uniq > email30m.uniq
real 0m11.498s
user 0m33.833s
sys 0m0.933s
$ wc -l email30m.uniq
2172320 email30m.uniq
This automatically split the task into all available CPU cores. $ time awk 'BEGIN{for(i=0; i<3100000; i+=1) for(y=0; y<10; y+= 1) print i "@gmail.com"}' > email30m.sorted
awk > email30m.sorted 8.29s user 0.82s system 97% cpu 9.352 total
$ ls -lh email30m.sorted
522M Mar 8 17:14 email30m
I didn't have your email30m dataset, so I fabricated one, mine is smaller at 522M and has less entropy, since 'm assuming everyone uses gmail & uses numbers for usernames. :) $ time shuf email30m.sorted > email30m
shuf email30m.sorted > email30m 15.58s user 1.69s system 98% cpu 17.561 total
I also shuffled the dataset, because that would be cheating. $ wc -l email30m
31000000 email30m
$ time sort email30m | uniq > email30m.uniq
sort email30m 873.55s user 4.29s system 585% cpu 2:29.98 total
uniq > email30m.uniq 4.10s user 0.34s system 2% cpu 2:29.98 total
$ wc -l email30m.uniq
3100000 email30m.uniq
I followed what you did, but it took way longer when running on my machine. $ time sort email30m.sorted | uniq > email30m.sorted.uniq
sort email30m.sorted 413.75s user 3.66s system 468% cpu 1:29.04 total
uniq > email30m.sorted.uniq 4.11s user 0.40s system 5% cpu 1:29.04 total
And just out of curiosity, it takes 1 minute 29 seconds to sort & uniq the presorted dataset.Or it could be the difference between qsort() from different libcs.
Results: http://paste.debian.net/1072430/ It took 54s to sort|uniq and 38s for the presorted dataset.
EDIT: For the unsorted dataset: 35s for `sort --parallel=8 -u` and 37s for `sort --parallel=4 -u`.
All I did was place the file in a ramdisk.
GNU sort can already utilize multiple cores, and you can override internal heuristics about whether it's going to be beneficial for one particular input or not with --parallel=N. Anyways, if multithreaded sort is available what you should probably do is replace `sort | uniq` with just `sort -u` to save some time on pipe IO.
`sort -u` is just as fast as `sort | uniq` for me but good call :)
One could of course discuss whether spark is the right tool for filtering a text file for a pattern, IMHO the post is interesting nevertheless.
The Spark program can be applied as-is for data volume 10 times or 100 times bigger without being modified.
You would have to reinvent Spark if you started from Unix tools and applied it to bigger volume of data
zgrep -A '@\[^.]\+\.ch' /path/to/collections/**/*.gz
will spit out (almost) all swiss email addresses. sprinkle some grep -v, wc and sort|uniq here and there and bob's your uncle :-)(I'm in no way trying to dismiss the efforts--my method won't get you as much detail, but is enough to find you and your friends who asked to be searched in the dumps)
"Command-line tools can be faster than your Hadoop cluster"
since we're throwing links around, the (tangentially related) Knuth vs. McIlroy saga comes to mind: https://news.ycombinator.com/item?id=15264997
Interestingly, the dumps come with a brief README file telling you... to use the zgrep and example arguments :)
Let me know when you have a solution for using command line tools for sorting through our 4PB of data in our Hadoop cluster!
Use the right tools for the right jobs :)
I had this come up recently myself. An operation was performing slowly, so I split it up to use multiple cores in parallel. Got slower. Looked at performance monitor and disk utilization was pegged at 100%, while CPU utilization was ~80% of one core. Went back to the old code, and disk utilization was still pegged at 100%, but it had a marginally higher transfer rate because it was reading one file at a time rather than several all at once. I should have examined the performance characteristics more carefully in the beginning, but I didn't, because I assumed I'm smarter than I am. Good lesson.
This is almost certainly the wrong tool for the job, unless the job is to learn how to use Spark.
Almost everything mentioned can be done on a stream including the aggregates with non of the Spark fanfare.
You could also happily do this with PipelineDB in a single SQL query.
What is the magic allure of Spark?
I think usually the argument for Spark and the like proceeds by just making the dataset bigger until whatever you’re comparing becomes absurd (e.g. command line vs Spark). It was the same deal in the map reduce days. Works like shit for 99% of datasets but it’s the best thing ever when there are no other alternatives :)