PyHusky接口功能及实例介绍

这里假设已经在集群上成功部署了Husky并且已为PyHusky编译成功所需的后端运用程序Master和Daemon。假如情况不是这样,可以参考PyHusky快速开始

#首先启动Master:
./Master conf/myhusky.conf 
#在另一个窗口,if配置文件myhusky.conf指向单机环境,则如下启动单机Daemon:
./Daemon conf/myhusky.conf 
#如若要启动分布式环境,则需将配置文件指定多机模式,则可如下启动:
./exec.sh Daemon conf/myhusky.conf 
#最后在第三个窗口可以直接运行.py程序,如跑wc.py便可按以下格式启动:
python wc.py --host <master_host> --port <master_port>
#或者也可以使用PyHusky提供的交互界面:
bindings/pyhusky.sh --host <master_host> --port <master_port>

为了方便试验,下面我们开启交互式界面,并且以分布式模式启动worker5-worker19总共15台机群,运行环境分别如下图。

开启Master,端口14925:

切换到另一个窗口开启Daemon,启动worker5到worker19:


在第三个窗口开启交互式界面,这里host是master,对应port是14925:


PyHusky支持三类运算符,分别是Load、Transformation和Action。PyHusky采用了lazy evaluation,为了避免不必要的运算和提高性能,只有Action操作时才会真正触发运算。

第一步,加载数据。我们有两种方法,分别是针对文件格式和Python list格式转化成PyHuskyList的。例如如果是加载文件数据:

我们从HDFS上加载数据数据test.txt,使用LineInputFormat(每行成为PyHuskyList的一个元素),返回一个PyhuskyList。先写个测试文件,内容如下:


使用env包中的load(url)方法便可以方便的读取HDFS中的文件数据,如下,其中collect()收集各个PyHuskyList分片的数据,返回Python list到前端,所以collect()是一个Action类的操作法


另外,可以使用parallelize(list), 将一个Python list划分到不同机器上,返回PyHuskyList。


目前为止,学习了三个运算符,load(url),parallelize(list)collect()。其中前两者是开始时用来加载数据的,他们的数据来源不同,但产生的结果相同。load('url')读取HDFS文件中每行的数据形成对应的PyHuskyList的一个元素;parallelize(list)则直接将Python list分配到不同机器上,返回PyHuskyList。注意到目前只有collect()是Action运算符,因为前两者数据加载时并没有直接触发计算。


第二步,Transformation。这是数据分析的利器,有了这些方法才使得高效得将数据转化成各种我们需要的样式成为可能,所以要重点了解以便更好地运用。其中,按照是否会导致网络传输,我们可以将其分为无网络传输的simple transformation和产生网络传输的shuffle transformation。由于网络传输的效率较低,所以shuffle transformation相对来说需要更长的时间。目前有5种运算符属于simple transformation,分别是map(func)flat_map(func)filter(func)map_partition(func)concat(pyhuskylist)

1.1 map(func) 是一种简单的映射,针对PyHuskyList的每一个元素调用func函数,返回一个新的数据替换原来的元素。由于新元素仅与原元素和func函数决定,与其它元素并没有任何关系,所以map(func)是不需要网络传输的simple transformation。下面我们可以自由设计func函数便可以为所欲为了:


1.2 flat_map(func) 是map(func)的延伸。不同的是前者func函数返回的是一个list,这个list里面的每个元素都将成为pyhuskylist的新元素,而后者func返回一个元素。所以理论上map(func)可以做的事情flat_map(func)都可以完成:


1.3 filter(func) 过滤掉我们不需要的元素,当func函数返回为False或0时, 对应的元素将不被保留。 


1.4 map_partition(func) 顾名思义,它是对数据片(一个python list)调用func。如下图所示,将0-49这50个python list元素划分到不同机器上,返回PyHuskyList。为了方便观察结果,这里我们的15台机器中,每台开启单线程,所以将会有15*1个数据片。下面使用了一个新的Action运算符topk(k, key=None, reverse=False),它能返回PyHuskyList的前k个元素。由结果还能看出 parallelize(pythonlist) 是按序循环

python list分配到每个数据片的。


1.5 concat(pyhuskylist) 可以将两个PyHuskyList合二为一。以下的count()是一个Action类运算符,可以返回PyHuskyList元素的个数。由于line1中有3个元素,line2有5个,故而调用concat结合两者得到的新的line1_2一共有8个元素。



以上5个运算符map(func)flat_map(func)filter(func)map_partition(func)concat(pyhuskylist)的运算都是基于独立的数据片上,故而不会产生网络传输。接下来我们要了解的shuffle transformation运算符由于需要不同数据片上的信息交流,故而才引起网络传输。它们呢分别是distinct()group_by_key()count_by_key()reduce_by_key(func)difference(other_pyhuskylist)。中间三个运算符都与key相关,所以下面先设置一个有几个key:value对的line_k以便后继测试:

2.1 distinct() 可以对PyHuskyList元素去重,如下便是去掉了('b',3)的重复项,由于它们位于不同的数据片,要获得是否重复的信息需要不同数据片上信息的交流,因而产生网络传输:


2.2 group_by_key()对集群上拥有相同key的元素进行分组,返回由(key,[v1,v2,...])组成的PyHuskyList:


2.3 count_by_key() 按key分组,计算同一key的对数num,返回由(key , num)组成的PyHuskyList:


2.4 reduce_by_key(func) 按key分组,对每个分组执行func函数聚集v,例如求和:


2.5 difference(other_pyhuskylist) 返回一个不包含other_pyhuskylist元素的新PyHuskyList:


到此为止,我们学习了10个Transformation类运算符,其中simple transformation和shuffle transformation各有5个。它们简洁高效,在实际中可以利用它们来非常灵活有效地对数据进行计算分析。

最后,我们介绍PyHusky支持的Action操作符,前面我们已经了解到count()collect()topk(k, key=None, reverse=False)的作用,它们三者都属于能触发计算的Action操作。剩余的Action操作符有:

1. 分别用于缓存PyHuskyList元素和取消缓存的cache(),uncache()

2. 判断PyHuskyList是否含有元素的empty(), 含有返回True,否则False。

3. 输出PyHuskyList全部元素到前端控制台的output()

4.write_to_hdfs(url) 可以将PyHuskyList写到HDFS路径为url的文件下面。

5.reduce(func) 按func函数聚集PyHuskyList中的元素,返回一终值。

6.foreach(func) 对PyHuskyList每个元素执行func函数操作。

结合以上方法,以下便是一个简单的对一个文件中单词个数统计的WordCount:

#WordCount,load data from hdfs
line = ph.env.load('/datasets/corpus/bible').cache()
#caculate the number of each word
line = line.flat_map(lambda x:x.split()).map(lambda x:(x,1)).reduce_by_key(lambda x,y:x+y)
#Show Top 10 words used in the file
line.map(lambda x:(x[1],x[0])).topk(10,reverse=True)


参考:Husky中文文档-PyHusky 运算符
一些待开发的操作符...

sample(N), take(N), union, intersect, join, cartesian...

你可能感兴趣的:(运算符,Pyhusky)