docker 搭建 hadoop+spark环境第一步

1. docker pull centos:latest
2. 运行容器

docker run -d -it --name=master -h=master \
-v /usr/local/bigdatas/config/:/root/bigdatas/config/ centos:latest /bin/bash

如果systemctl无效,需要用下面的语句:

docker run --privileged=true -itd --name=bigwork \
> -v /usr/local/docker/bigdatas/softs/:/root/bigdatas/softs \
> centos:latest /sbin/init

3. 进入容器

docker exec -it master bash

如果 容器显示 Existed :docker start 容器id或名称
输入内容,包含挂载目录

[root@master /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@master /]# cd 
[root@master ~]# ls
anaconda-ks.cfg  bigdatas
[root@master ~]# cd bigdatas
[root@master bigdatas]# ls
config
[root@master bigdatas]#

1. 安装JAVA略
2. 配置 ssh (https://blog.csdn.net/qq_32969313/article/details/64919735)

ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''

出错: ssh-kengen 找不到命令,需执行: yum install -y openssh;
但是无法连外网:重启docker: systemctl restart docker
a) docker ps -a 查看网运行的 容器 bigwork, 发现 Exited
重新运行: docker start bigwork
(参考: https://www.pianshen.com/article/4448212020/)
/vim /etc/ssh/sshd_config

UsePAM yes 改为 UsePAM no 
UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no

执行:
/usr/sbin/sshd -D
是否执行成功:

[root@master ssh]# ps -ef | grep sshd
root       370    58  2 22:01 pts/1    00:00:00 /usr/sbin/sshd -D
root       372   341  0 22:01 pts/2    00:00:00 grep --color=auto sshd

ssh 登录
错误: 提示ssh命令不存在: yum -y install openssh-clients
(如果网络不通,重启 docker , systemctl restart docker)

[root@localhost java]# ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:wFcL5b84h2ebW/LP8mXSCztH4H5O4XCd13CdBjMpgxA.
ECDSA key fingerprint is MD5:5d:eb:5b:09:8b:86:7a:29:e3:d9:87:cf:72:d2:cb:75.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
root@localhost's password: 
Last login: Mon Jul  8 04:56:24 2019 from 192.168.140.1
[root@localhost ~]# 

错误: 可能会提示 输入密码不对 (我输入的是本机密码);
>passwd root (然后两次设置密码)
>如果 passwd 命令不存在: yum install passwd
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
安装hadoop;
1. 解压

cd 
cd bigdatas/config
tar xzvf hadoop.xxx.tar.gz -C /usr/local
...
cd /uar/local
mv hadoop.xxx.xx hadoop
cd hadoop/bin
./hadoop -version

提示配置问题

Error: JAVA_HOME is not set and could not be found.
执行  source /etc/profile

错误: 提示可能为 ./hadoop version (没有横杠, 去掉后,正常返回)
依照上面的配置:
https://blog.csdn.net/u013140345/article/details/79773212
登陆 docker:
docker login
(glootz):
password: xxxxxx
docker ps -a 看 master 容器的id
docker commit master容器id centos/hadoop
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
从 centos/hadoop 创建容器
master
1. /etc/hosts (原只有一个 master 记录, slave1, slave2也要同步配置)

172.17.0.2    master
172.17.0.3    slave1
172.17.0.4    slave2

2. /usr/local/hadoop/etc/hadoop/ 文件 slaves
将 localhost 注释 (master, slave1, slave2 三个同步配置, slaves 文件内,只添加slave1,slave2 两行)
添加:
slave1
slave2
两行;
3. 同样在 slave1, slave2 的 /etc/hosts 添加三行 记录
slave1 上原只有 slave1 记录, slave2 一样
4. 三个IP(原本各只有一个,都是生成好的)
//////////////////////////////////////////////////////////////////////////////////////////////////////
配置 ssh
配置 三台容器主机 的登录密码:

passwd
...:xxxxxxxx  #要求8位以上
重复输入;

5. 在 master 上 ssh slave1 ,输入密码,正常登录;
6. 设置master 免密登录 slave1, slave2
参数: https://blog.csdn.net/zjh_746140129/article/details/81980416
在 master 上执行

cd ~/.ssh/ #如果没有要创建
ssh-keygen -t rsa
ll
cat id_rsa.pub >> authorized_keys

在进入 slave1, slave2 容器; (要先创建,这部很重要)
创建各自的

mkdir ~/.ssh/

回到 master 执行;

scp authorized_keys slave1:~/.ssh/ #要输入登录 slave1 的密码
scp authorized_keys slave2:~/.ssh/ #要输入登录 slave2 的密码

2022-01-07 新增 slavex 到 master 的免密登录 (以上为 slave1 说明)

[root@slave1 .ssh]# ssh-keygen -t rsa
... 一直回车
[root@slave1 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@slave1 .ssh]# cp id_rsa.pub id_rsa_slave1.pub
[root@slave1 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  id_rsa_slave1.pub	known_hosts
[root@slave1 .ssh]# scp id_rsa_slave1.pub master:~/.ssh/

回到 master: ~/.ssh

[root@master .ssh]# cat id_rsa_slave1.pub >> authorized_keys 
[root@master .ssh]# cat id_rsa_slave2.pub >> authorized_keys

测试从 master ssh slave1, slave2 不用密码;
测试从 slavex 到 master 不用密码

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
7. 在 master 上启动 hadoop

cd /usr/local/hadoop
bin/hdfs namenode -format
....一大堆输出
sbin/start-all.sh
...需要 yes 输入;

错误: 2021-12-29
a. 执行 /bin>.hdfs namenode -format 没提示什么错误,有shutdown 字;
b. /sbin>./start-all.sh 提示: /usr/local/hadoop/bin/hdfs: line 28: which: command not found
运行命令: yum -y install which
重新执行 namenode 格式化;
c. 重新格式化后 命令: JPS,有显示 ResourceManager及Jps两项;
d. 再执行 /sbin>start-all.sh 还是报:
slavex: /usr/local/hadoop/bin/hdfs: line 35: /usr/local/hadoop/../libexec/hdfs-config.sh: No such file or directory
因为:slave1,2也要安装 which

8. 验证
在 master 执行 jps ,这里提示 command not found
重新 source /etc/profile 即可

[root@master jdk1.8.0_141]# jps
564 ResourceManager
424 SecondaryNameNode
891 Jps
238 NameNode

在 slave1 上验证

[root@slave1 /]# jps
307 DataNode
407 NodeManager
551 Jps

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
问题1:

每次关机再开机后,执行start-all.sh后,namenode并没有启动。出现这个问题的主要原因是hadoop的临时文件 默认位置为${HADOOP_HOME}/tmp目录,该目录在系统开机时会自动清空,存储在里面的namenode信息也就丢失了。解决办法:

创建目录比如${HADOOP_HOME}/hadoop.tmp,并修改core-site.xml

<property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/hadoop.tmp</value>
        <description>Abase for other temporary directories.</description>
 </property>

=======================================

2021-12-30 补充:(以上为2.8版)

https://www.cnblogs.com/charles1ee/p/11239375.html

2022-01-06
a. 提示现有 master 容器: docker commit masterId bigwork/datas:v1
b. 在 bigwork/datas:v1 重新运行 master:
docker run –privileged=true -itd –name=master -h=master \
-p 50070:50070 \
-v /usr/xxxx:/root/xxx bigwork/datas:v1 /sbin/init
c. ssh 连不上 slave1,2
在 master /etc/hosts 添加
172.17.0.2 master
172.17.0.3 slave1
172.17.0.4 slave2
再次 ssh 成功;
(在 slavex 上相同,没什么用, slave1 有配,slave2 没有配置)

d. master 上执行
hadoop/bin/hdfs namenode -format
hadoop/sbin/start-all.sh
成功
e. 在本地电脑打开 http://192.168.137.100:50070
可以访问
f. 上面补充 slavex 至 master 的免密
g. 参考配置
https://www.cnblogs.com/skyturtle/p/9979413.html (好文)
h. 将 master hadoop 的相关配置文件 拷贝到 slave
scp xxx.xml xx.xml xxx.xml slave1:/usr/local/hadoop/etc/hadoop/
主要修改 hdfs-site.xml 的 replication => 2 (共有两个slave,实际少于这数会报错; 默认为3)
i. 启动 hadoop 在 slave 没有 datanode
修改 hdfs-site.xml (百度上查 hadoop 2.7.6 hdfs-site.xml配置,发现没有以下注释的配置)

<!-- 增加 -->
   <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node22:50090</value>
    </property>
    <!-- 注释 -->
    <!--
    <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
    -->

删除 hadoop.tmp 目录(是整个目录),以及 logs 下所有文件;
重启:
/bin>./hdfs namenode -format
/sbin>./start-all.sh

欢迎您的到来,感谢您的支持!

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注