赞
踩
Termius
、SSH
、基于Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-146-generic x86_64)
镜像的服务器、docker
、JDK1.8
官网:https://docs.docker.com/engine/install/ubuntu/
建议自行看官网安装,下面这个做个简单的翻译
在尝试安装新版本之前卸载任何此类旧版本,旧版本的 Docker
使用的名称是 Docker
、 Docker.io
或 Docker-engine
。
sudo apt-get remove docker docker-engine [docker.io](http://docker.io/) containerd runc
更新 apt 包索引并安装包,以允许 apt 通过 HTTPS 使用存储库:
sudo apt-get update
# \ 续行符号:继续到下一行
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
添加 Docker
的官方 GPG
密钥(gpgkey
:是用来验证软件的真伪——防伪的):
# -m 建立目录的同时设置目录的权限
# -p 递归创建多级目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
下载仓库文件
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
再次更新系统
sudo apt-get update
安装最新版Docker
sudo apt-get install docker-ce docker-ce-cli [containerd.io](http://containerd.io/) docker-buildx-plugin docker-compose-plugin
通过运行 hello-world 镜像验证 Docker Engine 安装是否成功:
sudo docker run hello-world
# 出现
# This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits.
# 表明安装成功!
# 如下图所示
大致过程:
- 拉取 ubuntu:20.04 基础镜像,并进行必要工具的安装
- 在基础镜像中进行hadoop的配置
- 提交为新的镜像,命名为 yhhadoop
- 以此镜像为基础创建3个容器,并赋予 hostname:master、slave1和slave2
- 进入 master 容器,启动 Hadoop 集群
- 运行 wordcount 实例
在 ubuntu 本机下载 hadoop文件,然后后面再和 docker容器 进行路径映射就好
下载到 /root/hadoop_files/
# 1. 下载 hadoop-3.3.5.tar.gz , 可能有点慢。。。 wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz # 2. 下载hadoop的公共密钥 wget https://downloads.apache.org/hadoop/common/KEYS # 3. 下载对应的签名文件 wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz.asc # 4. 导入 Hadoop 的公共密钥。您需要将 KEYS 文件导入 GPG 密钥库,例如: gpg --import KEYS # 5. 验证签名。使用以下命令验证 Hadoop 的签名: gpg --verify hadoop-3.3.5.tar.gz.asc hadoop-3.3.5.tar.gz # 6. 输出如下信息表明验证成功 root@YH:~/hadoop_files# gpg --verify hadoop-3.3.5.tar.gz.asc hadoop-3.3.5.tar.gz gpg: Signature made Thu 16 Mar 2023 01:28:06 AM CST gpg: using RSA key 38237EE425050285077DB57AD22CF846DBB162A0 gpg: Good signature from "Steve Loughran (ASF code sign key - 2018) <stevel@apache.org>" [unknown] gpg: aka "[jpeg image of size 8070]" [unknown] gpg: aka "Steve Loughran <stevel@cloudera.com>" [unknown] gpg: aka "Steve Loughran <steve.loughran@gmail.com>" [unknown] gpg: aka "Steve Loughran <stevel@hortonworks.com>" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 3823 7EE4 2505 0285 077D B57A D22C F846 DBB1 62A0 root@YH:~/hadoop_files#
拉取ubuntu:20.04
镜像:docker pull ubuntu:20.04
现在的 Docker 网络能够提供 DNS 解析功能,我们可以使用如下命令为接下来的 Hadoop 集群单独构建一个虚拟的网络。
使用docker network create --driver=bridge hadoop
命令创建了一个名为 Hadoop 的虚拟桥接网络,该虚拟网络内部提供了自动的DNS解析服务。
使用docker network ls
命令查看 Docker 中的网络,可以看到刚刚创建的名为 hadoop 的虚拟桥接网络
查看网桥使用情况:docker network inspect hadoop
进入容器
# 进入容器 并将本地 /root/hadoop_files 下的文件和容器中 /host_files 下的文件做映射 # 命名为 ubuntu-hadoop docker run -it -v /root/hadoop_files:/host_files --name ubuntu-hadoop ubuntu:20.04 # ctrl+p+q 推出容器,此种方法容器并没有停止 # 使用 exit 推出容器会使容器停止 # 使用以下命令 启动并进入 容器 # docker start ubuntu-hadoop # docker ecex -it ubuntu-hadoop bash # 这时 使用 exit 推出容器 容器不会停止 # 使用 docker stop ubuntu-hadoop 停止容器 # 或者使用下面命令进入 # docker run -d -v /root/hadoop_files:/host_files --name ubuntu-hadoop ubuntu:20.04 # -d 命令不会立马进入容器的交互式界面 # 使用 docker ecex -it ubuntu-hadoop bash 进入
在ubuntu-hadoop容器中进行一些必要的配置
# 安装 nano 编辑器 也可以安装 vim
apt install nano
# 安装 网络工具
apt install net-tools
# 安装java环境
apt install openjdk-8-jdk
# 安装ssh服务
apt install openssh-server
apt install openssh-client
配置密钥登陆
1). 生成rsa方式加密的密钥:ssh-keygen -t rsa -P ""
2). 写入公钥:cat .ssh/id_rsa.pub >> .ssh/authorized_keys
3). 登陆自己进行测试:ssh 127.0.0.1
4). 设置开机启动ssh服务:在 ~/.bashrc
中追加 service ssh start
,编辑 .bashrc
:nano ~/.bashrc
解压 hadoop 文件并进行重命名
# 解压文件
tar -zxvf /host_files/hadoop-3.3.5.tar.gz -C /usr/local/
# 重命名
cd /usr/local/
mv hadoop-3.3.5 hadoop
修改 /etc/profile
文件,添加一下环境变量到文件中
nano /etc/profile # 追加 #java # JAVA_HOME 为 JDK 安装路径,使用 apt 安装就是这个,用 update-alternatives --config java 可查看 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH #hadoop export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_CONF_DIR=$HADOOP_HOME export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop export HDFS_DATANODE_USER=root export HDFS_DATANODE_SECURE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export HDFS_NAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root # 刷新文件,使配置生效 source /etc/profile
修改 /usr/local/hadoop/etc/hadoop
下的 hadoop
的一些配置文件
修改 hadoop-env.sh
nano hadoop-env.sh
# 追加
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
修改 core-site.xml
<configuration> <!-- Set the default file system to use. Hadoop supports file systems such as File, HDFS, GFS, ali | Amazon Cloud, etc --> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <!-- Specify the storage directory for files generated during Hadoop runtime --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <!-- The username used to access HDFS in the web UI --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> </configuration>
修改 hdfs-site.xml
<configuration> <!-- Web Access Address --> <property> <name>dfs.namenode.http-address</name> <value>master:9870</value> </property> <!-- Set SNN running host and port --> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave2:9868</value> </property> <!-- Specify the number of HDFS replicas --> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
修改mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.application.classpath</name> <value> /usr/local/hadoop/etc/hadoop, /usr/local/hadoop/share/hadoop/common/*, /usr/local/hadoop/share/hadoop/common/lib/*, /usr/local/hadoop/share/hadoop/hdfs/*, /usr/local/hadoop/share/hadoop/hdfs/lib/*, /usr/local/hadoop/share/hadoop/mapreduce/*, /usr/local/hadoop/share/hadoop/mapreduce/lib/*, /usr/local/hadoop/share/hadoop/yarn/*, /usr/local/hadoop/share/hadoop/yarn/lib/* </value> </property> <!-- MR Program History Service Address --> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <!-- MR program history server web address --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> </configuration>
修改yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <!-- Specify the address of YARN's boss (ResourceManager) --> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <!-- How reducers obtain data --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
修改 workers
nano workers
# 删除里面的内容 并添加一下内容
master
slave1
slave2
添加 hadoop
环境变量
root@b9f7246412df:~# nano .bashrc # 追加 export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin # 然后刷新一下 root@b9f7246412df:~# source .bashrc # 尝试是否配置成功 root@b9f7246412df:~# hadoop version Hadoop 3.3.5 Source code repository https://github.com/apache/hadoop.git -r 706d88266abcee09ed78fbaa0ad5f74d818ab0e9 Compiled by stevel on 2023-03-15T15:56Z Compiled with protoc 3.7.1 From source with checksum 6bbd9afcf4838a0eb12a5f189e9bd7 This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.3.5.jar
# 提交配置好的镜像 root@YH:~# docker commit -m “hadoop” -a “yh” b9f7246412df yhhadoop # 查看镜像yhhadoop root@YH:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yhhadoop latest 0dd0efa8ddce 2 minutes ago 2GB ubuntu 20.04 1c5c8d0b973a 5 weeks ago 72.8MB mysql 5.7 be16cf2d832a 2 months ago 455MB # 创建 master slave1 slave2 容器 root@YH:~# docker run -itd --network hadoop -h "master" --name "master" -p 9870:9870 -p 8088:8088 yhhadoop /bin/bash b5e3d87db7427b506560b9c333a2d0a2645823c7d480edafad39820c668dca0b root@YH:~# docker run -itd --network hadoop -h "slave1" --name "slave1" yhhadoop /bin/bash b3bf90e57646aa390edb12aa3dd179b31814c86ffec44fc3f1e6a824e14eb930 root@YH:~# docker run -itd --network hadoop -h "slave2" --name "slave2" yhhadoop /bin/bash b1b63c4e7afec618fa59a0a4203e8e2bfcbdbd2919cff5b4c720772c6ac4c881 # 查看正在运行的容器 root@YH:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1b63c4e7afe yhhadoop "/bin/bash" 6 seconds ago Up 5 seconds slave2 b3bf90e57646 yhhadoop "/bin/bash" 17 seconds ago Up 16 seconds slave1 b5e3d87db742 yhhadoop "/bin/bash" About a minute ago Up About a minute 0.0.0.0:8088->8088/tcp, :::8088->8088/tcp, 0.0.0.0:9870->9870/tcp, :::9870->9870/tcp master b9f7246412df ubuntu:20.04 "/bin/bash" 44 hours ago Up 21 hours ubuntu-hadoop root@YH:~#
hadoop
集群root@YH:~# docker exec -it master bash * Starting OpenBSD Secure Shell server sshd [ OK ] root@master:/# # 格式化 root@master:/# hadoop namenode -format # 启动hadoop集群 root@master:/# start-all.sh Starting namenodes on [master] master: Warning: Permanently added 'master,172.18.0.2' (ECDSA) to the list of known hosts. Starting datanodes slave1: Warning: Permanently added 'slave1,172.18.0.3' (ECDSA) to the list of known hosts. slave2: Warning: Permanently added 'slave2,172.18.0.4' (ECDSA) to the list of known hosts. slave2: WARNING: /usr/local/hadoop/logs does not exist. Creating. slave1: WARNING: /usr/local/hadoop/logs does not exist. Creating. Starting secondary namenodes [slave2] Starting resourcemanager Starting nodemanagers root@master:/#
jps
查看节点状态root@master:/# jps 800 NodeManager 276 NameNode 698 ResourceManager 1134 Jps 383 DataNode root@master:/# exit exit root@YH:~# docker exec -it slave1 bash * Starting OpenBSD Secure Shell server sshd [ OK ] root@slave1:/# jps 65 DataNode 291 Jps 169 NodeManager root@slave1:/# exit exit root@YH:~# docker exec -it slave2 bash * Starting OpenBSD Secure Shell server sshd [ OK ] root@slave2:/# jps 64 DataNode 166 SecondaryNameNode 238 NodeManager 367 Jps root@slave2:/#
将 /usr/local/hadoop
下的 LICENSE.txt
文件作为 input
cat LICENSE.txt > wordcount_test.txt
在 HDFS
中创建 input
文件夹
hadoop fs -mkdir /input
上传 wordcount_test.txt
文件到 HDFS
中
hadoop fs -put ./wordcount_test.txt /input
查看 HDFS
中 input
文件夹里的内容
hadoop fs -ls /input
Found 1 items
-rw-r--r-- 3 root supergroup 15217 2023-04-14 12:49 /input/wordcount_test.txt
运作 wordcount 例子程序
cd /usr/local/hadoop/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.5.jar wordcount /data/wordcount /input /output
查看 HDFS
中的 /output
文件夹的内容
hadoop fs -ls /output
Found 2 items
-rw-r--r-- 2 root supergroup 0 2019-03-19 11:18 /output/_SUCCESS
-rw-r--r-- 2 root supergroup 35324 2019-03-19 11:18 /output/part-r-00000
查看 part-r-00000
文件的内容
hadoop fs -cat /output/part-r-00000
sudo useradd -m hadoop -s /bin/bash
命令创建了可以登陆的 hadoop
用户,最后的 -s /bin/bash
含义是什么?
useradd
创建新用户
-m
选项来创建一个新的用户主目录(通常位于/home/hadoop
下)
-s
选项来指定新用户的默认shell
为/bin/bash
切换到当前用户目录
比如:
如果当前用户为root
,那么cd ~
就会到/root/
目录
如果当前用户为hadoop
,那么cd ~
就会到/home/hadoop/
目录
JRE 和 JDK 都是 Java 开发和运行环境的组件,它们之间的主要区别在于它们包含的组件和用途。
JRE(Java Runtime Environment)是 Java 运行时环境,它包含了运行 Java 应用程序所必需的组件,包括 Java 虚拟机(JVM)、Java 类库、Java 命令行工具等。JRE 只能用于运行 Java 应用程序,而不能用于开发和编译 Java 代码。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了。
JDK(Java Development Kit)是 Java 开发工具包,它包含了开发和编译 Java 应用程序所必需的所有组件,包括 JRE、Java 编译器(javac)、Java 文档生成器(javadoc)、Java 调试器(jdb)、Java 应用程序打包工具(jar)等。JDK 除了包含 JRE,还提供了一系列开发工具,方便开发人员进行 Java 应用程序的开发和调试。如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。
总之,JRE 是运行 Java 应用程序所必需的组件,而 JDK 不仅包含了 JRE,还提供了开发和编译 Java 应用程序所必需的工具。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了;如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。
总之,JRE 是运行 Java 应用程序所必需的组件,而 JDK 不仅包含了 JRE,还提供了开发和编译 Java 应用程序所必需的工具。如果你只需要运行 Java 应用程序,那么安装 JRE 就足够了;如果你需要开发和编译 Java 应用程序,那么你需要安装 JDK。
# `jps` 命令是 Java Virtual Machine Process Status Tool 的缩写,它可以列出当前系统上所有正在运行的 Java 进程的进程 ID(PID)以及 Java 进程的类名(Java class name)。 # `jps` 命令的输出结果包括两列信息,分别是 Java 进程的进程 ID 和 Java 进程的类名。具体来说,输出结果格式如下: <进程 ID> <Java 进程的类名> #例如,下面是 `jps` 命令的输出结果示例: 12345 Jps 23456 MainClass # 下面是本次实验所存在的java进程 root@master:/# jps 800 NodeManager 276 NameNode 698 ResourceManager 1134 Jps 383 DataNode root@slave1:/# jps 65 DataNode 291 Jps 169 NodeManager root@slave2:/# jps 64 DataNode 166 SecondaryNameNode 238 NodeManager 367 Jps # NameNode:HDFS 的主节点,负责管理文件系统的名称空间和客户端对文件的访问。 # DataNode:HDFS 的数据节点,负责存储和检索数据块。 # ResourceManager:YARN 的主节点,负责管理集群上的资源和作业。 # NodeManager:YARN 的工作节点,负责启动和监视容器(container)以及处理容器上的任务。 # Jps:Java Virtual Machine Process Status Tool,用于列出当前系统上所有正在运行的 Java 进程的进程 ID 和 Java 进程的类名。 # SecondaryNameNode:HDFS 的辅助节点,用于协助 NameNode 完成部分工作,如定期合并 HDFS 的编辑日志(edit log)以及 NameNode 的文件系统镜等(fsimage)等。 # 这些进程共同协作,完成分布式计算任务。
hadoop fs -ls /output
Found 2 items
-rw-r--r-- 2 root supergroup 0 2019-03-19 11:18 /output/_SUCCESS
-rw-r--r-- 2 root supergroup 35324 2019-03-19 11:18 /output/part-r-00000
# _SUCCESS 文件是 MapReduce 作业运行成功的标识文件
# part-r-00000 是 MapReduce 作业的输出文件。
# 查看输出的内容
hadoop fs -cat /output/part-r-00000
# 其结果就是词频,格式为:
# word word——count
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。