分类 Tools 下的文章

Hadoop streaming 排序工具初探

通常使用 KeyFieldBasePartitionerKeyFieldBaseComparator 来对用户输出key进行排序和分桶。

基本概念

Partition:分桶,用户输出的key经过partition分发到不同的reduce里,因而partitioner就是分桶器,一般用平台默认的hash分桶,也可以自己指定。

Key:是需要排序的字段,相同Partition && 相同key的行排序到一起。

bin/hadoop streaming \
-input /tmp/comp-test.txt \
-output /tmp/xx -mapper cat -reducer cat \
-jobconf stream.num.map.output.key.fields=2 \
-jobconf stream.map.output.field.separator=. \
-jobconf mapred.reduce.tasks=5

上面案例中map输出中会按.分割,以前两列作为key,相同的key会分到同一个reduce中。

stream.num.map.output.key.fields 设置map输出的前几个字段作为key
stream.map.output.field.separator 设置map输出的字段分隔符

KeyFieldBasePartitioner

该配置主要用于分桶

map.output.key.field.separator 设置key内的字段分隔符
num.key.fields.for.partition 设置key内前几个字段用来做partition
mapred.text.key.partitioner.options 设置key内某个字段或者某个字段范围用做partition(优先级比num.key.fields.for.partition低)

KeyFieldBaseComparator

该配置主要用于排序

mapred.text.key.comparator.options 设置key中需要比较的字段或字节范围

hadoop-skeleton

最近工作中跑mapreduce的统计需求越来越多,而多个任务之间缺乏有效的组织管理,导致的结果就是目录结构散乱,大量的代码重复。所以我简单封装了下 hadoop streaming 任务流程,只需要做一些简单的配置即可跑一个新的任务。

项目地址:https://github.com/itsmikej/hadoop-skeleton

参考

http://www.dreamingfish123.info/?p=1102

LuaRocks Tutorial

LuaRocks 是一个 Lua 的包管理工具,提供了一个命令行的方式来管理 Lua 包依赖。官网

安装 Lua 5.1.5

wget http://www.lua.org/ftp/lua-5.1.5.tar.gz
mkdir /usr/local/lua-5.1.5 && cd lua-5.1.5
# 配置 Makefile,指定安装目录,INSTALL_TOP = /usr/local/lua-5.1.5
# aix ansi bsd freebsd generic linux macosx mingw posix solaris 支持的平台
make macosx
make macosx install
ln -sf /usr/local/lua-5.1.5/bin/lua /usr/local/bin/lua

安装 LuaRocks

wget https://luarocks.org/releases/luarocks-2.4.1.tar.gz
tar zxpf luarocks-2.4.1.tar.gz && cd luarocks-2.4.1
mkdir /usr/local/luarocks-2.4.1
./configure --prefix=/usr/local/luarocks-2.4.1 --with-lua=/usr/local/lua-5.1.5
make build  && make install

使用 LuaRocks 安装包

luarocks install dkjson
require("dkjson") 然后就可以使用了

贡献 Rock 包

创建 .rockspec 文件,下面是我写的一个名为 nginx-lua-frequency 的 Lua 模块的案例。

package = "nginx-lua-frequency"
version = "0.1-1"
source = {
   url = "git://github.com/itsmikej/nginx-lua-frequency.git"
}
description = {
   summary = "A frequency module for Nginx written in Lua",
   homepage = "https://github.com/itsmikej/nginx-lua-frequency",
   maintainer = "Jiang Yang<jiangyang33@gmail.com>",
   license = "MIT"
}
dependencies = {
   "lua=5.1",
   "lua-resty-memcached=0.13-0"
}
build = {
   type = "builtin",
   modules = {
      ["frequency"] = "src/frequency.lua",
      ["frequency.adapter.memcached"] = "src/adapter/memcached.lua"
   }
}

保存文件名为 nginx-lua-frequency-0.1-1.rockspec,格式必须是"{package}-{version}.rockspec",最后上传即可:
luarocks upload nginx-lua-frequency-0.1-1.rockspec --api-key ********
执行完这个命令后,会在当前目录生成一个名为 nginx-lua-frequency-0.1-1.src.rock 的二进制文件,其实这个文件就是当前项目的一个压缩包,使用 luarocks install 安装时,其实就是用的这个压缩包。

BTW

nginx-lua-frequency 是一个基于 memcached 的通用频率限制模块,可同时做多个时间维度(秒,分,小时)的请求频率配置。Github链接

参考

https://github.com/luarocks/luarocks/wiki/Documentation
http://www.jianshu.com/p/196b5dad4e78
https://segmentfault.com/a/1190000003920034

使用 fabric

fabric是一个用python实现的远程部署工具,它可以批量操作远程服务器。实际工作中,很多时候需要在多台线上机器上执行同样的操作,这时fabric会很有用。

安装

pip install fabric

使用(fabric.py)

# from fabric.api import cd,run,env,hosts,execute,roles
from fabric.api import *

# 远程机器,多个机器fabric会依次启动
env.hosts = [
    'user@10.16.29.176:22',
    'user@10.16.29.44:22'
]
env.password = '*******'

# 进入/home/user目录,执行命令
def test():
    with cd('/home/user'):
        run('du -sh')

# ----在不同的机器上执行不同的任务
env.roledefs = {
    'server1': [
        'user@10.16.29.176:22',
    ],
    'server2': [
        'user@10.16.29.44:22',
    ]
}
env.password = '*******'

# server1执行task1
@roles('server1')
def task1():
    run('ls /home/ -l | wc -l')

# server2执行task2
@roles('server2')
def task2():
    run('du -sh /home/user')

def test1():
    # 遇到报错警告,而不是退出
    with settings(warn_only=True):
    execute(task1)
    execute(task2)
    exit()

# ----接收参数
def hello(foo):
    print 'Hello, %s'%foo;

执行

fab test

用fabric来部署代码也是一件很爽的事情(upload.py)

# coding=utf-8
from datetime import datetime
from fabric.api import *

env.hosts = ['user@10.16.29.176:22']
env.password = '********'

# 本地打包
def pack():
    tar_files = ['*.py', 'testdir/*']
    local('rm -f deploy.tar.gz')
    local('tar -zcvf deploy.tar.gz --exclude=\'*.tar.gz\' --exclude=\'upload.py\' %s' % ' '.join(tar_files))

# 部署
def deploy():
    tmp_dir = '/tmp/deploy.tar.gz'
    put('deploy.tar.gz', tmp_dir)

    tag = datetime.now().strftime('%y.%m.%d_%H.%M.%S')
    deploy_dir = '/home/user/%s' % tag

    run('mkdir %s' % deploy_dir)
    with cd(deploy_dir):
        run('tar -zxvf %s' % tmp_dir)

    run('rm %s' % tmp_dir)

如果文件名不是fabric.py,需要指定文件名

fab -f upload.py pack
fab -f upload.py deploy

参考

分享我的 sublime text3 的配置

{
"font_face": "MONACO",
"font_size": 13,
// 增加行高
"line_padding_bottom": 1.4,
"line_padding_top": 1,
// 光标呼吸效果  可选项:"smooth", "phase", "blink", "wide" "solid"
"caret_style": "phase",
// 高亮当前行
"highlight_line": true,
// 高亮修改文件
"highlight_modified_tabs": true,
// 一直显示折叠代码的箭头
//"fade_fold_buttons": false,
// 加粗显示文件夹名称
"bold_folder_labels": true,
// 设置tab的大小为4
"tab_size": 4,
// 使用空格代替tab
"translate_tabs_to_spaces": true,
// 添加行宽标尺
"rulers": [80, 100],
// 显示空白字符
//"draw_white_space": "all",
// 保存时自动去除行末空白
//"trim_trailing_white_space_on_save": true,
// 保存时自动增加文件末尾换行
"ensure_newline_at_eof_on_save": true,
}

恩,效果感觉妥妥的。