大数据Hadoop安装、配置及使用
大数据大数据,Spark,Hadoop,python大数据Hadoop安装和配置一、Hadoop 伪分布式配置1. 创建Hadoop用户:2. 配置Java环境3. 安装Hadoop4. 伪分布式配置5. 启动 Hadoop二、Hadoop 集群配置大数据,Spark,Hadoop,python大数据Hadoop安装和配置一、Hadoop 伪分布式配置1. 创建Hadoop用户:sudo user
大数据
大数据,Spark,Hadoop,python
大数据Hadoop安装、配置及使用
一、安装和配置
(一)、Hadoop 伪分布式配置
1. 创建Hadoop用户:
为什么要新建一个名为hadoop的用户呢?
因为为了保证 Hadoop相关文件只有hadoop用户可以访问,其他用户访问不了。而且建立一个单独的用户组,在集群的时候很容易管理
另一方面,root更不建议,为了防止高危情况不要用root用户操作。
sudo useradd -m hadoop -s /bin/bash # 创建hadoop用户(用户名就叫 hadoop)
sudo passwd hadoop # 修改密码。我们不妨将密码也设置成 hadoop
sudo adduser hadoop sudo # 增加管理员权限
输入su hadoop
切换hadoop用户(也可注销后切换成hadoop 用户登录)。
【注意】:下面的每一步操作都要在 "hadoop用户"下执行!!!
2. 安装启动SSH,并配置无密码登录:
切换到了上面新建的hadoop用户后,接着先更新一下 apt :
sudo apt-get update # 更新apt
安装SSH,并配置无密码登录:
sudo apt-get install openssh-client # 安装ssh client
sudo apt-get install openssh-server # 安装ssh server
cd ~
mkdir .ssh # 可能该文件已存在,不影响
cd ~/.ssh/
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat id_rsa.pub >> authorized_keys # 加入授权
启动并登录ssh:
sudo service ssh start
此时输入ssh localhost
即可登录,无需输入密码,否则安装好SSH后登录,需要输入密码hadoop
注:集群、伪分布式、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),有的Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server
附:ssh相关命令
sudo service ssh start # 启动ssh
sudo service ssh stop # 关闭ssh
sudo service ssh restart # 重启ssh
2. 配置Java环境
Hadoop需要java环境支持,配置JDK参考我的另一篇博文https://blog.csdn.net/Acegem/article/details/120852985?spm=1001.2014.3001.5502。
3. 安装Hadoop
可以在Hadoop官网https://dlcdn.apache.org/hadoop/common/下载,我们下载hadoop-3.1.3,下载链接为:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz,
或国内镜像网站,如:http://mirrors.cnnic.cn/apache/hadoop/common/ 下载,
将下载的hadoop-3.1.3压缩包解压到/usr/local/目录下
sudo tar -zxvf hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限。
# 也可以不改组。sudo chown -R hadoop ./hadoop
【测试】(检查hadoop是否可用):
cd /usr/local/hadoop
./bin/hadoop version
若可用则会出现hadoop的版本信息,如下:
4. 伪分布式配置
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。
修改配置文件 core-site.xml:
将
<configuration>
</configuration>
更改为
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改配置文件 hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</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>
</configuration>
5. 启动 Hadoop
cd /usr/local/hadoop
bin/hdfs namenode -format # namenode 格式化
sbin/start-dfs.sh # 开启守护进程
jps # 判断是否启动成功
若成功启动则会列出如下进程: NameNode、DataNode和SecondaryNameNode。
成功启动后,可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
注:
当关机重启后第二次使用hadoop时,记得先切换成“hadoop用户”和启动登录ssh!!!如下:
(1)切换hadoop用户:
su hadoop
回车后让输入密码,前面我设置的密码也叫hadoop
(2)启动并登录ssh:
sudo service ssh start
ssh localhost
如果忘记了这两步直接启动hadoop,会出现拒绝连接的报错信息:
Starting namenodes on [localhost]
localhost: ssh: connect to host localhost port 22: Connection refused
Starting datanodes
localhost: ssh: connect to host localhost port 22: Connection refused
附:
【报错1】:如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好。
如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现Error,那么,到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。
【报错2】:如果启动 Hadoop 时遇到输出非常多“ssh: Could not resolve hostname xxx”的异常情况,如下图所示:
这个并不是 ssh 的问题,可通过设置 Hadoop 环境变量来解决。在 ~/.bashrc 中,增加如下两行内容(设置过程与 JAVA_HOME 变量一样,其中 HADOOP_HOME 为 Hadoop 的安装目录):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
【报错3】:此外,若是 DataNode 没有启动,可尝试如下的方法(注意这会删除 HDFS 中原有的所有数据,如果原有的数据很重要不要这样做!!!):
# 针对 DataNode 没法启动的解决方法(不建议!会删除 HDFS 中原有的所有数据,如果原有的数据很重要不要这样做!!!)
cd /usr/local/hadoop
./sbin/stop-dfs.sh # 关闭
rm -r ./tmp # 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format # 重新格式化 NameNode
./sbin/start-dfs.sh # 重启
测试:
运行 WordCount 实例:
bin/hdfs dfs -mkdir -p /user/hadoop # 创建HDFS目录
bin/hdfs dfs -mkdir input
bin/hdfs dfs -put etc/hadoop/*.xml input # 将配置文件作为输入
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
bin/hdfs dfs -cat output/* # 查看输出
也可将运行结果取回到本地:
rm -r ./output # 先删除本地的 output 文件夹(如果存在)
./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机
cat ./output/*
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
./bin/hdfs dfs -rm -r output # 删除 output 文件夹
6. 关闭 Hadoop
cd /usr/local/hadoop
sbin/stop-dfs.sh # 关闭守护进程
(二)、Hadoop 集群配置
假定有两台机器:
Master 192.168.1.121
Slave1 192.168.1.122
Hadoop 集群配置过程:
选定一台机器作为 Master,在所有主机上配置网络映射
在 Master 主机上配置hadoop用户、安装SSH server、安装Java环境
在 Master 主机上安装Hadoop,并完成配置
在其他主机上配置hadoop用户、安装SSH server、安装Java环境
将 Master 主机上的Hadoop目录复制到其他主机上
开启、使用 Hadoop
所有主机配置hadoop用户、安装SSH server、安装Java环境:
sudo useradd -m hadoop -s /bin/bash # 创建hadoop用户
sudo passwd hadoop # 修改密码
sudo adduser hadoop sudo # 增加管理员权限
# 注销并使用 Hadoop 用户登录
sudo apt-get update # 更新apt
sudo apt-get install vim # 安装vim
sudo apt-get install openssh-server # 安装ssh
再配置好java的JDK环境
所有主机配置网络映射:
sudo vim /etc/hostname # 修改主机名
sudo vim /etc/hosts # 修改主机与 IP 的映射关系
sudo reboot # 重启,使网络配置生效
在 Master 主机上执行:
cd ~/.ssh
ssh-keygen -t rsa # 一直按回车就可以
cat ~/id_rsa.pub >> ~/authorized_keys
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ # 传输公钥到Slave1
接着在 Slave1 节点上执行
cd ~
mkdir .ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
在Master节点上进行Hadoop集群配置(位于 /usr/local/hadoop/etc/hadoop中):
文件 slave:
将原来 localhost
删除,把所有Slave的主机名写上,每行一个。
文件 core-site.xml:
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
文件 hdfs-site.xml:
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master: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>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
文件 mapred-site.xml(首先需执行 cp mapred-site.xml.template mapred-site.xml):
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
文件 yarn-site.xml:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
配置好后,在 Master 主机上,将 Hadoop 文件复制到各个节点上:
cd /usr/local
rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo tar -zcf ./hadoop.tar.gz ./hadoop
scp ./hadoop.tar.gz Slave1:/home/hadoop
在 Slave1 上执行:
sudo tar -zxf ~/hadoop.tar.gz -C /usr/local
sudo chown -R hadoop:hadoop /usr/local/hadoop
最后在 Master 主机上就可以启动hadoop了:
cd /usr/local/hadoop/
bin/hdfs namenode -format
sbin/start-dfs.sh
sbin/start-yarn.sh
jps # 判断是否启动成功
若成功启动,则Master节点启动了NameNode、SecondrryNameNode、ResourceManager进程,Slave节点启动了DataNode和NodeManager进程。
在 Master 主机上执行WordCount实例:
bin/hdfs dfs -mkdir -p /user/hadoop
bin/hdfs dfs -put etc/hadoop input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
二、使用
Hadoop的伪分布式,读取的是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录“/user/hadoop
”:
cd /usr/local/hadoop
./bin/hdfs dfs -mkdir -p /user/hadoop
此时,分布式文件系统有了用户 /user/hadoop
注意:
在HDFS中创建与当前Linux系统登录用户hadoop对应的用户目录“user/hadoop
”,这里:
- Linux系统的hadoop用户,是用来部署hadoop环境的。我们选择部署了伪分布式模式。
- 这里为了使用伪分布式的HDFS,故再创建分布式文件系统的用户目录/user/hadoop。(与上一条中的hadoop用户是两码事!)
其他hdfs的常用操作命令
其他hdfs的常用操作命令是根据linux命令模仿出来的,用法上大多数都差不多,写法上稍加改动即可。
1)新建目录:mkdir
用法:./bin/hdfs dfs -mkdir 伪分布式HDFS中的目录
例子:在hdfs(分布式文件系统中/user/hadoop)中创建目录input:
cd /usr/local/hadoop
./bin/hdfs dfs -mkdir input # 等价:./bin/hdfs dfs -mkdir /user/hadoop/input
此时分布式文件系统/user/hadoop/下就有了/user/hadoop/input/目录。
注:上面的命令有三种写法:
./bin/hdfs dfs -mkdir input # 只能适用于HDFS文件系统
./bin/hadoop dfs -mkdir input # 与hdfs dfs命令作用都一样。即也只能适用于HDFS文件系统
./bin/hadoop fs -mkdir input # 适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
2)将本地文件上传到hdfs中:put
用法:./bin/hdfs dfs -put 本地目录 伪分布式HDFS中的目录
例子:再将 /usr/local/hadoop/etc/hadoop/ 目录下的所有 xml 文件作为输入文件,上传复制到分布式文件系统的 /user/hadoop/input中:
cd /usr/local/hadoop
./bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input/ # 等价:./bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml /user/hadoop/input
# 即简写为:./bin/hdfs dfs -put etc/hadoop/*.xml input
3)将hdfs中文件下载到本地:get
用法:./bin/hdfs dfs -get 伪分布式HDFS中的目录 本地目录
例子:将伪分布式HDFS中的目录input/中的所有内容下载到本地目录
cd /usr/local/hadoop
# 将整个input目录及目录下的所有内容都拷下来
./bin/hdfs dfs -get input /本地目录 # 等价:./bin/hdfs dfs -get /user/hadoop/input /本地目录
# 将整个input目录下的所有内容都拷下来,但不拷input目录
./bin/hdfs dfs -get input/* /本地目录 # 等价:./bin/hdfs dfs -get /user/hadoop/input/* /本地目录
4)查看目录:ls
用法:./bin/hdfs dfs -ls 伪分布式HDFS中的目录
例子:查看伪分布式HDFS中的目录input,
cd /usr/local/hadoop
./bin/hdfs dfs -ls input # 等价:./bin/hdfs dfs -ls /user/hadoop/input
结果:
4)查看文件:cat
用法:./bin/hdfs dfs -cat 伪分布式HDFS中的目录名/文件名
例子:查看伪分布式HDFS中的目录input下的core-site.xml文件内容,
cd /usr/local/hadoop
./bin/hdfs dfs -cat input/core-site.xml # 等价:./bin/hdfs dfs -cat /user/hadoop/input/core-site.xml
5)删除:rm
用法:./bin/hdfs dfs -rm 伪分布式HDFS中的文件名 ./bin/hdfs dfs -rm -r 伪分布式HDFS中的目录名
例子:删除hdfs中的input/core-site.xml文件;删除hdfs中的input目录
cd /usr/local/hadoop
# 删除hdfs中的input/core-site.xml文件
./bin/hdfs dfs -rm input/core-site.xml # 等价: ./bin/hdfs dfs -rm -r /hadoop/user/input/core-site.xml
# 删除hdfs中的input目录
./bin/hdfs dfs -rm -r input # 等价: ./bin/hdfs dfs -rm -r /hadoop/user/input
更多推荐
所有评论(0)