packages feed

Holumbus-MapReduce-0.0.1: Examples/MapReduce/Sort/Sort.hs

-- ----------------------------------------------------------------------------
{- |
  Module     : Examples.MapReduce.Sort.Sort
  Copyright  : Copyright (C) 2008 Stefan Schmidt
  License    : MIT

  Maintainer : Stefan Schmidt (stefanschmidt@web.de)
  Stability  : experimental
  Portability: portable
  Version    : 0.1


-}
-- ----------------------------------------------------------------------------

module Examples.MapReduce.Sort.Sort
(
  sortAction
, sortActionMap
, namesList
, sortDemoJob
, createSortDemoFiles
)
where

import           Data.Binary

import           System.Log.Logger

import qualified Holumbus.FileSystem.FileSystem as FS

import qualified Holumbus.Data.KeyMap as KMap
import           Holumbus.MapReduce.Types


localLogger :: String
localLogger = "Examples.MapReduce.Sort.Sort"


-- ----------------------------------------------------------------------------
-- Distributed Sort
-- ----------------------------------------------------------------------------


mapSort :: ActionEnvironment -> () -> () -> (String, String) -> IO [(String, (String, String))]
mapSort _ _ _ v
  = do 
    infoM localLogger "mapSort"
    debugM localLogger $ "input: " ++ show v
    let res = [(snd v, v)]
    debugM localLogger $ "output: " ++ show res
    return res


reduceSort :: ActionEnvironment -> () -> String -> [(String, String)] -> IO (Maybe [(String, String)])
reduceSort _ _ k vs 
  = do
    infoM localLogger "reduce/combine Sort"
    debugM localLogger $ "input: " ++ k ++ " - " ++ show vs
    return (Just vs)


-- ----------------------------------------------------------------------------
-- Actions
-- ----------------------------------------------------------------------------

sortAction
  :: ActionConfiguration 
       ()                                          -- state
       () (String, String)                         -- k1, v1
       String (String, String)                     -- k2, v2
       (String, String)                            -- v3 == v2
       [(String, String)]                          -- v4
sortAction
  = (defaultActionConfiguration "SORT")
        { ac_Map     = Just mapAction
        , ac_Combine = Nothing
        , ac_Reduce  = Just reduceAction
        }
    where
      mapAction 
        = (defaultMapConfiguration mapSort)
      reduceAction
        = (defaultReduceConfiguration reduceSort)
        

sortActionMap :: ActionMap
sortActionMap
  = KMap.insert (readActionConfiguration sortAction) $
    KMap.empty


-- ----------------------------------------------------------------------------
-- DemoJob
-- ----------------------------------------------------------------------------

  
sortDemoJob :: JobInfo
sortDemoJob = 
  createJobInfoFromConfiguration
    sortAction -- action config
    ()                  -- options
    namesList           -- input (Tuples)
    []                  -- input (Files)
    1                   -- number of splitters
    2                   -- number of mappers
    1                   -- number of reducers
    1                   -- number of results
    TOTRawTuple         -- type of the result (file of raw)
    
namesList :: [((),(String, String))]
namesList
  = map (\d -> ((),d)) names
  where
  names =
   [("Abraham","Simpson"),
    ("Apu","Nahasapeemapetilon"),
    ("Waylon","Smithers"),
    ("Barney","Gumble"),
    ("Bart","Simpson"),
    ("Carl","Carlson"),
    ("Homer","Simpson"),
    ("Jacqueline","Bouvier"),
    ("Kirk","van Houten"),
    ("Lenny","Leonard"),
    ("Lionel","Hutz"),
    ("Lisa","Simpson"),
    ("Luann","van Houten"),
    ("Maggie","Simpson"),
    ("Manjula","Nahasapeemapetilon"),
    ("Marge","Simpson"),
    ("Martin","Prince"),
    ("Maude","Flanders"),
    ("Milhouse","van Houten"),
    ("Moe","Syzslak"),
    ("Montgomery","Burns"),
    ("Ned","Flanders"),
    ("Patty","Bouvier"),
    ("Rod","Flanders"),
    ("Selma","Bouvier"),
    ("Seymour","Skinner"),
    ("Todd","Flanders"),
    ("Troy","McClure")]
    

-- ----------------------------------------------------------------------------
-- DemoFiles
-- ----------------------------------------------------------------------------


createSortDemoFiles :: FS.FileSystem -> IO ()
createSortDemoFiles fs
  = do
    -- let c = S.BinaryFile (encode ("foo","a aa aaa b bb bbb"))
    -- let c = S.TextFile "harddisk file"
    let c = encode namesList
    FS.createFile "namesList.txt" c fs