Hadoop
2018-11-25 本文已影响0人
436048bfc6a1
注: 如果使用虚拟机的话,请将网络适配器设置为NAT并且将防火墙关闭并且将防火墙开机自启动也一并关闭,selinux选择disabled,
- 广义和狭义
广义: 以hadoop为主的生态圈
狭义: 专指hadoop
- Hadoop 2.x的组成
出现大数据组件原因: 对于mysql来说,mysql处理超过1亿行的表效率差,需要将mysql数据同步到大数据平台
一般使用HDFS存储
HDFS: 分布式文件系统
mapreduce: 分布式计算(缺点: 开发难度高,计算慢, 被hive sql/ spark替代)
yarn: 资源(内存, cpu) + 作业(job) 的调度管理系统
- Hadoop 2.x介绍
(1). Hadoop是Apache基金会,特点是可靠,可伸缩,分布式的计算框架
(2). 企业一般选择CDH/Ambari部署, 因为一般不会只部署hadoop
(3). CDH代表什么:
cloudera对hadooop源码进行添加新功能或者修复bug之后,就变成CDH版本,在使用时,跟apache版本没有差别。
- 安装Hadoop
预处理
(1) 设置/etc/selinux中SELINUX=disabled
(2) 设置/etc/hosts中
192.168.198.129 hadoop001
(3) 设置/etc/sysconfig/network
HOSTNAME=hadoop001
(4) 切换到root用户,关闭防火墙
service iptables stop
(5) 禁止防火墙开机自启动
chkconfig iptables off
(1) 新建hadoop用户
useradd hadoop
(2) 给hadoop用户赋予sudo权限
编辑/etc/sudoers文件
添加
hadoop ALL=(ALL) NOPASSWD: ALL
(3) 切换到hadoop用户
su - hadoop
在hadoop的home directory下创建source software app三个文件夹
mkdir source software app
解压tar文件夹到app文件夹
- Hadoop前置软件
(1) java(推荐jdk1.7)
(2) ssh
- 配置文件
(1) 进入刚才解压好的hadoop文件夹,然后进入当前路径下的etc/hadoop文件夹,修改hadoop-env.sh文件
修改1:
将export JAVA_HOME=${JAVA_HOME}
修改为export JAVA_HOME=/usr/java/jdk1.7.0_79
修改2:
添加 export HADOOP_PREFIX=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
(2) 测试修改
运行$HADOOP_PREFIX/bin/hadoop,如果出现如下显示,说明配置成功
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
credential interact with credential providers
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
trace view and modify Hadoop tracing settings
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
- 启动Hadoop集群的三种模式
Local (Standalone) Mode: 单机模式
没有进程
Pseudo-Distributed Mode: 伪分布式
只有一台机器,有进程,用于学习
Fully-Distributed Mode: 分布式
生产中, 有进程
- 以伪分布式启动
(1) 配置$HADOOP_PREFIX/etc/core-site.xml
!!!!!!!!!!!注意
配置文件的字母大小写(坑了我一中午)
配置$HADOOP_PREFIX/etc/hadoop/core-site.xml
在其内部添加如下配置
<configuration>
<property>
<name>fs.defaultFS</name>
<!--hadoop代表的是机器名称-->
<value>hdfs://hadoop001:9000</value>
</property>
</configuration>
(2) 配置$HADOOP_PREFIX/etc/hdfs-site.xml
在其内部添加如下
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(3) 配置无密码访问
在terminal输入如下命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa(生成一个key's randomart image)
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
此时会出现一个坑
-rw-rw-r--. 1 hadoop hadoop 358 Nov 37 25:65 authorized_keys
此时authorized_keys的权限为644,会出问题
所以将其权限改为600
(4) 格式化文件系统
输入 bin/hdfs namenode -format
(5) 启动dfs
开始namenode进程和datanode进程
执行$HADOOP_PREFIX/sbin/start-dfs.sh
启动之后,输入jps显示启动的dfs进程
9757 NameNode
9854 DataNode
10050 SecondaryNameNode
10153 Jps
(6) 在web界面访问hdfs
在浏览器输入$ip_address: 50070
(7) 在$HADOOP_PREFIX/etc/hadoop文件夹下
执行 cp mapred-site.xml.template mapred-site.xml
在mapred-site.xml下编辑
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(8) 在yarn-site中编辑
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle </value>
</property>
</configuration>
(9) 启动yarn
$HADOOP_PREFIX/sbin/start-yarn.sh
输入jps,显示如下
9757 NameNode
9854 DataNode
15734 ResourceManager
15822 NodeManager
10050 SecondaryNameNode
15852 Jps
(10) 打开yarn的web界面
ip_address:8088
注意: 在iptables开放端口
- 进行Map-reduce job
(1) linux与HDFS
linux是文件系统, HDFS是分布式文件系统,HDFS是架在linux之上的,所以HDFS都是以如下形式开头
HDFS dfs -
之后再加linux命令
(1) 在HDFS上创建/user/$user_name文件夹
在$HADOOP_PREFIX目录下执行./bin/hdfs dfs -mkdir -p /user/$user_name
(2) 将linux上$HADOOP_PREFIX/etc/hadoop里的文件拷贝到hdsf文件夹input上
bin/hdfs dfs -put etc/hadoop input
注: 没有指定默认是放在HDFS中的/user/hadoop文件夹
(4) 运行官网给的测试MapReduce
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar grep input output 'dfs[a-z.]+'
运行输出如下
INFO mapreduce.Job: map 0% reduce 0%
INFO mapreduce.Job: map 3% reduce 0%
INFO mapreduce.Job: map 7% reduce 0%
INFO mapreduce.Job: map 10% reduce 0%
INFO mapreduce.Job: map 13% reduce 0%
INFO mapreduce.Job: map 17% reduce 0%
INFO mapreduce.Job: map 20% reduce 0%
INFO mapreduce.Job: map 23% reduce 0%
INFO mapreduce.Job: map 27% reduce 0%
INFO mapreduce.Job: map 30% reduce 0%
INFO mapreduce.Job: map 33% reduce 0%
INFO mapreduce.Job: map 37% reduce 0%
INFO mapreduce.Job: map 40% reduce 0%
INFO mapreduce.Job: map 40% reduce 13%
INFO mapreduce.Job: map 43% reduce 13%
INFO mapreduce.Job: map 47% reduce 13%
INFO mapreduce.Job: map 53% reduce 13%
INFO mapreduce.Job: map 57% reduce 17%
INFO mapreduce.Job: map 57% reduce 19%
INFO mapreduce.Job: map 60% reduce 19%
INFO mapreduce.Job: map 63% reduce 20%
INFO mapreduce.Job: map 67% reduce 20%
INFO mapreduce.Job: map 70% reduce 22%
INFO mapreduce.Job: map 73% reduce 22%
INFO mapreduce.Job: map 73% reduce 24%
INFO mapreduce.Job: map 77% reduce 24%
INFO mapreduce.Job: map 77% reduce 26%
INFO mapreduce.Job: map 80% reduce 26%
INFO mapreduce.Job: map 83% reduce 26%
INFO mapreduce.Job: map 87% reduce 28%
INFO mapreduce.Job: map 90% reduce 28%
INFO mapreduce.Job: map 90% reduce 30%
INFO mapreduce.Job: map 93% reduce 30%
INFO mapreduce.Job: map 100% reduce 31%
INFO mapreduce.Job: map 100% reduce 100%
注:
(1) 其中map指的是map函数与reduce函数,都为递归函数
(2) map函数还未完成,reduce函数就开始运行
(5) 将HDFS文件夹下载到linux文件夹
bin/hdfs dfs -get output output
- HDFS三个进程全部以hadoop001启动
(1) 问题发现
当运行stop-dfs.sh时输出如下
Stopping namenodes on [hadoop001]
hadoop001: stopping namenode
localhost: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode
此时Secondary namenodes在0.0.0.0上,但是我们想要让secondary namenode也在hadoop001上启动
(2) 设置
NN修改的是core-site.xml
DN修改的是slaves文件
SNN: 由于SNN是HDFS组件服务的进程,所以去hdfs-default.xml中修改(可以从官网configuration侧边栏找到)
在hdfs-site.xml中添加
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop001:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>hadoop001:50091</value>
</property>
- JPS命令
(1) jps来源
/usr/java/jdk1.7.0_79/bin/jps
也就是说jps来自于java
(2) root用户看JPS, 会如下显示
32573 Jps
31530 -- process information unavailable
31648 -- process information unavailable
31808 -- process information unavailable
此时并不知道上述进程是否真的存在
对于process information unavailable的正确处理方式
a. 找到其进程号
b. ps -ef | grep pid 确认该进程是否存在
if exsit:
可以知道哪个用户运行此进程
su - 用户, 切换到该用户进去查看
else if 不存在:
手动删除此文件夹
其残留信息都保存在/tmp/hsperdata_hadoop文件夹下
如下显示
-rw------- 1 hadoop hadoop 32768 Dec 3 04:30 31530
-rw------- 1 hadoop hadoop 32768 Dec 3 04:30 31648
-rw------- 1 hadoop hadoop 32768 Dec 3 04:29 31808
当删除某一个文件夹, 如删除31530, 再执行JPS显示如下
32965 Jps
31648 -- process information unavailable
31808 -- process information unavailable
注: 未经过ps -ef确认该进程存在就直接删除是不好的,
因为即使删除/tmp/hsperdata_hadoop下的文件,
该进程仍然存在,但是基于jps的监控等shell文件认为该进程消失,
从而采取一系列措施
12 ssh
(1) 端口号为22
(2) [hadoop@hadoop001 ~]$ ssh 192.168.110.120
代表以hadoop用户去连接192.168.110.120的机器
(3) ssh root@192.168.110.120 date
连接云主机并将date结果返回给客户端
(4) 两个linux系统之间如何传输
a. scp
eg. scp test.md 192.168.110.120:/home/hadoop
将本地test.md传到远程主机上
scp 192.168.110.120:/home/hadoop/test.md newTest.md 将育成主机上的文件传回来
b. ssh多台机器互相信任关系
假如云主机是生产机器,无法有密码,想要互相传输文件就需要配置相互信任关系
配置相互信息关系的步骤
a. ssh-keygen
b. 此时在.ssh文件夹下会生成如下文件
-rw------- 1 hadoop hadoop 1675 id_rsa
-rw-r--r-- 1 hadoop hadoop 398 id_rsa.pub
c. cat id_rsa.pub >> authorized_keys
(注: chmod 700 -R ~/.ssh并且chmod 600 ~/.ssh/authorized_keys)
d. 将远程主机的id_rsa.pub文件scp到本机上
scp 192.168.110.120:/home/hadoop/id_rsa.pub id_rsa.pub1
e. cat id_rsa.pub1 >> authorized_keys
f. 在 /etc/hosts上配置多台机器的ip和host的对应关系(注意)
g. 将authorized_keys用scp命令传输到另外的主机
- hadoop目录
drwxr-xr-x 2 hadoop hadoop 4096 Mar 23 2016 bin 命令都保存与此文件夹
drwxr-xr-x 3 hadoop hadoop 4096 Mar 23 2016 sbin 启动脚本和停止脚本都保存在此文件夹
drwxr-xr-x 6 hadoop hadoop 4096 Mar 23 2016 etc 配置文件都保存与此文件夹 其他大数据组件有可能以config conf命令此类文件夹
drwxr-xr-x 3 hadoop hadoop 4096 Mar 23 2016 lib 存储jar包
drwxr-xr-x 2 hadoop hadoop 4096 Mar 23 2016 bin-mapreduce1
drwxr-xr-x 3 hadoop hadoop 4096 Mar 23 2016 cloudera
drwxr-xr-x 5 hadoop hadoop 4096 Mar 23 2016 examples
drwxr-xr-x 3 hadoop hadoop 4096 Mar 23 2016 examples-mapreduce1
drwxr-xr-x 2 hadoop hadoop 4096 Mar 23 2016 include
drwxr-xr-x 2 hadoop hadoop 4096 Mar 23 2016 libexec
-rw-r--r-- 1 hadoop hadoop 17087 Mar 23 2016 LICENSE.txt
drwxrwxr-x 3 hadoop hadoop 4096 Dec 17 06:45 logs
-rw-r--r-- 1 hadoop hadoop 101 Mar 23 2016 NOTICE.txt
drwxrwxr-x 2 hadoop hadoop 4096 Dec 2 06:50 output
-rw-r--r-- 1 hadoop hadoop 1366 Mar 23 2016 README.txt
drwxr-xr-x 4 hadoop hadoop 4096 Mar 23 2016 share
drwxr-xr-x 17 hadoop hadoop 4096 Mar 23 2016 src