记录一下学习笔记,文章写的不好,如果有建议或意见请指教。
本地环境我使用的是docker的centos7的镜像搭建的(这里推荐使用centos8), 也可以使用虚拟机,安装方式大同小异。
- 环境版本:Java Version 8Hadoop Version 3.3.6
1、CentOS7容器安装
安装CentOS7容器的方式可以参考这篇文章:Docker安装练手centos7
CentOS7容器配置后以后,使用如下命令启动一个新的容器:
docker run -itd --name Centos7-my -p 18088:8088 -p 19870:9870 -p 10022:22 -p 10080:80 --privileged=true -v /Users/jiaoyang/Documents/works/centos7/user/root:/Users/local/ jythons-centos7-hadoop /usr/sbin/init
--name:容器名字(可以自定义)
-p:与宿主机绑定的端口号,左面是宿主机的端口,右面是容器的端口
--privileged:这个参数等于true,标识容器可以完全获取到root权限,这里需要修改docker配置文件:~/Library/Group\ Containers/group.com.docker/settings.json的deprecatedCgroupv1 = true参数,才能生效。
-v:用于映射宿主机目录和容器文件夹,用于同步文件,左面是宿主机,右面是容器
这里注意,安装好容器后,记得关闭centos的防火墙。
1.1、Docker基本使用命令
docker ps # 查看正在运行的容器,主要是查看容器ID
docker start [容器ID] # 启动容器
docker restart [容器ID] # 重启容器
docker stop [容器ID] # 停止容器
# 提交容器,如果需要新增映射端口、文件夹,时,需要先提交容器保存为镜像,然后基于该镜像重新启动一个新的容器,之前配置的环境都不会改变。
docker commit [容器ID] [容器名]
2、Java环境安装
Hadoop运行依赖Java环境,因此首先安装Java环境,我使用的是Java8。
下载好Java后,解压文件,将解压的文件夹放到/usr/local/java文件夹下,然后配置环境变量;
export JAVA_HOME=/usr/local/java/jdk1.8.0_381
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
3、Hadoop环境安装
下载Hadoop安装包,解压到/usr/local/hadoop文件夹下,然后配置Hadoop环境变量:
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.3.6
export PATH=$PATH:${HADOOP_HOME}/bin
Hadoop有3种运行模式,各种模式下,Hadoop组件的运行场所有所不同。HDFS包括 一个NameNode,它充当着集群协调者的角色,是一个或多个用于存储数据的DataNode的管理者。 对于MapReduce而言,JobTracker是集群的主节点,它负责协调多个TaskTracker进程执行的工作。 Hadoop以如下3种模式部署上述组件。
- 本地独立模式:像前面计算圆周率的例子一样,如果不进行任何配置的话,这是Hadoop 的默认工作模式。在这种模式下,Hadoop的所有组件,如NameNode、DataNode、JobTracker 和TaskTracker,都运行在同一个Java进程中。
- 伪分布式模式:在这种模式下,Hadoop的各个组件都拥有一个单独的Java虚拟机,它们 之间通过网络套接字通信。这种模式在一台主机上有效地产生了一个具有完整功能的微 型集群。
- 完全分布式模式:在这种模式下,Hadoop分布在多台主机上,其中一些是通用的工作机, 其余的是组件的专用主机,比如NameNode和JobTracker。
每种模式都有其优点和缺点。完全分布式模式显然是唯一一种可以将Hadoop扩展到机器集 群的方式,但它需要更多的配置工作,更不用提所需要的机器集群。本地或独立模式的设置工作 是最简单的,但它与用户的交互方式不同于全分布式模式的交互方式。伪分布式模式,程序在一台主机上运行,但是在伪分布式模式下执行的操作与其在更大的集群上的运作几乎是相同的。因此我们也使用伪分布式模式来学习。
3.1、配置Hadoop伪分布式模式
进入到Hadoop配置文件文件夹:
cd /usr/local/hadoop/hadoop-3.3.6/etc/hadoop
这里低版本的Hadoop配置文件文件夹与新版本不同,需要注意下。
查看Hadoop安装包中的conf目录。那里有很多配置文件,但只需对其中3个文件进行修改:core-site.xml、hdfs-site.xml和mapred-site.xml
修改core-site.xml文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://[容器ID]:9000</value>
</property>
</configuration>
修改hdfs-site.xml文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
修改mapred-site.xml文件:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>127.0.0.1:9001</value>
</property>
</configuration>
3.2、修改 HDFS 的根目录
由于我们将在Hadoop中存储数据,同时所有组件都运行在本地主机,这些数据都需要存储 在本地文件系统的某个地方。不管选择了何种模式,Hadoop默认使用hadoop.tmp.dir属性作为 根目录,所有文件和数据都将写入该目录。危险的是, hadoop.tmp.dir的默认值为/tmp,一些版本的Linux系统会在每次重新启动时删除/tmp的内容。所以,明确规定数据留存的位置更为安全。 执行如下步骤,修改HDFS 的根目录:
1.创建Hadoop保存数据的目录
mkdir /var/lib/hadoop
2.确保任何用户都可在此目录写入数据
chmod 777 /var/lib/hadoop
3.再次修改core-site.xml文件,添加下列属性
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://[容器ID|主机名]:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/lib/hadoop</value>
</property>
</configuration>
3.3、修改启动文件用户权限
如果不修改启动文件用户权限,则会报如下错误:
Starting namenodes on [namenode]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [datanode1]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
Starting resourcemanager
ERROR: Attempting to operate on yarn resourcemanager as root
ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.
Starting nodemanagers
ERROR: Attempting to operate on yarn nodemanager as root
ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting operation.
解决这个错误,只需要在如下文件内的开头位置,添加这些配置即可。
hadoop/sbin/start-dfs.sh 和 stop-dfs.sh文件
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
hadoop/sbin/start-yarn.sh 和 stop-yarn.sh文件
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
每次修改配置以后,都需要执行以下命令,使修改的配置生效:
hdfs namenode -format
3.4、生成ssh秘钥,用于服务远程登录
> ssh-keygen -t rsa -P "" # 生成ssh秘钥
> ssh-copy-id # 将ssh秘钥copy到authorized_keys,也可以(执行命令:cat id_rsa.pub >> authorized_keys)
如果不生成ssh秘钥,启动Hadoop服务时,会报如下错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
4、启动Hadoop服务
启动服务之前,还需要设置JavaHome路径,打开/usr/local/hadoop/hadoop-3.3.6/etc/hadoop路径下的配置文件:Hadoop-env.sh,找到export JAVA_HOME=选项,将之前的JAVA_HOME路径写到这里,打开注释。
通过上面的配置后,下面就可以启动Hadoop服务了,使用如下命令:
## 启动服务
/usr/local/hadoop/hadoop-3.3.6/sbin/start-all.sh
## 停止服务
/usr/local/hadoop/hadoop-3.3.6/sbin/stop-all.sh
使用jps命令,查看启动起来的进程:
[root@88fec458a0c4 hadoop]# jps
16133 Jps
8664 DataNode
8872 SecondaryNameNode
9448 NodeManager
8495 NameNode
9119 ResourceManager
5、补充
Hadoop3.x版本与老的版本端口号发生了改变下面是对应关系:
服务 | 老端口 | 新端口 |
NameNode | 50470 | 9871 |
50070 | 9870 | |
8020 | 9820 | |
Secondary NN | 50091 | 9869 |
50090 | 9868 | |
Datanode | 50020 | 9867 |
50010 | 9866 | |
50475 | 9865 | |
50075 | 9864 |
6、执行hdfs namenode -format后 datanode没有启动
当执行hdfs namenode -format后,没有启动datanode服务,原因是因为格式化之后namenode的clusterID变更,和datanode的clusterID不一致,导致。
解决办法:
进入到dfs目录cd /var/lib/hadoop/dfs/
复制/var/lib/hadoop/dfs/name/current/VERSION文件内的clusterID到/var/lib/hadoop/dfs/data/current/VERSION文件内的clusterID即可。 复制之后数据会丢失,数据备份方法后续补充...
/var/lib/hadoop/目录是配置文件core-site.xml内配置的。