1.1 Hadoop总结**
1.1.1 Hadoop组成
- 分布式存储 - HDFS
- 分布式计算 - MapReduce
- 资源管理 - Yarn
1.2.1 HDFS特点
-
HDFS优点
- 高可靠性
- 高扩展性
- 高效性
- 高容错性
- 低成本 :与一体机、商用数据仓库等相比,hadoop是开源的,项目的软件成本因此会大大降低
-
HDFS缺点
- 不能做到低延迟,由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟数据访问,不适合hadoop
- 不适合大量小文件存储,由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量,根据经验,每个文件、目录和数据块的存储信息大约占150字节
- 对于上传到HDFS上的文件,不支持修改文件,HDFS适合一次写入,多次读取的场景
2.1.1 HDFS相关
-
名词
- NameNode
- DataNode
-
写入文件流程
- 客户端将文件拆分成固定大小128M的块,并通知namenode
- namenode找到可用的datanode返回给客户端
- 客户端根据返回的datanode,对块进行写入
- 通过流水线管道流水线复制
- 更新元数据,告诉namenode已经完成了创建新的数据块,保证namenode中的元数据都是最新的状态
-
读取文件流程
- 客户端向namenode发起独立请求,把文件名,路径告诉namenode
- namenode查询元数据,并把数据返回客户端
- 此时客户端就明白文件包含哪些块,这些块在哪些datanode中可以找到
3. 环境安装
3.1 安装方式
-
单机模式
只能启动MapReduce
-
伪分布式
能启动HDFS、MapReduce 和 YARN的大部分功能
-
完全分布式
能启动Hadoop的所有功能
3.2 安装JDK
3.2.1 JDK安装步骤
-
下载JDK安装包(下载Linux系统的 .tar.gz 的安装包)
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
-
更新Ubuntu源
sudo apt-get update
-
将JDK压缩包解压到Ubuntu系统中 /usr/local/ 中
sudo tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/
-
将解压的文件夹重命名为 jdk8
cd /usr/local/
sudo mv jdk1.8.0_251/ jdk8
-
添加到环境变量
cd /home/tarena/
sudo gedit .bashrc
在文件末尾添加如下内容:
export JAVA_HOME=/usr/local/jdk8 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=.:$JAVA_HOME/bin:$PATH
source .bashrc
-
验证是否安装成功
java -version
<出现java的版本则证明安装并添加到环境变量成功 java version “1.8.0_251”>
3.3 安装Hadoop并配置伪分布式
3.3.1 Hadoop安装配置步骤
-
安装SSH
sudo apt-get install ssh
-
配置免登录认证,避免使用Hadoop时的权限问题
ssh-keygen -t rsa (输入此条命令后一路回车)
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
ssh localhost (发现并未让输入密码即可连接)
exit (退出远程连接状态)
-
下载Hadoop 2.10(374M)
https://archive.apache.org/dist/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
-
解压到 /usr/local 目录中,并将文件夹重命名为 hadoop,最后设置权限
sudo tar -zxvf hadoop-2.10.0.tar.gz -C /usr/local/
cd /usr/local
sudo mv hadoop-2.10.0/ hadoop2.10
sudo chown -R tarena hadoop2.10/
-
验证Hadoop
cd /usr/local/hadoop2.10/bin
./hadoop version (此处出现hadoop的版本)
-
设置JAVE_HOME环境变量
sudo gedit /usr/local/hadoop2.10/etc/hadoop/hadoop-env.sh
把原来的export JAVA_HOME=${JAVA_HOME}改为
export JAVA_HOME=/usr/local/jdk8 -
设置Hadoop环境变量
sudo gedit /home/tarena/.bashrc
在末尾追加
export HADOOP_HOME=/usr/local/hadoop2.10 export CLASSPATH=.:{JAVA_HOME}/lib:${HADOOP_HOME}/sbin:$PATH export PATH=.:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
source /home/tarena/.bashrc
-
伪分布式配置,修改2个配置文件(core-site.xml 和 hdfs-site.xml)
-
修改core-site.xml
sudo gedit /usr/local/hadoop2.10/etc/hadoop/core-site.xml
添加如下内容
<configuration> <property> <!--数据目录配置参数--> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop2.10/tmp</value> </property> <property> <!--文件系统配置参数--> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
-
修改hdfs-site.xml
sudo gedit /usr/local/hadoop2.10/etc/hadoop/hdfs-site.xml
添加如下内容
<configuration> <property> <!--副本数量--> <name>dfs.replication</name> <value>1</value> </property> <property> <!--namenode数据目录--> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop2.10/tmp/dfs/name</value> </property> <property> <!--datanode数据目录--> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop2.10/tmp/dfs/data</value> </property> </configuration>
-
配置YARN - 1
cd /usr/local/hadoop2.10/etc/hadoop
cp mapred-site.xml.template mapred-site.xml
sudo gedit mapred-site.xml
添加如下配置
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
配置YARN - 2
sudo gedit yarn-site.xml
添加如下配置:
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
-
执行NameNode格式化
cd /usr/local/hadoop2.10/bin
./hdfs namenode -format
出现 Storage directory /usr/local/hadoop2.10/tmp/dfs/name has been successfully formatted 则表示格式化成功
-
启动Hadoop所有组件
cd /usr/local/hadoop2.10/sbin
./start-all.sh
启动时可能会出现警告,直接忽略即可,不影响正常使用
-
启动成功后,可访问Web页面查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件
http://localhost:50070
-
查看Hadoop相关组件进程
jps
会发现如下进程
NameNode DataNode SecondaryNameNode ResourceManager NodeManager
-
测试 - 将本地文件上传至hdfs
hadoop fs -put 一个本地的任意文件 /
hadoop fs -ls /
也可以在浏览器中Utilities->Browse the file system查看
4. HDFS Shell操作
4.1 命令格式
hadoop fs 命令
4.2 常用命令汇总
-
查看HDFS系统目录(ls)
命令格式 :hadoop fs -ls 路径
示例 :hadoop fs -ls /
-
创建文件夹(mkdir)
命令格式1 :hadoop fs -mkdir 绝对路径
命令格式2 :hadoop fs -mkdir -p 绝对路径 (可递归创建文件夹)
示例1 :hadoop fs -mkdir /test
示例2 :hadoop fs -mkdir -p /test/stu
-
上传文件(put)
命令格式 :hadoop fs -put 本地文件 HDFS目录
示例 :hadoop fs -put words.txt /test/
-
下载文件(get)
命令格式 :hadoop fs -get HDFS文件 本地目录
示例 :hadoop fs -get /test/words.txt /home/tarena/
-
删除文件或目录(rm)
命令格式1 :hadoop fs -rm 文件或目录的绝对路径
命令格式2 :hadoop fs -rm -r 目录 (删除文件夹要加 -r 选项)
示例1 :hadoop fs -rm /test/words.txt
示例2 :hadoop fs -rm -r /test
-
查看文件内容(text)
命令格式 :hadoop fs -text 文件绝对路径
示例 :hadoop fs -text /test/words.txt
-
移动(mv)
命令格式 :hadoop fs -mv 源文件 目标目录
示例 :hadoop fs -mv /test/words.txt /words.txt
-
复制(cp)
命令格式 :hadoop fs -cp 源文件 目标目录
示例 :hadoop fs -cp /test/words.txt /words.txt
4.3 HDFS Shell操作练习
-
在本地 /home/tarena/ 下新建 students.txt
touch /home/tarena/students.txt
-
在students.txt中任意添加内容
一个人在这个城市里
为了填饱肚子就已筋疲力尽
-
在HDFS中创建 /studir/stuinfo/ 目录
hadoop fs -mkdir -p /studir/stuinfo/
-
将本地students.txt文件上传到HDFS中
hadoop fs -put students.txt /studif/stuinfo/
-
查看HDFS中 /studir/stuinfo/students.txt 的内容
hadoop fs -text /studir/stuinfo/students.txt
-
将HDFS中 /studir/stuinfo/students.txt 下载到本地命名为 new_students.txt
hadoop fs -get /studir/stuinfo/students.txt ~/new_students.txt
-
删除HDFS中的 /studir 目录
hadoop fs -rm -r /studir