(一). 集群规划
hadoop01 | hadoop02 | hadoop03 | |
---|---|---|---|
hdfs | namenode | ||
datanode | datanode | datanode | |
secondarynamenode | |||
mapreduce | |||
yarn | resourcemanager | ||
nodemanager | nodemanager | nodemanager |
(二). 开始安装
1.上传 hadoop-2.7.6.tar.gz, 解压至 /opt/
tar -zxvf hadoop-2.7.6.tar.gz -C /opt/
2.配置 Hadoop 环境变量
sudo vi /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
3.修改 Hadoop 配置文件, /opt/hadoop-2.7.6/etc/hadoop/
core-site.xml
<configuration>
<property>
<!-- hdfs的主节点 namenode 的访问入口 hdfs://hadoop01:9000 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<!-- hdfs存储数据的目录 配置家目录下某一个目录 -->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/namenode</value>
<description>namenode相关数据的存储目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/datanode</value>
<description>datanode相关数据的存储目录</description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>hdfs的数据块的副本存储个数</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop02:50090</value>
<description>secondarynamenode运行节点的信(与namenode不同节点)</description>
</property>
</configuration>
mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
sudo vi mapred-site.xml
<configuration>
<property>
<!--配置mapreduce的计算任务的资源调度框架-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<!--配置yarn的主节点-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>yarn 集群为 MapReduce 程序提供的 shuffle服务</description>
</property>
</configuration>
Hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
因hadoop配置文件启动顺序原因导致上述命令会导致Java加载错误,故修改为实际Java所在:
export JAVA_HOME=/opt/jdk1.8.0_73
slavers
dd,删掉其中的loclhost,然后添加:
hadoop01
hadoop02
hadoop03
4.配置完成, 将 /opt/hadoop-2.7.6、/etc/profile 发送至其它节点, 然后格式化文件系统
在 namenode 所在节点执行格式化 hdfs 文件系统命令:
hadoop namenode -format
5.格式化成功后, 即可启动并执行对应操作.
Hadoop 命令及操作(shell、api)
1.启动 hdfs 文件系统 (任意节点均可)
start-dfs.sh
stop-dfs.sh
web页面: http://hadoop01:50070
2.启动/停止 yarn , (均必须在 yarn 主节点中执行)
start-yarn.sh
stop-yarn.sh
web页面: http://hadoop03:8088
3.全部启动与全部停止, 等价于 hdfs + yarn, 不建议使用(与spark中命令冲突)
[root@hadoop01 hadoop]# cd /opt/hadoop-2.7.6/sbin/
start-all.sh
stop-all.sh
4.若某个进程挂掉了, 则可以单独启动该进程(在对应缺失进程的节点中执行)
hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager
若启动失败, 可去 $HADOOP_HOME/logs 中根据名字查找对应进程日志
日志文件: 模块 + 用户名 + 进程名 + 节点.log
tail -100 文件名
5. Hadoop shell 操作
1.级连查看/目录下文件
hadoop fs -ls -R /
2.级连创建目录,文件
hadoop fs -mkdir -p /aa/bb/cc
hadoop fs -touch filename (创建一个空文件)
3.上传文件
hadoop fs -copyFromLocal 本地文件路径 hdfs路径 (拷贝)
hadoop fs -moveFromLocal 本地文件路径 hdfs路径 (移动)
hadoop fs -put 本地文件路径 hdfs路径 (拷贝,同 -copyFromLocal,推荐使用)
4.下载文件
hadoop fs -copyToLocal hdfs文件路径 本地路径 (拷贝)
hadoop fs -moveToLocal hdfs文件路径 本地路径 (移动)
hadoop fs -get hdfs文件路径 本地路径 (拷贝,同 -copyToLocal,推荐使用)
5.查看文件内容
hadoop fs -cat hdfs文件路径 (必须从根目录开始)
hadoop fs -tail hdfs文件路径 (查看末尾1kb的文件)
6.删除目录或文件
hadoop fs -rm -r -f 目录或文件 ( -r 级连删除, -f 强制删除)
7.修改hdfs文件或目录的读写权限
linux: chmod -R 777 文件或目录
-R 级联修改目录下的所有子文件的权限,因此修改目录时通常加上该参数
hadoop fs -chmod -R 777 /aa
8.修改文件或目录所属用户 和 组
linux: chown -R 用户:组 文件或目录
hadoop fs -chown -R 用户:组 文件或目录
hadoop fs -chown -R hadoop:hadoop /aa
9.修改hdfs文件的副本个数,某个特殊重要的文件需要多重备份,(只能修改hdfs上已经存在的文件或目录)
-setrep [-R] [-w] set replication
-R 级联修改目录下的所有文件
-w wait 等待新副本的复制完成|删除完成 阻塞
hadoop fs -setrep -R 3 /aa
10.查看磁盘占有情况
hadoop fs -du -h hdfs目录
统计hdfs目录下的每一个文件夹|文件的大小
hadoop fs -df -h hdfs目录
查看指定路径的磁盘占有率
11.其他命令
1)-appendToFile 追加 了解
hadoop fs -appendToFile 本地文件 hdfs文件
将本地文件 追加到指定的hdfs文件的末尾
hadoop fs -appendToFile hdfs-site.xml /slaves 不建议使用的
2)-cp|-mv
hadoop fs -cp|-mv hdfs路径 hdfs路径
将hdfs的(目录)文件 拷贝|移动 hdfs另一个文件路径中
hadoop fs -mv /slaves /sl02 重命名 掌握
3) -getmerge 合并下载 归并下载
hadoop fs -getmerge hdfs路径1 hdfs路径2 。。。。 本地路径
将hdfs的多个路径 合并下载到本地
hadoop fs -getmerge /sl01 /sl02 /home/hadoop/testmetge
这个命令 默认将最后一个目录识别为本地路径
4)-count 文件统计
5)-text 将文件以文本显示
6.Hadoop 知识点补充
hdfs的所有路径权限定名:namenode的访问路径+需要访问的路径
当时将name访问路径配置在 core-site.xml 文件中
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
hdfs://hadoop01:9000/
简写: /
全写: hadoop fs -ls hdfs://hadoop01:9000/
hdfs 协议
hadoop01 namenode 主节点
9000 端口号
hdfs有两个端口:
9000: datanode和namenode通信访问的端口,内部访问,基于rpc协议;
50070: 客户端访问web界面的http协议端口.
hadoop fs -命令 老
hdfs dfs - 命令 新
7.idea Hadoop hdfs API操作
1.maven 方式: 创建idea maven项目, 导入对应版本client、common、hdfs等包
优点:工程规整, 可以解决jar包冲突
缺点:代码移动后, 需要重新构建依赖的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hadoopHdfs</groupId>
<artifactId>hadoopHdfs</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<!-- 客户端开发,故使用 client 包 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.6</version>
</dependency>
</dependencies>
</project>
或使用
2.本地工程下构建 library 方式:
在工程下创建 lib 文件夹, 将所有的依赖放在 lib 下, 然后 build path
优点:工程移动比较方便
缺点:无法解决jar包冲突问题, 工程臃肿
对应 Mac 中编译过的路径中的 jar 包, 在 linux 中方便演示目录结构:
[root@hadoop01 hadoop]# cd /opt/hadoop-2.7.6/share/hadoop/
[root@hadoop01 hadoop]# ll
total 8
drwxr-xr-x 6 777 101 158 Apr 18 2018 common 共有公共依赖
drwxr-xr-x 7 777 101 174 Apr 18 2018 hdfs
drwxr-xr-x 3 777 101 20 Apr 18 2018 httpfs 通信模块
drwxr-xr-x 3 777 101 20 Apr 18 2018 kms 算法
drwxr-xr-x 5 777 101 4096 Apr 18 2018 mapreduce
drwxr-xr-x 5 777 101 43 Apr 18 2018 tools 工具包
drwxr-xr-x 5 777 101 4096 Apr 18 2018 yarn
[root@hadoop01 hadoop]#
在本机 Mac 中安装后 Hadoop 后,打开文件对应路径:
建议使用 maven 方式, 以下也是按照 maven 方式继续
2.将 core-site.xml、hdfs-site.xml 放在 hadoopHdfs/src/main/resources/ 目录下
将 log4j.properties 放至对应目录下
3.创建HdfsTest.java,编写测试访问
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HdfsTest {
public static void main(String[] args) {
try {
String filename = "hdfs://hadoop01:9000/aa/bb/testCon.txt";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(filename))){
System.out.println("exist");
}else{
System.out.println("no exist");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.在hdfs上创建对应目录及文件, 并运行程序查看命令台结果
[root@hadoop01 hadoop]# hadoop fs -touchz /aa/bb/testCon.txt
[root@hadoop01 hadoop]# hdfs dfs -ls -R /
drwxr-xr-x - root supergroup 0 2020-11-02 11:04 /aa
drwxr-xr-x - root supergroup 0 2020-11-02 11:08 /aa/bb
-rw-r--r-- 2 root supergroup 0 2020-11-02 11:08 /aa/bb/testCon.txt
-rw-r--r-- 2 root supergroup 9541892 2020-11-01 21:15 /hadoop6
5.API方式上传下载文件, Permission denied 权限不足
Permission denied: user=dooo, access=WRITE, inode="/aa":root:supergroup:drwxr-xr-x
原因: 上传文件时用户是当前Mac主机用户dooo, 而hadoop上传应使用hadoop集群用户root
解决方式:
- 指定上传用户后再运行
Run -- Edit Configurations -- VM options:-DHADOOP_USER_NAME=root
- 直接在代码中指定
代码最前方指定:
System.setProperty("HADOOP_USER_NAME","root");
- 重载 FileSystem.get(uri,conf,user) 推荐
Configuration conf = new Configuration();
/*
* FileSystem.get(uri,conf,user);
* namenode访问的主入口、conf、指定文件系统用户
*/
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop01:9000"),conf,"root");
...
- 在 Mac 中创建 HADOOP_USER_NAME = root 环境变量