介绍
java,集群大数据处理框架,主机直接使用socket通信.
参考:https://www.runoob.com/w3cnote/hadoop-setup.html
底层组成
-
HDFS: Hadoop Distributed File System, 负责分布式存储数据
- 节点
- NameNode: 命名节点,指挥(管理)其他节点,只有一个
- DataNode: 数据节点,存储数据块(基本单位 )
- Secendary: 副命名节点,分担命名节点的压力,不能代替命名节点,可以备份数据以恢复命名节点,可以有多个
- 节点
-
MapReduce: Map Reduce, 映射和规约
docker搭建Hadoop环境
-
环境window 7准备:
- docker toolbox
- 问题:https://blog.csdn.net/CSDN_duomaomao/article/details/73028390
-
打开docker toolbox: 进入安装目录,打开start.sh
-
安装centos:8,版本为8, 命令:
- 安装: docker pull centos:8
- 查看: docker images
- 启动: docker run -d --name java_ssh_proto --privilege centos:8 /usr/sbin/init
- -d: 后台运行
- –name: 容器名称
- –privilege: 进入容器内,登陆的用户拥有root权限,不使用则只有普通用户权限
- centos:8: 运行centos且版本为8的镜像
- /usr/sbin/init: 运行后自动执行的脚本
-
配置将软件包缓存,以提高搭建环境时的安装速度
sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/centos|g' \ -i.bak \ /etc/yum.repos.d/CentOS-Linux-AppStream.repo \ /etc/yum.repos.d/CentOS-Linux-BaseOS.repo \ /etc/yum.repos.d/CentOS-Linux-Extras.repo \ /etc/yum.repos.d/CentOS-Linux-PowerTools.repo \ /etc/yum.repos.d/CentOS-Linux-Plus.repo yum makecache
sed命令参考:https://www.runoob.com/linux/linux-comm-sed.html
-e: 使用指定的规则处理输入的文本文件
's|^mirrorlist=|#mirrorlist=|g' : s: 替换动作 将^mirrorlist=(^正则表达式:开头为mirrorlist)替换为#mirrorlist= g:正则表达式参数,全局替换
-i.bak: 将原文件修改前内容保存为"原文件名称.bak",用作备份
-
安装jdk和ssh
- yum install -y java-1.8.0-openjdk-devel openssh-clients openssh-server
- -y: 自动确认Y
- 启动ssh服务: systemctl enable sshd & systemctl start sshd
- enable: 每次开机启动
- start:立即启动
- 等价于: systemctl enable sshd --now
- 保存安装jdk和ssh的centos进行
- 若在容器内,则退出容器: exit
- 若容器在运行,停止容器: docker stop java_ssh_proto
- 提交最后版本的容器镜像: docker commit java_ssh_proto java_ssh
- yum install -y java-1.8.0-openjdk-devel openssh-clients openssh-server
-
安装hadoop
-
启动容器: docker run -d --name=hadoop_single --privileged java_ssh /usr/sbin/init
-
问题:https://blog.csdn.net/asdwt123/article/details/104637556
docker-machine ssh default sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
-t: 指定系统形态,不指定则系统自动指定
挂载一棵cgroup树,但不关联任何subsystem
参考:https://blog.csdn.net/weixin_34293141/article/details/89279437
-
下载hadoop: 3.2.x, 复制到/root/,并解压到/usr/local/hadoop
- 在容器外: docker cp hadoop-3.2.2.tar.gz hadoop_single:/root/
- 进入容器: docker exec -it hadoop_single bash
- 解压:tar -zxf hadoop-3.2.2.tar.gz -C
- 移到到/usr/local/并改名为hadoop: mv hadooop-3.2.2 /usr/local/hadoop
-
配置hadoop全局环境变量
- 配置HADOOP_HOME: echo “export HADOOP_HOME=/usr/local/hadoop” >> /etc/bashrc
- 配置PATH: echo “export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin” >> /etc/bashrc
- 退出重新并进入容器: exit -> docker exec -it hadoop_single bash
-
配置hadoop内环境变量
- 配置JAVA_HOME: echo “export JAVA_HOME=/usr” >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- 配置HADOOP_HOME: echo “export HADOOP_HOME=/usr/local/hadoop” >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- 验证hadoop: hadoop version
-
配置单机HDFS
- hadoop用户:
- 新建hadoop用户: adduser hadoop
- 创建hadoop密码:
- 安装修改密码的快捷工具: yum install -y passwd sudo
- 修改密码: passwd hadoop
- 输入密码:hadoop -> 再次确认输入密码 hadoop
- 修改hadoop安装目录拥有者为hadoop用户: chown -R hadoop /usr/local/hadoop
- 为hadoop用户添加sudo权限: 在/etc/sudoers文件的“root ALL=(ALL) ALL”下一行添加“hadoop ALL=(ALL) ALL”
- commit镜像: docker commit hadoop_single hadoop_proto
- 创建新容器hdfs_single: docker run -d --name=hdfs_single --privileged hadoop_proto /usr/sbin/init
- 启动HDFS
- hadoop用户进入容器: docker exec -it hadoop_single su hadoop
- 验证:whoami -> hadoop
- 添加ssh密钥: ssh-keygen -t rsa
- 添加ip(IP 通过ip addr | grep 172 所获得)到密钥的信任列表: ssh-copy-id hadhoop@172.17.0.2
- 配置core.site.xml
<property> <name>fs.defaultFS</name> <value>hdfs:172.17.0.2:9000</value> </property>
- 配置hdfs.site.xml
<property> <name>dfs.replication</name> <value>1</value> </property>
- 启动 HDFS: start-dfs.sh
- 验证:
- 查看jps进程: jps, 有NameNode, SecondaryNameNode, DataNode
- 查看http进程: curl http://172.17.0.2:9870
- HDFS使用
- HDFS Shell:
- 查看文件: hadoop fs -ls /
- 新建文件夹: hadoop fs -mkdir /hello
- 上传文件: hadoop fs -put a.txt /hello/
- 下载文件: hadoop fs -get /hello/a.txt
- 查看文件: hadoop fs -cat /hello/a.txt
- HDFS Shell:
配置集群HDFS
-
配置集群原型 cluster_proto
- 启动镜像hadoop_proto 作为容器 hadoop_temp:
docker run -d --name=hadoop_temp --privileged hadoop_property /usr/sbin/init - 配置workers记录所有DataNode:
dn1 dn2
- 配置core.site.xml
<!-- 配置hdfs节点入口 --> <property> <name>fs.defaultFS</name> <value>hdfs://nn:9000</value> </property> <!-- 配置临时文件夹位置 --> <property> <name>hadoop.tmp.dir</name> <value>file:///home/hadoop/tmp</value> </property>
- 配置 hdfs.site.xml
<!-- 配置DataNode数量为2 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 配置记录namenode的文件夹 --> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/hadoop/hdfs/name</value> </property>
- 配置 ssh
- 生成公钥: ssh-keygen -t rsa -P “” ~/.ssh/id_rsa
- 添加主机到信任列表: ssh-copy-id -i ~/.ssh/id_rsa hadoop@localhost
- 退出并commit为hadoop_proto镜像
- 退出容器: exit
- 关闭容器: docker stop hadoop_temp
- 提交容器: docker commit hadoop_temp cluster_proto
- 启动镜像hadoop_proto 作为容器 hadoop_temp:
-
部署集群
- 创建网络hnet: docker network creat --subnet 172.20.0.0/16 hnet
- 分别启动nn,dn1,dn2容器
docker -run -d --name=nn --hostname=nn -network=hnet -ip=172.20.0.11 --add-host=dn1:172.20.0.21 --add-host=dn2:172.20.0.31 --privileged cluster_proto /usr/sbin/init docker -run -d --name=dn1 --hostname=dn1 -network=hnet -ip=172.20.0.21 --add-host=nn:172.20.0.11 --add-host=dn2:172.20.0.31 --privileged cluster_proto /usr/sbin/init docker -run -d --name=dn2 --hostname=dn2 -network=hnet -ip=172.20.0.31 --add-host=nn:172.20.0.11 --add-host=dn1:172.20.0.21 --privileged cluster_proto /usr/sbin/init
- 进入nn容器启动NameNode和SecondaryNameNode,并通过ssh启动dn1,dn2的DataNode:
- 进入nn容器: docker exec -it nn su hadoop
- 格式化namenode: hdfs namenode -format
- 启动: start-dfs.sh
- 验证:
- 退出容器:exit
- 验证nn的NameNode,SecondaryNameNode: docker exec nn jps
- 验证dn1的DataNode: docker exec dn1 jps
- 验证dn2的DataNode: docker exec dn2 jps
MapReduce的使用
- 集群版:
- 进入nn容器:docker exec -it nn su hadoop
- 创建input.txt
I like runoob I love runoob I like hadoop I love hadoop
- 上传input.txt到hadoop: hadoop -put input.txt /input.txt
- 统计单词: hadoop jar $HADOOP_HOME/share/hadoop//mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount input.txt output
- 查看结果
- 输出文件夹: hadoop fs -ls /output
- 输出内容: hadoop fs -cat /output/part-r-00000