Monday, March 29, 2010

[Linux/Mac]package/library管理工具

Ubuntu


很好的一个reference: Ubuntu Skills

安装软件
  • 从源安装是最方便最快捷的方式. 源的设置在/etc/apt/sources.list当中.
    如果知道需要安装的包的名称, 比如叫foo. 那么安装foo只需要
    apt-get install foo
    如果不知道确切名字,只知道大概是关于foo这个东西的, 可以通过下面的命令来搜索所有关于foo的包
    apt-cache search foo
    还有时候连包都不知道, 但是只知道需要某个文件比如叫foo.c,但不清楚应该装哪个包, 这时候可以先安装apt-file
    apt-get install apt-file
    然后用apt-file来帮你找可能是哪个包有这个文件
    apt-file search foo.c
  • 也可以下载deb文件来安装
    dpkg -i foo.deb


自动更新所有过时的package
apt-get update
卸载package foo
apt-get remove foo
彻底卸载package foo (连同配置文件一起删除)
apt-get remove --purge foo
自动卸载不需要的包
apt-get autoremove
查看某个包foo的详细信息
apt-cache show foo
查看repository中package foo的版本
apt-cache policy foo
添加某个源的key
apt-key add bar.asc

安装完之后, 通常用dpkg来管理包
查看package foo所安装的文件以及路径
dpkg -L foo
显示包的信息
dpkg -s packagename
显示包括指定文件的包
dpkg -S filename
显示指定包的状态
dpkg --get-selections packagename
配置某个包
dpkg --configure packagename
配置所有的包
dpkg --configure -a


MacOS中的home brew

https://github.com/mxcl/homebrew/wiki/The-brew-command
非常好用的MacOS下的包管理软件.强烈推荐.
一个brew的cheatsheet: http://cheat.errtheblog.com/s/brew/ 一个安装包时候常遇到的问题
$ sudo brew install ruby
Cowardly refusing to `sudo brew install'
这是by design. 我的解决方法是吧brew的onwer设成root
brew install foo
brew cleanup foo

如何为brew制作Formula:Formula Cookbook

MacOS中的port

关于port的使用MacPorts Guide
安装包foo
port install foo
删除包foo
port uninstall foo
查看包foo的相关信息
port info foo
查看所有过时的包
port outdated
更新所有过时的包
port upgrade outdated
查看已经安装的包
port installed
清除所有已安装包的临时文件
port clean --all installed
彻底删除旧的包
port -f uninstall inactive
删除inactive的包
port -u uninstall
port uninstall inactive
清理foo包的中间文件(比如损坏了)
port clean foo
安装foo这个包之前先将其deactivate
port deactivate foo
port activate foo
查看foo这个包都在本机安装了哪些文件
port contents foo
查看foo这个包都依赖哪些其他包
port deps foo
查看哪些包依赖foo
port dependents foo

Hadoop Related

参考文档

收集的一些关于Hadoop的链接
Official Docs
Hadoop Quick Start (Official)
Hadoop MapReduce Tutorial using Java
Hadoop MapReduce Tutorial using Streaming
Hadoop Command Line
Jobconf parameters
Hadoop API Doc (Java)

Cluster Setup
Job Configuration的选项和默认值(有点老, 0.15的, 不过大部分没变)
Other Tutorials
Cloud 9: 关于hadoop的介绍很好很具体.有一些关于具体的programming的指导.
Hadoop Really Quick Start
Cloud computing with Linux and Apache Hadoop
The Hadoop Distributed File System

Hadoop自带工具

大部分初学者可能的问题, 先看Hadoop FAQ

DistCp

bash$ hadoop distcp hdfs://nn1:8020/foo/src1 \ 
            hdfs://nn1:8020/foo/src2 \ 
            hdfs://nn2:8020/bar/dest 

bash$ hadoop distcp -f hdfs://nn1:8020/srclist \ 
            hdfs://nn2:8020/bar/foo 

用RandomTextWriter生成随机文本
hadoop jar ${HADOOP_HOME}/hadoop-*-examples.jar randomtextwriter\
  -D test.randomtextwrite.total_bytes=52428800 \
  -D test.randomtextwrite.bytes_per_map=5242880 \
  /data/rand-text
参数test.randomtextwrite.total_bytes指定总共有多少字节要写;参数test.randomtextwrite.bytes_per_map指定每个map写多少字节.

Sort
hadoop jar ${HADOOP_HOME}/hadoop-*-examples.jar sort \
  -outKey org.apache.hadoop.io.Text \
  -outValue org.apache.hadoop.io.Text \
   /data/rand-text /data/sorted-text

Grep
hadoop jar ${HADOOP_HOME_DIR}/hadoop-*-examples.jar grep \
  /data/rand-text /data/greped-text dfs[a-z.]+' 

参数tips

reducer需要内存超过默认的1024MB的话,可以通过参数调整:
-D mapred.job.reduce.memory.mb=2048

使用Java作Hadoop MapReduce的时候,如果用到其他第三方的jar文件,用-libjars 选项来include

可以用-file选项指定需要使用的脚本
-file=myscript.sh

使用Streaming的时候,每个map task最多只能处理一个输入文件. 因此如果输入包括100个文件,则至少需要100个map.如果设定的mapred.map.tasks数目小于100,Hadoop会自动调整为100.

压缩格式的输入
当输入是gz或者是bz2文件时,不需要做特殊的处理.
-D stream.recordreader.compression=gzip

压缩格式的输出
当希望输出是压缩格式(比如.gz文件)时, 可以加上下面的选项
-D mapred.output.compress=true \
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCode

指定map以及reduce的数目
指定map数目
-D mapred.map.tasks=your_map_number
指定reduce数目
-D mapred.map.tasks=your_reduce_number
特别的,使用map only 的MapReduce job时,
-D mapred.reduce.tasks=0

使用identityMapper作为mapper或者reducer
-mapper org.apache.hadoop.mapred.lib.IdentityMapper
-reducer org.apache.hadoop.mapred.lib.IdentityReducer

Key,Value的划分
对于streaming job,需要将map的输出划分成key和value.默认的划分是第一个"\t"之前的是key,之后的是value.但是我们可以自定义分隔符,比如要用=作为分割:
-D stream.map.output.field.separator==
也可以指定第几个分隔符之前的作为key:
-D stream.num.map.output.key.fields=4

Primary, Secondary Key
Hadoop Mapreduce 默认根据key来分配reducer使得所有key一样的record都被同一个reducer处理.有时候我们希望每个record是这样的格式 (k1,k2,v), 然后所有k1(也就是primary key)一样的record被同一个reducer处理, 而这个reducer看见的所有k1的record按照k2来排序.这样的要求可以通过类似下面的代码来实现: 比如这里将map输出里每行的前2个field作为k1也就是partition参考, 而第3第4个field作为k2来排序
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-D stream.num.map.output.key.fields=4 \
-D num.key.fields.for.partition=2


输出路径可以在命令行中用${mapred.output.dir}指定或者在程序中用JobConf.setOutputPath来指定