一.Hadoop简介
- 开源的大数据框架
- 分布式计算解决方案
- HDFS+MapReduce
1.1 hadoop核心之HDFS(分布式文件系统)
- 概念
- Block 数据块: 存储单元: 默认大小:64M, 一般设置为128M, 备份x3
- NameNode 名称节点: 管理文件系统的命令空间,存放元数据
- secondry NameNode: 是NameNode的备份
- DataNode 数据节点:
- 优点
- 适合大文件存储, 支持TB\ PB级的数据存储,并有副本策略
- 可以构建在廉价的机器上, 并有一定的容错和恢复机制
- 支持流式数据访问, 一次写入, 多次读取最高效
- 缺点
- 不适合大量小文件存储
- 不适合并发写入, 不支持文件随机修改
- 不适合随机读等低延时的访问方式
- 使用shell对HDFS进行操作的常用命令
./hdfs dfs -help
: 获取命令帮助hdfs dfs -copyFromLocal /home/hadoop/mk.txt /test/
: 上传文件hdfs dfs -copyToLocal
: 下载文件hdfs -get
: 下载文件hdfs -put
: 上传文件jps
: 检查hadoop是否已经启动
- 使用python 操作HDFS,具体参考hdfs3 API文档
from hdfs3 import HDFileSystem
host = 'localhost'
port = 9000
client = HDFileSystem(host='localhost', port=9000)
1.2 hadoop核心之MapReduce(分布式并行计算系统)
- YARN (2.0之后的资源管理器)
- ResourceManager
- 分配和调度资源
- 启动并监控ApplicationMaster
- 监控NodeManager
- ApplicationMaster
- 为MR类型的程序申请资源, 并分配给内部任务
- 负责数据的切分
- 监控任务的执行及容错
- NodeManger
- 管理单个节点的资源
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令
- ResourceManager
- MapRdeuce(python示例)
- 在ipython中进行简单的示例
$ ipython
Python 3.7.3 (default, Mar 28 2019, 10:38:38) [MSC v.1915 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from functools import reduce
In [2]: l = ['a', 'bb', 'ccc']
In [3]: l_count = map(len, l)
In [4]: l_count
Out[4]: <map at 0x4a06b70>
In [5]: l_sum = reduce(lambda x, y: x+y, l_count)
In [6]: l_sum
Out[6]: 6
In [7]:
- 使用python脚本演示
# hdfs_map.py
import sys
def read_input(file):
for line in file:
yield line.split()
def main():
data = read_input(sys.stdin)
for words in data:
for word in words:
print('%s%s%d' % (word, '\t', 1))
if __name__ == '__main__':
main()
# hdfs_reduce.py
import sys
from operator import itemgetter
from itertools import groupby
def read_mapper_output(file, separator='\t'):
for line in file:
yield line.rstrip().split(separator, 1)
def main():
data = read_mapper_output(sys.stdin)
for word, group in groupby(data, itemgetter(0)):
total_count = sum(int(count) for word, count in group)
print('%s%s%d' % (word, '\t', total_count))
if __name__ == '__main__':
main()
将两个python脚本上传到hadoop框架中运行
/usr/local/hadoop/bin/hadoop \
jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar \
-files "hdfs_map.py, hdfs_reduce.py" \ # 将map和reduce两个处理逻辑上传
-input /test/mk.txt # 计划进行统计的文档内容
-output /tmp/wordcounttest # 结果输出的目录
-mapper "python3 hdfs_map.py" # mapper 处理逻辑
-reduce "python3 hdfs_reduce.py" # reduce 处理逻辑
版权声明:本文为weixin_39791387原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。