Hadoop streaming是和hadoop一起发布的实用程序,它允许用户创建和执行使用任何程序或者脚本编写的map或者reduce的mapreducejobs。如果你不熟悉Java或者C++,你可以使用Python/shell/PHP标准输入输出流非常方便的创建Hadoop任务。

1、Streaming原理
Hadoop Streaming 使用了 Unix 的标准输入输出作为 Hadoop 和其他编程语言的开发接口,因此在其他的编程语言所写的程序中,只需要将标准输入作为程序的输入,将标准输出作为程序的输出就可以了。mapper和 reducer都是能够从stdin逐行(line by line)读取输入的可执行文件,然后把处理完的结果发送到stdout。这个实用工具将会创建 一个Map/Reduce作业,并将作业提交到适当的集群,监控作业的运行进度直到作业运行完成。用法如下:

Usage: $HADOOP_HOME/bin/hadoop jar \
$HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar [options]
options:
(1)-input:输入文件路径
(2)-output:输出文件路径
(3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本
(4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本
(5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。
(8)-D:作业的一些属性(以前用的是-jonconf)

2、Python Mapper
相必大家对Hadoop原理已经了解了,下面以Python为例编写streaming MR任务。Mapper主要功能是解析原始数据,输出预期的Key=>value,在Python里面直接print即可。

import json
import sys

# 从标准输入中读数据
for line in sys.stdin:
    if not line:
        continue
    val = line.strip()
    if val:
        testlist= val.split("\t")
        if len(testlist) == 3:
            detail = {
                'v1': testlist[0],
                'v2': int(testlist[1])
            }
            # 标准输出数据
            print "%s\t%s" % (testlist[0], json.dumps(detail))

- 阅读剩余部分 -

Hadoop pipes 是 Hadoop MapReduce 的 C++ 的接口代称。不同于使用标准输入和输出来实现 map 代码和reduce 代码之间的 Streaming。Pipes 使用套接字 socket 作为 tasktracker 与 C++版本函数的进程间的通讯,与 Streaming 不同,Pipes 是 Socket 通讯,Streaming 是标准输入输出。

1、Pipes架构设计
Hadoop-pipes-arch.jpg

Hadoop pipes允许用户用C++编写五个基本组件:mapper,reducer,partitioner,combiner,recordReader,这五个组件可以是Java编写的,也可以是C++编写的。

2、Mapper编写

#include "Pipes.hh"
#include "TemplateFactory.hh"
#include "StringUtils.hh"

class UBCMapper : public HadoopPipes::Mapper {
public:
    UBCMapper(HadoopPipes::TaskContext &context) {
    }
    void map(HadoopPipes::MapContext &context) {
        // 获取input中的一行数据
        std::string line = context.getInputValue();
        std::vector<std::string> split = HadoopUtils::splitString(line, "\t");
        if (split.size() == 8) {
            // 转化成新的keys-value
            context.emit(split[3], split[2]);
        }
    }
};

HadoopUtils提供了丰富的工具函数,包括字符串分割、字符串数值互转等。这里需要注意的是,字符串数值互转只支持32位长度,如果数值字符串长度较长,使用HadoopUtils转换会溢出,推荐使用boost将字符转为int64_t:

// string=>uint64_t
boost::lexical_cast<uint64_t>(str)
// uint64_t=>string
 std::stringstream ss;
ss << count;
std::cout<<ss.str();

- 阅读剩余部分 -

创建centos镜像,后端开发测试环境容器化,解决多个项目并行开发时资源不足,并且各容器间资源隔离,使用时即时申请、开发完即时释放,提高机器资源利用率。

1、查看镜像

docker images

2、启动容器

docker run -itd -p 8081:8290 --name test registry.xxx.com/centos6u3:1.1 /bin/bash
// 启动参数
// -p 8081:8290 host-container端口映射
// -d 以守护进程方式运行
// -t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开
// --name 设置container容器名

3、登录容器

docker attach c0b204c34730
// c0b204c34730为docker ps容器id

注意:退出容器需要ctrl+p、ctrl+q(容器仍在后台run),不能使用exit或者ctrl+c,这样会stop容器。

4、停止/销毁容器

// stop
docker stop c0b204c34730
// delete
docker rm c0b204c34730

5、文件拷贝
容器启动时通过-v将host目录挂载到容器/mnt,例如:

docker run -itd -v /home/work:/mnt registry.xxx.com/centos6u3:1.1 /bin/bash

6、保存修改

docker commit -m "update" c0b204c34730 registry.xxx.com/centos6u3:1.2
docker push registry.xxx.com/centos6u3:1.2

使用Nginx的反向代理可实现服务端负载均衡SLB(Server Load Balancing),本文介绍几种常用的Nginx软负载方法。

1、负载均衡

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

SLB的定义引用自伯乐在线一篇文章:http://blog.jobbole.com/97957/,废话不多说,下面几节介绍Nginx实现软负载方法。

2、默认轮询
Nginx配置文件http作用域定义upstream:

upstream test{
    server 10.69.12.10:8010;
    server 10.69.12.12:8010;
    server 10.69.12.14:8010;
}

server作用域Location:

Location /{
    proxy_pass http://test;
    ...
}

- 阅读剩余部分 -

前段时间经常使用的一款APP无秘下架了,伤感(。_。) ,于是想开发一款类似的APP。自己对后端还算熟悉,但是没有客户端的实际开发经验。开发语言Java & OC(Swift)也不熟悉,于是这时我有两个选择,学习Andorid还是iOS,正好身边有iOS开发大牛,另外苹果推行的Swift语言语法不像OC那么别扭(Swift语法特别像Golang,好感+1),加上平时使用的iOS应用体验比Android要好不少,于是选择了学习使用Swift语言开发iOS应用,这里记录初学者使用Swift开发iOS应用的体验。

一、开发工具
毋庸置疑,选择苹果官方的Xcode8,尽量选择最新版本,苹果每次升级iOS的时候都会升级Xode,避免最新版本iOS没法调试,所以最好安装最新版本Xcode。市场上虽然有AppCode、Qt第三方IDE可以开发iOS应用,毕竟不是官方开发的,新人避免入坑,所以使用Xcode。

二、创建工程
选择iOS,Single View App,语言选择Swift,ProductName填写App名字(后面可以更改),一路Next创建工程。

三、目录结构
我认为学习一门新的开发框架,首先需要整体了解工程结构、每个目录文件的存放的什么,这样有利于进一步深入学习。以创建工程名为LoveFinder为例,有如下文件夹:

  • LoveFinder:项目代码,AppDelegate.swift为工程生命周期文件、ViewController.swift文件为UI中View关联的Controller、Main.storyboard为APP 主界面UI文件(可以实现控件的拖拽、可包含多个View)、LunchScreen.storyboard为APP启动UI文件、Info.plist为APP配置信息,比如productName,还可以加入自己的dict,比如Http API接口配置等
  • LoveFinderTests:单侧
  • LoveFinderUITests:UI单测,Tests暂时不需要太多了解
  • Products:APP产出信息

最重要的是LoveFinder源代码目录,搞清里面文件功能关系就ok了。

- 阅读剩余部分 -