python 调用 hadoop

前言:

上一篇文章 我学习使用pandas进行简单的数据分析,但是各位...... Pandas处理、分析不了TB级别数据的大数据,于是再看看Hadoop。

另附上人心不足蛇吞象 对故事一的感悟:

人的欲望是无止境的,我们每次欲求一点,欲望便增长一点。但身体是有极限的,总有一天,我们因为渴求太多,最终所有都化为飞灰。

Hadoop背景

我接触过的数据总结为3类:

1.结构化数据

关系数据中的数据,有字段进行约束;(有规则)

2.半结构化数据

HTMLXml/Json....这种数据虽然有结构,但约束不是很严格;(还有些规则可言)

3.非结构化数据

.text文本/日志....这种数据没有head、body、key这些标签标记,更没有什么字段约束;(没有规则可言)

4.如何储存海量的非结构化数据?

那么问题来了我们如何把大量的非结构化/半结构化的数据储存起来,进行高效得 分析、检索呢?

Google公司通过论文方式 提出了的解决方案;(没告诉咋实现哦!)

image

1.如何完成海量数据安全储存?

把海量数据分布式存储,不同得服务器集群节点;(分布式:以后数据越大也不怕了,可以动态扩展服务器来分解。)

2.如何对海量数据高效分析、检索?

MapReduce:编程思想 Simplified Data Processing on Large Clusters

把一个某个复杂的计算任务 --------》分割成小的任务单元----------》并行在各个节点上运行

搜集各个节点上运行结果---------》合并运行--------》二次map------>二次reduce........》直到 计算出结果位置;

5.什么是Hadoop?

有一个大神级程序员 Dong Cutting,受Google以上三篇论文的启发,用Java开发出来Hadoop,

6.python怎么调用Hadoop?

image

hadoop的MapReduce这么厉害,作为python小白我怎么调用它呢?Hadoop的调用API也叫MapReduce

一、Hadoop v2 架构图

image

二、Hadoop的运行模型

HDFS集群: data_node 数据存储节点 name_node 名称节点 、secondary_node辅助名称节点

YARN:集群资源管理

三、centos7安装Hadoop2.6.3

**1.环境准备 **

centos7中一般已经自带JDK

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@localhost zhanggen]# java -version
openjdk version "1.8.0_102" OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)</pre>

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@localhost profile.d]# yum -y install java-1.8.0-openjdk* </pre>

Centos7关闭防火墙

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld</pre>

Centos7 关闭selinux服务

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@localhost hdfs]# setenforce 1 [root@localhost hdfs]# getenforce
Enforcing
[root@localhost hdfs]# setenforce 0 [root@localhost hdfs]# getenforce
Permissive</pre>

2.下载源码包

3.编译

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@localhost bdapps]# mkdir /bdapps/ [root@localhost bdapps]# ls hadoop-2.6.2 [root@localhost bdapps]# tar -zxvf /home/zhanggen/Desktop/hadoop-2.6.2.tar.gz -C /bdapps/</pre>

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@localhost bdapps]# ln -sv /bdapps/hadoop-2.6.2 /bdapps/hadoop
‘/bdapps/hadoop’ -> ‘/bdapps/hadoop-2.6.2’</pre>

4.设置Java和Hadoop相关环境变量

image

source /etc/profile.d/hadoop.sh

image

source /etc/profile.d/java.sh

image

5.创建Hadoop用户

image

6.创建存储DataNode和 NameNode存储数据的目录

image

7.创建Hadoop存储日志的目录

PS:如果你的MapReduce任务执行失败了,去获取applicationId查看报错信息

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> yarn logs -applicationId application_1551852706740_0001 #查看任务执行日志</pre>

征服Hadoop的奥秘:首先取到程序运行日志-------》再分析日志中出现错误的原因------》解决问题

8.Hadoop主要配置文件(/bdapps/hadoop/etc/hadoop)

8.0.core-site.xml

针对NameNode IP地址 、端口(默认为8020)

image

core-site.xml

8.1.hdfs-site.xml

针对HDFS相关的属性,每一个数据块的副本数量、NN和DA存储数据的目录 step6中创建的目录。

image

hdfs-site.xml

8.2.mapred-site.xml(指定使用yarn)

指定MapReduce是单独运行 还是运行在yarn之上,Hadoop2肯定是运行在yarn之上的;见 二、Hadoop的运行模型

image

mapred-site.xml

8.3.yarn-site.xml

yarn-site.xml 用于配置YARN进程及YARN的相关属性,首先需要指定ResourceManager守护进程的主机和监听的端口,对于伪分布式模型来讲,其主机为localhost,

默认的端口为8032;其次需要指定ResourceManager使用的scheduler,以及NodeManager的辅助服务。一个简要的配置示例如下所示:

image

vim yarn-site.xml

8.4.slave文件

slave文件存储了当前集群所有slave节点的列表,对于伪分布式模型,其文件内容仅应该为localhost,这特的确是这个文件的默认值。因此,为分布式模型中,次文件的内容保持默认即可。

PS:

如果服务器/虚拟机的进程起不来请确保本地 IP和配置文件里面的IP是否已经发生变化!

8.5.格式化HDFS

在HDFS的NN启动之前需要先初始化其用于存储数据的目录。

如果hdfs-site.xml中dfs.namenode.name.dir属性指定的目录不存在,格式化命令会自动创建之;

如果事先存在,请确保其权限设置正确,此时格式操作会清除其内部的所有数据并重新建立一个新的文件系统,需要以hdfs用户的身份执行如下命令

[
复制代码

](javascript:void(0); "复制代码")

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">19/03/01 11:31:22 INFO namenode.FSImage: Allocated new BlockPoolId: BP-1276811871-127.0.0.1-1551411082356
19/03/01 11:31:22 INFO common.Storage: Storage directory /data/hadoop/hdfs/nn has been successfully formatted. 19/03/01 11:31:22 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
19/03/01 11:31:22 INFO util.ExitUtil: Exiting with status 0
19/03/01 11:31:22 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1
************************************************************/ [hdfs@localhost hadoop]$ hdfs namenode -format</pre>

[
复制代码

](javascript:void(0); "复制代码")

9.启动Hadoop

HDFS格式化完成之后就可以启动 去/bdapps/hadoop/etc/hadoop目录下启动Hadoop的5大守护进程了。

9.1.启动HDFS集群

HDFS有3个守护进程:namenode、datanode和secondarynamenode,他们都表示通过hadoop-daemon.sh脚本启动或停止。以hadoop用户执行相关命令;

image

启动HDFS集群

HDFS集群web访问接口:

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">http://127.0.0.1:50070/dfshealth.html#tab-overview</pre>

9.2启动yarn集群

切换成yarn用户:YARN有2个守护进程:resourcemanager和nodemanager,它们通过yarn-daemon.sh脚本启动或者停止。以hadoop用户执行相关命令即可。

image

启动yarn集群

yarn集群web访问接口:

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">http://127.0.0.1:8088/cluster</pre>

10.测试

使用Hadoop自带的 hadoop-mapreduce-examples-2.6.2.jar,执行MapReduce任务是否可以正常执行,如果可以就意味着安装成功了。

在执行任务是要切换到hdfs用户下

image

执行任务

image

查看任务执行结果

**11、python3调用HDFS集群API **

Hadoop安装好了;(虽说是伪分布式的
image

,如果要做分布式做好ssh免密码登录,把配置文件分发出去就好了)

但是我在网上看到python的pyhdfs模块可以调用HDFS集群的API进行上传、下载、查找....文件...于是储备下来了,也许可以用作后期 Hadoop自动化项目;

注意:在使用pyhdfs模块之前一定要确保Hadoop的配置文件都监听在外网端口并修改host文件。

|

1

|

192.168.226.142 localhost #windows hosts文件的路径 C:\WINDOWS\system32\drivers\etc\host Linux /etc/host

|

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">pip install pyhdfs -i http://pypi.douban.com/simple --trusted-host pypi.douban.com</pre>

image

使用pyhdfs模块调用HDFS集群API

四、Python3调用Hadoop MapReduce API

image

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> pip3 install mrjob -i http://pypi.douban.com/simple --trusted-host pypi.douban.com</pre>

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">hadoop fs -chown -R hadoop:hadoop /tmp #在执行MapReduce任务的时候hadoop用户会创建socket,通过jdbc访问。所以在执行你写得MapReduce之前一定要设置权限</pre>

MapReduce 任务工作流程(假设要对以下3行数据,统计词频):

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">a b c
a c
a</pre>

第1步:map 把每个字符串映射成键、值对

(a,1)(b,1)(c,1)

(a,1)(c1)

(a1)

自动shuffle & sort:

shuffle: 把相同键的 值组合成1个的列表,(洗牌:平时玩牌的时候 把手里数字/字母相同的扑克牌们,码放在一起例如3A一起,两个2一起!)

sort: 再根据键排序;

(a,[1,1,1])

(b,[1])

(c,[1,1])

第2步:shuffle and sort之后,把键相同的值放到列表了,就方便reduce的时候对值进行计算、聚合操作(sum,mean,max)了!

(a,3)

(b,1)

(c,2)

image

python3版wordCount

<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">python /MyMapReduce.py /a.txt -r hadoop #在Hadoop集群,执行Python的MapReduce任务。</pre>

image

执行结果

1.MapReduce案例

统计一下本周的报警情况

由于遗留了Zabbix报警未分类的问题,导致zabbix报警-----》转换到运维平台的工单信息---------》都是一个text字段!

image

本周报警信息

image

中国大学top10

image

求出得分前十的大学,和低消费 前十的大学

image

求唐县各乡/镇出现的最低、最高温度

image

MRStep连接多个mapper、reducer函数

image

求收入top3的行业

2.map + combine +reduce

map节点把所有集合计算的工作通过TCP协议传输到reduce节点会出现 单点负载压力的问题,所以combine出现了;

combine就是小的reduce,可以在map发送数据给reduce之前进行在map节点做初步的聚合运算,减小reduce节点的压力, 加速MapReduce任务的执行;

image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容