2018-09-11 17:49:27
0. 引言
hadoop 集群,初学者顺利将它搭起来,肯定要经过很多的坑。经过一个星期的折腾,我总算将集群正常跑起来了,所以,想将集群搭建的过程整理记录,分享出来,让大家作一个参考。 1. 集群环境和版本说明3台CentOS 7.4 的服务器,4CPU,8G内存; jdk 1.8 hadoop 2.7.7 spark 2.3.0 hive 2.1.1 节点和主机hostname对应关系: 主节点: 172.18.206.224 nn1 Namenode and YARN Resourcemanage 从节点1: 172.18.206.228 dn1 Datanode and YAR Nodemanager 从节点2: 172.18.206.229 dn2 Datanode and YARN Nodemanager 为hadoop集群,创建一个non-root 用户,我使用的用户名是 hadoop。安装目录统一在hadoop用户的家目录 /data/hadoop 下。 2. hadoop 集群安装2.1 安装 jdk 1.8版本由于 hadoop 集群需要java 环境的支持,所以,在安装集群之前,首先确认你的系统是否已经安装了jdk,检查如下: [root@ND-ES-3 ~]# java -version openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) 如果没有安装 jdk 1.8 以上的版本,则需要卸载旧版本重新安装,在这里,我选择的jdk是oracal提供的版本,其他公司提供的jdk,我测试的时候,好像和apache hadoop 不兼容,总是报错。
下载 : jdk-8u181-linux-x64.rpm , rpm -ivh jdk-8u181-linux-x64.rpm 安装完成后,检查 java -version 输出正确,就可以了。 2.2 修改 /etc/hosts 文件,实现ssh免密码登录
在 nn1,dn1 和 dn2 服务器上修改 /etc/hosts 文件,方便主机之间通过hostname也能够访问通信: 172.18.206.224 nn1 nn1.cluster1.com 172.18.206.228 dn1 dn1.cluster1.com 172.18.206.229 dn2 dn2.cluster1.com 其实使用,什么hostname,都是可以的,看使用习惯。 创建 hadoop 用户:在所有服务器上创建,可以先不用密码 useradd -d /data/hadoop/ hadoop
然后,在nn1 上为hadoop 创建密钥文件,用来ssh 免密码登录,这是为了在后面hadoop集群通信时,不需要每次都输入密码,那么麻烦。 su - hadoop ssh-key-gen -t rsa mv id_rsa.pub authorized_keys chmod 0700 /data/hadoop/.ssh chmod 0600 /data/hadoop/.ssh/authorized_keys 然后将 authorized_keys 和 id_rsa 密钥对复制到其他两台主机的 /data/hadoop/.ssh 目录。 测试,用hadoop ssh 登录其他两台服务器: [root@ND-ES-3 ~]# su - hadoop Last login: Mon Sep 10 09:32:13 CST 2018 from 183.6.128.86 on pts/1 [hadoop@ND-ES-3 ~]$ ssh dn1 Last login: Thu Sep 6 15:49:20 2018 Welcome to Alibaba Cloud Elastic Compute Service ! [hadoop@ND-DB-SLAVE ~]$ [hadoop@ND-ES-3 ~]$ ssh dn2 Last login: Fri Sep 7 16:43:04 2018 Welcome to Alibaba Cloud Elastic Compute Service ! [hadoop@ND-BACKUP ~]$
默认第一次ssh登录的时候,需要输入确认接收 密钥登录的,直接确认就可以了。 2.3 安装 hadoop-2.7.7安装过程比较简单,先下载对应版本的压缩包,再解压缩就可以使用了,我选的版本是 hadoop-2.7.7.tar.gz。 tar -xvzf /usr/local/src/hadoop-2.7.7.tar.gz mv hadoop-2.7.7 /data/hadoop/ 2.4 设置hadoop的环境变量
可以修改 hadoop 家目录 /data/hadoop/.bash_profile文件 ## JAVA env variables export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar ## HADOOP env variables export HADOOP_HOME=/data/hadoop/hadoop-2.7.7 export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 注意根据自己的实际情况修改其中的路径。 然后, source ~/.bash_profile 使变量设置生效。 2.5 修改hadoop配置文件 core-site.xmlvi /data/hadoop/hadoop-2.7.7/etc/hadoop/core-site.xml
2.6 修改 hdfs-site.xml
2.7 修改 mapred-site.xml
2.8 修改 yarn-site.xml
2.9 修改 slaves 文件,添加两个slave 主机的ip地址
2.10 修改 hadoop-env.sh将 hadoop-env.sh 文件里的 JAVA_HOME 修改为:
2.11 将 /data/hadoop/hadoop-2.7.7 安装目录复制到dn1和dn2两台服务器> scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn1:/data/hadoop/ > scp -r /data/hadoop/hadoop-2.7.7 hadoop@dn2:/data/hadoop/ 2.12 在 nn1 创建 NameNode 目录
2.13 在dn1和dn2 创建 datanode 目录
2.14 关闭 selinux 和 iptables 防火墙
2.15 在 nn1 格式化 namenode
2.16 启动hadoop 集群(只在nn1 操作就可以了)
2.17 检查在 nn1 : $ jps 3042 NameNode 3349 SecondaryNameNode 3574 ResourceManager 11246 Jps 在 dn1或者 dn2: $ jps 26642 NodeManager 14569 Jps 26491 DataNode 检查是否有两个激活的节点[hadoop@ND-ES-3 ~]$ hdfs dfsadmin -report Configured Capacity: 3246492319744 (2.95 TB) Present Capacity: 2910313086244 (2.65 TB) DFS Remaining: 2907451403556 (2.64 TB) DFS Used: 2861682688 (2.67 GB) DFS Used%: 0.10% Under replicated blocks: 34 Blocks with corrupt replicas: 0 Missing blocks: 0 Missing blocks (with replication factor 1): 0 ------------------------------------------------- Live datanodes (2): Name: 172.18.206.228:50010 (dn1) Hostname: dn1 Decommission Status : Normal Configured Capacity: 1082119344128 (1007.80 GB) DFS Used: 1430839296 (1.33 GB) Non DFS Used: 161390100480 (150.31 GB) DFS Remaining: 864172031634 (804.82 GB) DFS Used%: 0.13% DFS Remaining%: 79.86% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 3 Last contact: Mon Sep 10 17:26:59 CST 2018 Name: 172.18.206.229:50010 (dn2) Hostname: dn2 Decommission Status : Normal Configured Capacity: 2164372975616 (1.97 TB) DFS Used: 1430843392 (1.33 GB) Non DFS Used: 9560809472 (8.90 GB) DFS Remaining: 2043279371922 (1.86 TB) DFS Used%: 0.07% DFS Remaining%: 94.41% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 3 Last contact: Mon Sep 10 17:26:59 CST 2018 [hadoop@ND-ES-3 ~]$
如果上面的检查都通过了,那么hadoop集群就已经顺利搭建了。
或者通过 8088端口,查看resource manager资源情况:
OK,以上就是hadoop集群的搭建过程,下面,我们继续搭建spark集群。 3. 安装 spark on yarn首先,spark 和hadoop 的yarn 整合后的运行模式有两种,一种是client模式,另一种是cluster 模式。默认情况下,spark 安装之后,会以cluster模式运行,一般我们都选择cluster 模式。具体client模式和cluster模式的原理是什么,请大家有兴趣的,可以去搜索更多的文档来阅读。 3.1 下载并安装 spark我使用的 spark版本是:
上传到服务器 /usr/local/src/ 目录,然后解压:
现在,spark已经安装在 /data/hadoop/spark 目录了。 3.2 添加系统关于 spark 的一些环境变量在 /data/hadoop/.bash_profile 文件添加: ## spark export SPARK_HOME=/data/hadoop/spark export HADOOP_CONF_DIR=/data/hadoop/hadoop-2.7.7/etc/hadoop export LD_LIBRARY_PATH=/data/hadoop/hadoop-2.7.7/lib/native:$LD_LIBRARY_PATH export PATH=/data/hadoop/spark/bin:$PATH 然后,使配置生效:
这里其实有一个问题,这样每次添加环境变量,那么 PATH变量就会变得越来越长,如果你用的服务器是生产环境长时间都不会重启的,那也没办法了。 3.3 修改 spark-env.xml复制安装包里,自带的官方模板文件:
添加如下的内容: export SPARK_HOME=/data/hadoop/spark #export SCALA_HOME=/lib/scala export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) export HADOOP_HOME=/data/hadoop/hadoop-2.7.7 #export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop #export YARN_CONF_DIR=$YARN_HOME/etc/hadoop #export SPARK_LOCAL_DIRS=/data/haodop/spark export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native #export SPAR_MASTER_PORT=7077 export SPARK_MASTER_HOST=nn1 上面的配置中,有些注释掉的就是不用的,我复制过来,就不改了。 3.4 修改 slaves 文件
3.5 修改 spark-defaults.cof将官方的复制一份:
添加如下的配置:
spark.eventLog.enabled true spark.eventLog.dir hdfs://nn1:9000/spark-logs spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider spark.history.fs.logDirectory hdfs://nn1:9000/spark-logs spark.history.fs.update.interval 10s spark.history.ui.port 18080 这个文件主要是配置spark的内存使用或者分配的,如果你对 memory allocation的分配不熟悉,暂时可以不配置这个文件,让spark按照默认的参数运行,也是可以的。
3.6 测试 spark
如果上面的环境变量设置都没有问题,那么可以进行下面的简单例子测试。
spark 自带了一些例子。以上是计算圆周率的例子以及部分输出的内容。如果计算成功,在输出结束后,你往上翻,会看到:
3.7 将 spark 的安装目录复制到其他节点
复制完成之后,注意修改 dn1 和 dn2 节点上的 /data/hadoop/.bash_profile的系统变量 3.8 启动spark
启动spark 前,要确认 hadoop集群已经在运行,
为了省事,一次性启动所有master和worker:
3.9 检查启动情况nn1 启动情况: [hadoop@ND-ES-3 conf]$ jps 3042 NameNode 8627 RunJar 3349 SecondaryNameNode 3574 ResourceManager 10184 Master 10332 Worker 4654 Jps dn1 和 dn2: [hadoop@ND-DB-SLAVE ~]$ jps 26642 NodeManager 10679 Jps 29960 Worker 26491 DataNode [hadoop@ND-DB-SLAVE ~]$ 看到 worker 和 master 启动就可以了。 4. 安装scala
在安装完spark 之后,先安装 scala ,过程比较简单,
修改scalac 的PATH 变量:
# scala export SCALA_HOME=/lib/scala export PATH=${SCALA_HOME}/bin:$PATH 生效:
Ok,scala 就配置好,可以使用了。 5. 安装 hive
当你的hadoop 集群,和spark 集群都安装完成之后,就可以开始安装hive 了。 先将我自己在安装hive后,总结的一些坑写出来吧:
特别是第三点,在很多资料里都没提过的。如果发现自己配置已经做好了,在做测试验证的时候,总是不成功,那么,最好的办法,就是根据报错,一个个问题去解决。 5.1 安装mysql-5.7
hive需要和数据库结合使用,这样在进行SQL语句操作时就可以像操作mysql那样,不需要写复制的代码了。
创建用户和用户组
解压到指定目录
配置PATH目录
mysql目录资源规划
备注:考虑到数据和二进制日志比较大,需要软链,实际/data/mysql 在服务器的数据盘,磁盘空间充足,如果你不考虑磁盘空间问题,可以安装默认的路径安排。
备注:也可以只对 datadir 和 binlog 目录进行软连接
配置 my.cnf 文件
编辑 my.cnf
初始化数据库
在数据库会有一个临时密码生成,请记录下来,等会要用到: [hadoop@ND-ES-3 mysql]$ sudo grep 'temporary password' /usr/local/mysql/log/mysql_error.log 2018-09-08T05:03:32.509910Z 1 [Note] A temporary password is generated for root@localhost: <,Nhx3+7z)UY 生成ssl
设置启动项(CentOS 7)
输入如下内容: [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/usr/local/mysql/run/mysqld.pid # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables #ExecStartPre=/usr/bin/mysqld_pre_systemd # Start main service ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/run/mysqld.pid $MYSQLD_OPTS # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # Sets open_files_limit LimitNOFILE = 65535 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=false 加载并启动mysql
Securing the Initial MySQL Accounts 执行 /usr/local/mysql/bin/mysql_secure_installation 刚刚记录下来的临时密码在这里可以排上用场了,重新配置root密码,清空测试数据库,禁止匿名用户。 导入时区
安装完mysql,就可以正式开始hive 安装了 5.2. 安装hive相同的套路,将hive的安装包上传到服务器,然后解压缩,创建软连接,,我使用的版本是:apache-hive-2.1.1-bin.tar.gz
修改 PATH
生效:
下载mysql-connector 驱动
登录mysql数据库,创建一个用户,给hive连接用,设置好授权密码: grant all privileges on *.* to 'hive'@'%' identified by '123456'; 以上,创建了一个用户hive,它的密码是 123456; 整合spark 和 hive
这步不能少!!!
配置 hive-env.sh文件 #hadoop_home路径 HADOOP_HOME=/data/hadoop/hadoop-2.7.7 #hive配置文件存放路径 export HIVE_CONF_DIR=/data/hadoop/hive/conf #hive相关jar存放路径 export HIVE_AUX_JARS_PATH=/data/hadoop/hive/lib
配置 hive-site.xml 文件 修改,使用mysql connector: <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> 修改,配置msyql地址: <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://dn2:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> <description>JDBC connect string for a JDBC metastore</description> </property> 修改,数据库名字hive <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> <description>Username to use against metastore database</description> </property> 修改,连接mysql的密码是123456: <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> <description>password to use against metastore database</description> </property> 在/data/hadoop/hive 创建 temp 目录:
然后,继续修改hive-site.xml 文件中对应参数的<value>
2
3
创建以下的dfs 目录
然后,继续修改 hive-site.xml文件
2.
3.
4.
其他的修改,同样重要,
最后, 将 spark/jars 文件下得scala-library spark-core spark-network-common包复制到hive/lib下
这里要注意,如果spark-logs 路径没有创建,则需要先用hadoop创建:
另一个,spark需要开启日志记录的功能,参考上面提到的 spark-defaults.conf 文件。 OK,经过漫长的配置,终于将hive-site.xml 文件配置完成了。下面开始测试。 初始化hive元数据库
启动hive数据库 [hadoop@ND-ES-3 hive]$ hive which: no hbase in (/lib/scala/bin:/data/hadoop/spark/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/java/jdk1.8.0_181-amd64/bin:/data/hadoop/hadoop-2.7.7/sbin:/data/hadoop/hadoop-2.7.7/bin:/usr/local/mysql/bin:/data/hadoop/hive/bin:/data/hadoop/.local/bin:/data/hadoop/bin) SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/data/hadoop/hive-2.1.1/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/data/hadoop/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Logging initialized using configuration in file:/data/hadoop/hive-2.1.1/conf/hive-log4j2.properties Async: true hive> show databases; OK default Time taken: 0.769 seconds, Fetched: 1 row(s) hive> 刚开始的输出信息,不影响使用,只要show databases;命令能输出正确信息,就已经配置好了。 6. 结语
不得不说,配置这个 hadoop+spark+hive的环境,对于初学者来说确实太麻烦了。 (责任编辑:IT) |