查了很多资料,在这里总结一下hadoop集群的搭建注意事项。
一、分配IP,设置免密登陆
确定好hadoop集群中所有主机(包括master与所有slave)的ip地址,确保主机间使用ip能够相互ping通:
主机号 | ip |
---|---|
主机1(Celesto) | 192.168.126.130 |
主机2(hadoop2) | 192.168.126.132 |
主机3(hadoop3) | 192.168.126.133 |
对于每个主机,在/etc/hostname/中修改主机名,方便辨别。改名后需重启主机。
对于集群中的所有主机,都需要把包括自身在内的所有主机ip写入/etc/hosts中:
echo '192.168.126.130 celesto' >>/etc/hosts
echo '192.168.85.132 hadoop2' >>/etc/hosts
echo '192.168.85.133 hadoop3' >>/etc/hosts
免密登陆
在所有虚拟机中分别执行
ssh-keygen -t rsa
连续三次回车,在/root/.ssh中生成密钥:id_rsa.pub
使用命令 touch /root/.ssh/authorized_keys 生成文件
免密码登陆自身(所有机器均要操作):
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
ssh localhost(首次需输入yes)
master免密码登陆slave(仅在master操作):
ssh-copy-id -i ~/.ssh/id_rsa.pub celesto
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop2
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3
此时即做到了master免密登陆所有slave。若想设置任何的A主机免密码登陆B主机,则将A主机的密钥发送至B主机即可(即B主机存了A主机的密钥,等于发了一张A主机的通行证),即在A主机上进行上述操作。
免密登陆测试(在maaster上):
ssh hadoop2 # 不用密码即成功
exit
二、在master上安装jdk,hadoop并配置环境变量
jdk安装及环境变量配置:
创建JAVA目录,解压
mkdir -p /usr/local/java
tar -zxf jdk-8u65-linux-x64.tar.gz -C /usr/local/java/
配置环境变量
vi /etc/profile
# JAVA
JAVA_HOME=/usr/local/java/jdk1.8.0_201
JRE_JOME=/usr/local/java/jdk1.8.0_201/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_JOME CLASS_PATH PATH
保存退出后,输入
source /etc/profile
刷新环境变量
Hadoop安装及环境变量配置(3.1.1版本):
创建hadoop目录,解压
mkdir -p /usr/local/hadoop
tar -zxf hadoop-3.1.1.tar.gz -C /usr/local/hadoop/
配置环境变量
# HADOOP
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
随后
source /etc/profile
三、在master上配置hadoop(注意主机名的修改变化)
创建目录
cd /usr/local/hadoop/
mkdir tmp
mkdir var
mkdir dfs
mkdir dfs/name
mkdir dfs/data
进入hadoop配置文件目录
cd /usr/local/hadoop/hadoop-3.1.1/etc/hadoop
vi workers
# 添加slave主机名
hadoop2
hadoop3
修改hadoop-env.sh
# 在JAVA_HOME=/usr/java/testing hdfs dfs -ls下添加:
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.1
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>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://Celesto:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>
修改hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/dfs/name</value>
<description>Path on the local filesystem where the NameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/usr/local/hadoop/dfs/data</value>
<description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>Celesto:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http_address</name>
<value>Celesto:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>No need permissions</description>
</property>
</configuration>
修改yarn-site.xml
首先输入如下命令,并将内容复制
hadoop classpath
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Celesto</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>复制的hadoop classpath地址</value>
</property>
<!-- Site specific YARN configuration properties -->
</configuration>
修改mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>Celesto:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/usr/local/hadoop/var</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
四、同步
将在master主机上设置好的jdk、hadoop与环境变量同步到所有slave主机上(这里只写一台主机)
scp -r /usr/local/java hadoop2:/usr/local/java
scp -r /usr/local/hadoop hadoop2:/usr/local/hadoop
scp -r /etc/profile hadoop2:/etc/
source /etc/profile
五、启动(在master上操作)
格式化节点(只需要在第一次启动前执行,以后都不需要执行,否则会产生namenode消失的错误)
在master中运行
hdfs namenode -format
启动、停止hadoop集群
start-all.sh
stop-all.sh
在浏览器上输入http://192.168.126.130:8088(前者为主节点ip地址,后者为hdfs的web进程对应的端口号)
六、文件的上传与查看
查看指定目录下内容
hdfs dfs –ls [文件目录]
hdfs dfs –ls /user/wangkai.pt
打开某个已存在文件
hdfs dfs –cat [file_path]
hdfs dfs -cat /user/wangkai.pt/data.txt
将本地文件存储至hadoop
hdfs dfs –put [本地地址] [hadoop目录]
hdfs dfs –put /home/t/file.txt /user/t
将本地文件夹存储至hadoop
hdfs dfs –put [本地目录] [hadoop目录]
hdfs dfs –put /home/t/dir_name /user/t
将hadoop上某个文件down至本地已有目录下
hadoop dfs -get [文件目录] [本地目录]
hadoop dfs –get /user/t/ok.txt /home/t
删除hadoop上指定文件
hdfs dfs –rm [文件地址]
hdfs dfs –rm /user/t/ok.txt
删除hadoop上指定文件夹(包含子目录等)
hdfs dfs –rm [目录地址]
hdfs dfs –rmr /user/t
在hadoop指定目录内创建新目录
hdfs dfs –mkdir /user/t
hdfs dfs -mkdir - p /user/centos/hadoop
在hadoop指定目录下新建一个空文件
hdfs dfs -touchz /user/new.txt
将hadoop上某个文件重命名
hdfs dfs –mv /user/test.txt /user/ok.txt #将test.txt重命名为ok.txt
将hadoop指定目录下所有内容保存为一个文件,同时down至本地
hdfs dfs –getmerge /user /home/t
将正在运行的hadoop作业kill掉
hadoop job –kill [job-id]
其他
hadoop fs, hdfs dfs的区别
hadoop fs:
FS relates to a generic file system which can point to any file systems like local, HDFS etc. So this can be used when you are dealing with different file systems such as Local FS, HFTP FS, S3 FS, and others
意思是说该命令可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广
hadoop dfs
专门针对hdfs分布式文件系统
hdfs dfs
和上面的命令作用相同,相比于上面的命令更为推荐,并且当使用hadoop dfs时内部会被转为hdfs dfs命令
总结
hdfs dfs 查看Hadoop HDFS支持的所有命令
hdfs dfs –ls 列出目录及文件信息
hdfs dfs –lsr 循环列出目录、子目录及文件信息
hdfs dfs –put test.txt /user/sunlightcs 将本地文件系统的test.txt复制到HDFS文件系统的/user/sunlightcs目录下
hdfs dfs –get /user/sunlightcs/test.txt . 将HDFS中的test.txt复制到本地文件系统中,与-put命令相反
hdfs dfs –cat /user/sunlightcs/test.txt 查看HDFS文件系统里test.txt的内容
hdfs dfs –tail /user/sunlightcs/test.txt 查看最后1KB的内容
hdfs dfs –rm /user/sunlightcs/test.txt 从HDFS文件系统删除test.txt文件,rm命令也可以删除空目录
hdfs dfs –rmr /user/sunlightcs 删除/user/sunlightcs目录以及所有子目录
hdfs dfs –copyFromLocal test.txt /user/sunlightcs/test.txt 从本地文件系统复制文件到HDFS文件系统,等同于put命令
hdfs dfs –copyToLocal /user/sunlightcs/test.txt test.txt 从HDFS文件系统复制文件到本地文件系统,等同于get命令
hdfs dfs –chgrp [-R] /user/sunlightcs 修改HDFS系统中/user/sunlightcs目录所属群组,选项-R递归执行,跟linux命令一样
hdfs dfs –chown [-R] /user/sunlightcs 修改HDFS系统中/user/sunlightcs目录拥有者,选项-R递归执行
hdfs dfs –chmod [-R] MODE /user/sunlightcs 修改HDFS系统中/user/sunlightcs目录权限,MODE可以为相应权限的3位数或+/-{rwx},选项-R递归执行
hdfs dfs –count [-q] PATH 查看PATH目录下,子目录数、文件数、文件大小、文件名/目录名
hdfs dfs –cp SRC [SRC …] DST 将文件从SRC复制到DST,如果指定了多个SRC,则DST必须为一个目录
hdfs dfs –du PATH 显示该目录中每个文件或目录的大小
hdfs dfs –dus PATH 类似于du,PATH为目录时,会显示该目录的总大小
hdfs dfs –expunge 清空回收站,文件被删除时,它首先会移到临时目录.Trash/中,当超过延迟时间之后,文件才会被永久删除
hdfs dfs –getmerge SRC [SRC …] LOCALDST [addnl] 获取由SRC指定的所有文件,将它们合并为单个文件,并写入本地文件系统中的LOCALDST,选项addnl将在每个文件的末尾处加上一个换行符
hdfs dfs –touchz PATH 创建长度为0的空文件
hdfs dfs –test –[ezd] PATH 对PATH进行如下类型的检查: -e PATH是否存在,如果PATH存在,返回0,否则返回1 -z 文件是否为空,如果长度为0,返回0,否则返回1 -d 是否为目录,如果PATH为目录,返回0,否则返回1
hdfs dfs –text PATH 显示文件的内容,当文件为文本文件时,等同于cat,文件为压缩格式(gzip以及hadoop的二进制序列文件格式)时,会先解压缩 hdfs dfs –help ls 查看某个[ls]命令的帮助文档