大数据集群环境部署
Hadoop
# 安装解压,移动到/usr/local/src/
export HADOOP_HOME=/usr/local/src/hadoop-3.3.1
export JAVA_HOME=/usr/local/src/jdk1.8.0_211
export export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
# 使用source命令让立即生效
source /etc/profile
# 测试是否安装成功
hadoop version
# 本次测试所用软件及环境
1、CentOS-7
2、VMware-15
3、Jdk-1.8
4、Mysql-5.7
5、Hadoop-3.3.1
6、Hive-3.1.2
7、HBase-2.4.4
8、Zookeeper-3.4.10
1、下载Hadoop
2、安装3个虚拟机实现ssh面密码登陆
2.1 安装3个虚拟机
# 使用的Linux系统是Centos7,安装三个机器(我们操作时使用root用户)
#用ifconfig命令查看3台机器的ip
# 如果没有ifconfig命令可以使用ip addr命令
# 设置机器名称
为了方便使用,必须正确设置机器名称和ip对应,使用 hostname 命令,查看机器名称
观察是不是自己想要设置的机器名称,如果不是则使用 hostname (你的机器名)
例应为: hostname gm.com
再使用hostname命令,观察是否更改
类似的,更改其他两台机器gm.com-1和gm.com-2
# 配置/etc/hosts文件
修改3台机器的/etc/hosts文件,向文件中添加以下内容
192.168.1.85 gm.com
192.168.5.93 gm.com-1
192.168.5.94 gm.com-2
IP号为自己机器名对应的IP
# 给三台机器生成密钥文件
使用命令 ssh-keygen -t rsa -P ''
回车至生成文件
因为是root用户,密钥文件保存到了/root/.ssh/目录下,可以使用命令查看:
ls /root/.ssh/
该目录下生成两个文件文件 id_rsa 和 id_rsa.pub
# 在gm.com上创建authorized_keys文件
接下来将3台机器的/root/.ssh/目录下都存入一个相同文件,文件名authorized_keys,内容为刚刚生成的密钥。
使用命令 touch /root/.ssh/authorized_keys 生成文件
使用命令 ls /root/.ssh/ 查看是否生成文件
使用命令 vi authorized_keys 并将三个主机中的/root/.ssh/id_rsa.pub内容复制ji进去
我的 authorized_keys文件显示为三个主机/root/.ssh/id_rsa.pub的内容
最后保存后,将gm.com中的authorized_keys文件复制到gm.com-1,gm.com-2
可以使用 xftp 工具
# 在gm.com上进行测试
输入命令 ssh gm.com-1
键入 y 后,显示如下内容则证明ssh成功
输入命令 exit 退出 ssh 远程连接
再键入 ssh gm.com-2
最后在gm.com-1、gm.com-2上进行同样的测试,保证三台机器之间可以免密登陆
# 安装Java和Hadoop
1 安装jdk
2 安装hadoop
在opt下新建hadoop文件,并将hadoop-3.3.1.tar.gz放入
进入该目录 cd /opt/hadoop
解压该文件 tar -zxvf hadoop-3.3.1.tar.gz
移动至 mv hadoop-3.3.1 /usr/local/src/
注:三台机器都需要进行上述操作 *** 重点
# 3 修改etc/hadoop中的配置文件
注:除了个别提示,其余文件只用修改gm.com中的即可
# 3.1 修改core-site.xml
文件最后<configuration> </configuration> 替换为
<configuration>
<property>
<name>fs.defaultFS</name>
<!-- gm.com为当前机器名或者ip号 -->
<value>hdfs://gm.com:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<!-- 以下为存放临时文件的路径 -->
<value>/usr/local/src/hadoop-3.3.1/data/tmp</value>
</property>
</configuration>
# 3.2 修改hadoop-env.sh
将export JAVA_HOME=${JAVA_HOME}
修改为:
export JAVA_HOME= 你jdk的安装路径
# 以下为我的设置
# 该文件的配置需要三台机器都配置
# 3.3 修改hdfs-site.xml
# 文件最后<configuration> </configuration> 替换为
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<!-- gm.com 修改为你的机器名或者ip -->
<value>gm.com:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>dfs.replication</name>
<!-- 备份次数 -->
<value>2</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/hadoop/data</value>
</property>
# 3.4 修改mapred-site.xml
文件最后<configuration> </configuration> 替换为
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
# 3.5 修改 workers
全部删除后加入之前设置的主机名或者ip
gm.com
gm.com-1
gm.com-2
# 3.6 修改yarn-site.xml文件
文件最后<configuration> </configuration> 替换为
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<!-- 你的机器号或者ip -->
<value>gm.com</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<!-- cpu个数 需要根据当前机器cpu设置 -->
<value>1</value>
</property>
</configuration>
# 启动Hadoop
1 在namenode上初始化
因为gm.com是namenode,gm.com-1和gm.com-2都是datanode,所以只需要对gm.com进行初始化操作,也就是对hdfs进行格式化。
在gm.com中进入 /usr/local/src/hadoop-3.3.1/bin 执行 cd /usr/local/src/hadoop-3.3.1/bin
执行初始化脚本,也就是执行命令:./hdfs namenode -format
等待一会后,不报错返回 “Exiting with status 0” 为成功,“Exiting with status 1”为失败
2 在namenode上执行启动命令
进入gm.com中的/usr/local/src/hadoop-3.3.1/sbin 执行cd /usr/local/src/hadoop-3.3.1/sbin
直接执行./start-all.sh 观察是否报错,如报错执行一下内容
$ vim sbin/start-dfs.sh
$ vim sbin/stop-dfs.sh
在空白位置加入
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
$ vim sbin/start-yarn.sh
$ vim sbin/stop-yarn.sh
在空白位置加入
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
$ vim start-all.sh
$ vim stop-all.sh
TANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
配置完毕后执行./start-all.sh
3 查看Hadoop进程
输入命令 jps
如果出现6个进程则为配置正确
输入http://192.168.1.85:50070 则可以看到
hdfs dfsadmin -safemode leave; //退出安全模式
hdfs dfsadmin -safemode get; //查看安全模式状态
hdfs dfsadmin -safemode forceExit; //强制退出安全模式
Java
# 因为Hadoop是用Java语言编写的,所以计算机上需要安装Java环境,我在这使用JDK 1.8.0_211(推荐使用Sun JDK)
# 配置JAVA环境变量,在当前用户根目录下的/etc/profile文件最下面加入以下内容:
export JAVA_HOME=/usr/local/src/jdk1.8.0_211
export PATH=$JAVA_HOME/bin:$PATH
# 使用source命令让立即生效
source /etc/profile
# 测试是否安装成功
java -version
Hive 3.1.2安装(基于Centos7.x和Hadoop3.3.1)
https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/
背景
Hadoop大数据套件被应用后,进行数据处理就必须编写mapreduce代码。而相当一部分大数据处理需求都是进行数据的查询操作(实际数据库的操作中,读写操作比例也有80%:20%的说法)
Facebook的工程师也遇到这个问题。编写mapreduce对于程序员还是有一定门槛,但是会使用sql的人群更庞大。所以Facebook就发明了Hive,一个把sql语句转换为mapreduce代码的转换器。
不过Hive的使用场景,还是会有一些限制。既然是sql语句,则Hive转换的mapreduce所需要处理的数据就需要有结构跟数据库数据一样。同时Hive将sql转换为mapreduce代码是通过类似模板的操作
注意,Hive只是把Sql语句转换为mapreduce代码,也就是一个转换器。所以一般不需要安装集群,安装在一个节点即可。如果担心损坏,一般安装2台,切换者使用也可。
1. 安装环境
Centos7.x 安装教程
Hadoop 3.3.1
yarn安装教程
hdfs安装教程
mysql5.7mysql安装教程
hive 3.1.2
mysql 驱动(mysql-connector-java-5.1.43.jar, 可以去maven或者其他仓库获取)
2. 安装步骤
正常启动HDFS和YARN
在hadoop安装目录的sbin下,有一个start-all.sh脚本,当hdfs和yarn的配置都设置好之后,可以一键启动hdfs和yarn
如果不想使用这个一键启动脚本,也可以分别调用start-dfs.sh和start-yarn.sh2个脚本
安装mysql
查看mysql是否运行
netstat -nltp | grep 3306
tcp 0 0 0.0.0.0:3306
systemctl start mysqld 启动mysql服务
配置mysql的开机自启服务 systemctl enable mysqld
开启远程连接权限
登录mysql:
mysql -uroot -proot
执行sql语句:
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1; 这个两个设置以后 密码很简单不会报错
开启远程连接权限:
mysql > grant all privileges on . to ‘root’@’%’ identified by ‘123456’ with grant option;
mysql > flush privileges;
mysql启动正常 开启远程连接
可以使用windows安装的navicat连接linux上的mysql服务器验证以下
上传hive的安装包
使用rz软件,或者其他方式如secureCRT的alt+p切换到上传模式,将压缩包上传到第三方软件安装目录下。linux一般第三方软件安装在opt或者usr目录下。我的是安装到/opt/apps目录下
在软件包所在目录下,执行解压缩的shell指令
tar -zxf apache-hive-3.1.2-bin.tar.gz
修改配置信息
在Hive的安装目录下,找到conf目录,我的目录路径如下opt/apps/hive-3.1.2/conf。将原本的脚本重命名.
cp hive-env.sh.template hive-env.sh
编辑hive-env.sh脚本,添加内容。使用vi命令打开文件
vi hive-env.sh
修改hive-env.sh
因为 Hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:
文本中,添加内容如下。第一行是指定hadoop的安装路径,第二行是指定Hive安装目录下的conf目录的路径。
export HADOOP_HOME=/opt/apps/hadoop-3.2.1/
export HIVE_CONF_DIR=/opt/apps/hive-3.1.2/conf/
在运行hive之前,必须创建两个路径/tmp和/user/hive/warehouse后,这样才能在hive中创建库和表
$HADOOP_HOME/bin/hadoop fs -mkdir /tmp
$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hive/warehouse
$HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp
$HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
创建一个配置文件(在conf目录下)
执行如下shell命令
vi hive-site.xml
将以下内容拷贝到这个新创建的xml文件中,注意替换javax.jdo.option.ConnectionURL值的mysql所在主机域名,注意替换mysql的账号和用户名。
<configuration>
<!-- 记录HIve中的元数据信息 记录在mysql中 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://doit01:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<!-- jdbc mysql驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- mysql的用户名和密码 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>
<!-- 日志目录 -->
<property>
<name>hive.querylog.location</name>
<value>/user/hive/log</value>
</property>
<!-- 设置metastore的节点信息 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://gm.com:9083</value>
</property>
<!-- 客户端远程连接的端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.server2.webui.host</name>
<value>0.0.0.0</value>
</property>
<!-- hive服务的页面的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>
<property>
<name>hive.server2.long.polling.timeout</name>
<value>5000</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>true</value>
</property>
<property>
<name>hive.execution.engine</name>
<value>mr</value>
</property>
</configuration>
编辑Hadoop安装目录中,配置文件中的core-site.xml文件,我的路径如下/opt/apps/hadoop-3.3.1/etc/hadoop/core-site.xml
执行以下shell命令,使用vi打开这个文件(如果喜欢vim,也可以使用yum 安装vim软件,比vi更强大,可配置更多功能)
vi /opt/apps/hadoop-3.3.1/etc/hadoop/core-site.xml
打开后,在中添加以下三条配置信息,这些是关于hdfs的访问权限配置信息。
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
拷贝一个mysql的jdbc驱动jar包到hive的lib目录中
将上面提到的mysql的驱动jar包,拷贝到Hive安装目录的lib目录下
重启Hadoop的hdfs和yarn
cd到Hadoop安装目录下的sbin目录,有一键停止hdfs和yarn的脚本
执行以下shell脚本
stop-all.sh
start-all.sh
补充,实际一键启动和停止脚本本身内容就是分别调用了单独启动hdfs和yarn的脚本
解决hadoop3.3.1和hive3.1.2的冲突问题
先把hive的lib目录下的guava-19.jar删除或者加一个后缀名如.bak
rm -rf xxx 这是删除指令
mv xxx xxx.bak这是修改文件名指令(在jar包文件后加.bak后缀,就可以让系统不再认为这是一个jar包,和删除一样的效果)
再从Hadoop的安装目录下拷贝更高版本的guava的jar包到hive的lib目录下,具体路径如下
hdfs下的guava所在路径:/opt/apps/hadoop-3.3.1/share/hadoop/common/lib/guava-27.0-jre.jar
hive中放置guava jar包路径: /opt/apps/hive-3.1.2/lib/
cp /opt/apps/hadoop-3.2.1/share/hadoop/common/lib/guava-27.0-jre.jar /opt/apps/hive-3.1.2/lib/
启动元数据服务(暂时不要执行这条指令,否则会报错) hive --service metastore
后期运行可后台启动,防止窗口关闭,元数据服务关闭 nohup hive --service metastore &
本身Hadoop 3.3.1可以和Hive3.1.2完美兼容,但是Hadoop3.3.1和Hive3.1.2就不是很兼容,需要解决jar包冲突,这里执行这个指令,会报错。如果执行了,请忽略,继续执行下面的步骤。
初始化hive的元数据库
在Hive的bin目录下,执行以下shell指令。如果细心可以使用ll -a,会发现schematool 是一个可执行文件,文件读写执行的三个权限,最后一个权限是x,可执行。
./schematool -initSchema -dbType mysql
这时候,在mysql数据库中,多出一个hive数据库 ,这是记录元数据信息的
这时候,在HDFS中的目录中, 根目录下有一个user目录,路径:/user/hive
在linux中配置hive的环境变量
linux的环境变量都是在/etc/profile文件中,注意linux的环境变量分割符号是冒号: windows操作系统环境变量分隔符是分号;
执行以下shell命令
打开配置文件
vi /etc/profile
在文件中添加环境变量
export HIVE_HOME=/opt/apps/hive-3.1.2
让配置文件生效
source /etc/profile
启动hive
在Hive的bin目录下,或者任务路径下,输入 hive 这个指令,就可以启动Hive
出现如下效果,说明安装成功
输入以下sql语句,进行功能验证
show databases;
create database db_doit;
create table if not exists tb_user (id int , name string) ;
show tables ;
# 修改版本编号
select * from VERSION;
update VERSION set VERSION_COMMENT='3.1.2' where VER_ID=1;
update VERSION set SCHEMA_VERSION='3.1.2' where VER_ID=1;
HBase
# 安装路径
wget https://mirrors.cnnic.cn/apache/hbase/2.4.4/hbase-2.4.4-bin.tar.gz
1. 安装环境
Centos 7.x
Jdk 1.8
ZK 3.4.4
Hadoop 3.3.1
下载完成后,解压后移至/usr/local/src/
tar -zxvf hbase-2.4.4-bin.tar.gz
mv hbase-2.4.4 /usr/local/src/
scp -r zookeeper-3.4.10/ root@gm.com-2:/usr/local/src
配置环境变量
# vim /etc profile
# 文件中追加以下内容
export HBASE_HOME=/home/hbase-2.4.4
export PATH=$HBASE_HOME/bin:$PATH
# 保存退出,然后source /etc/profile刷新以下环境变量
修改配置文件
cd /usr/local/src/hbase-2.4.4/conf
vi hbase-env.sh
# 加入如下配置
export JAVA_HOME=/usr/local/src/jdk1.8.0_211/
export HBASE_LOG_DIR=/usr/local/src/hbase-2.4.4/logs
export HBASE_MANAGES_ZK=false # 关闭HBase自动单机版ZK
vi hbase-site.xml
#加入如下配置
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://192.168.1.85:9000/hbase</value>
<description>指定Region服务器共享的目录,用来持久存储HBase的数据,URL必须完全正确,其中包含了文件系统的schema。默认值"${hbase.tmp.dir}/hbase"</description>
</property>
<!--HBase的运行模式,false是单机模式,true是分布式模式,若为false则hbase和zk回运行在一个jvm中-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--本地文件的存放目录-->
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
<!-- <property>-->
<!-- <name>dfs.replication</name>-->
<!-- <value>3</value>-->
<!-- <description>-->
<!-- </description>-->
<!-- </property>-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>gm.com:2181,gm.com-1:2181,gm.com-2:2181</value>
<description>配置zookeeper集群地址,不要指定znode路径,HBase会默认将元数据放在根znode</description>
</property>
<!-- 配置主从节点的心跳超时时间,将允许的最大误差时间设为120秒 -->
<property>
<name>hbase.master.maxclockskew</name>
<value>120000</value>
</property>
<!--指定Zookeeper数据存储目录-->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/src/zookeeper-3.4.10/data</value>
</property>
<!-- ********** HMaster相关配置 ********** -->
<property>
<name>hbase.master.info.bindAddress</name>
<value>192.168.1.85</value>
<description>HBase Master 的 Web UI绑定的地址,默认值为"0.0.0.0"</description>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
<description>HBase Master绑定端口,默认值为:"60000"</description>
</property>
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
<description>HBase Master的Web UI端口,默认值为:"16010",如果不想启动UI实例,则可以将当前参数设置为-1</description>
</property>
<!-- ********** HRegionServer相关配置 ********** -->
<property>
<name>hbase.regionserver.port</name>
<value>16020</value>
<description>HBase RegionServer绑定的端口,默认值为:"16020".</description>
</property>
<property>
<name>hbase.regionserver.info.port</name>
<value>16030</value>
<description>HBase RegionServer的Web UI端口,默认值为:"16030"设置为-1可以禁用HBase RegionServer的Web UI。</description>
</property>
<property>
<name>hbase.regionserver.info.bindAddress</name>
<value>0.0.0.0</value>
<description>HBase RegionServer的Web UI地址,默认值为"0.0.0.0"</description>
</property>
</configuration>
vi regionservers
#加入各节点名称
gm.com
gm.com-1
gm.com-2
# hbase shell 进入shell脚本界面,操作数据库
问题:
1、若报错显示未找到slf4j,请如下操作
http://www.java2s.com/Code/Jar/s/Downloadslf4jnop172jar.htm
slf4j-nop-1.7.2.jar下载地址
2、hadoop配置文件中core-site.xml 与 hbase-site.xml中服务ip名称地址务必一致
查看集群安全模式状态
hdfs dfsadmin -safemode get
# 如果返回Safe mode is OFF 就说明没问题
# 如果返回Safe mode is ON 就说明集群正处于安全模式(强制退出即可)
hdfs dfsadmin -safemode leave
# 如果返回其他就说明集群出问题了 例如 返回如下内容
safemode: Call From hadoop01/192.168.100.100 to hadoop01:8020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
检查之后发现是namenode掉了,重启了一下集群.
建议执行完上述的操作之后重启hbase