2020 / 11 / 24
别问,问就是繁琐。
对自己的记忆力不太放心,也算是对近期实践的一个回顾,记录一下完全分布式 Hadoop 生态组件的基本搭建流程。
实质上,集群搭建只是繁琐,你只要熟悉一些基本的 Linux 命令,再简单理解一下集群架构就能很快上手,再把手翻过来,就会了。
所以严格来说,这应该算是一次 Linux 基本命令训练。
本文内容包括:
环境要求:
建议使用国内镜像源:
国外源(备用):
环境变量:
/etc/profile
,对所有用户生效,容错更高软件安装路径:
/usr/local
搭建集群前,为方便集群的启动和文件传递,主要要确保以下配置:
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
为了方便集群间通信,设置了主机别名
查询内网 IP ifconfig
cat > ~/etc/hosts << EOF
10.104.0.1 master
10.104.0.2 slave1
10.104.0.3 slave2
EOF
生成密钥公钥 ssh-keygen -t rsa
拷贝公钥到信任授权列表 ssh-copy-id -i id_rsa.pub master
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/local/java-se-8u41-ri
export HADOOP_HOME=/usr/local/hadoop-2.9.2
export ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.5.8-bin
export HIVE_HOME=/usr/local/apache-hive-2.3.7-bin
export JAVA_BIN=\$JAVA_HOME/bin
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
export HADOOP_CONF_DIR=\$HADOOP_HOME/etc/hadoop
export PATH=\$JAVA_HOME/bin:\$ZOOKEEPER_HOME/bin:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:\$HIVE_HOME/bin:\$PATH
EOF
生效环境变量 source /etc/profile
解压 tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C /usr/local
测试 java -version
cat > output.log << EOF
是 heredoc 语法 ,可以多行追加\覆盖写内容到文件,简洁易用
core-site.xml
cat > $HADOOP_HOME/etc/hadoop/core-site.xml << EOF <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>fs.checkpoint.period</name> <value>60</value> </property> <property> <name>fs.checkpoint.size</name> <value>67108864</value> </property> </configuration> EOF
hdfs-site.xml
cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF <configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/tmp/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/tmp/data</value> </property> </configuration> EOF
mapred-site.xml
cat > $HADOOP_HOME/etc/hadoop/mapred-site.xml << EOF <configuration> <property> <!--指定Mapreduce运行在yarn上--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> EOF
yarn-site.xml
cat > $HADOOP_HOME/etc/hadoop/yarn-site.xml << EOF <configuration> <!-- 指定ResourceManager的地址--> <property> <name>yarn.resourcemanager.address</name> <value>master:18040</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:18030</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:18088</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:18025</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:18141</value> </property> <!-- 指定reducer获取数据的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration> EOF
master
cat > $HADOOP_HOME/etc/hadoop/master << EOF master EOF
slaves
cat > $HADOOP_HOME/etc/hadoop/slaves << EOF slave1 slave2 EOF
手动配置以下文件中的 JAVA_HOME
scp -r $HADOOP_HOME slave1:$HADOOP_HOME
scp -r $HADOOP_HOME slave2:$HADOOP_HOME
hdfs namenode -format
启动节点: start-dfs.sh
、start-yarn.sh
检测节点状态: hdfs dfsadmin -report
刷新节点状态: hdfs dfsadmin -refreshNodes
MySQL 简单的外表下藏露着凶恶,是我们练习过程中踩坑踩得最多的地方,主要原因是 MySQL 的版本之间差异很大,做同一件事情的命令可能因为版本区别而存在差异,所以建议 Google 过程中带上 MySQL 版本号。
https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
https://dev.mysql.com/downloads/repo/yum
添加 YUM 源
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm -P ./
yum localinstall mysql80-community-release-el7-3.noarch.rpm
编辑默认版本
yum-config-manager --enable mysql56-community
或者手动编辑 /etc/yum.repos.d/mysql-community.repo
安装
yum install mysql-community-server
配置初始密码
service mysqld start grep 'temporary password' /var/log/mysqld.log mysql_secure_installation
修改密码策略并开启远程访问
SHOW VARIABLES LIKE 'validate_password%';
SET GLOBAL validate_password_length = 6;
SET GLOBAL validate_password_number_count = 0;
SET GLOBAL validate_password_policy=LOW;
ALTER USER 'root'@'%' IDENTIFIED BY 'newpassword';
GRANT ALL ON *.* to user@'%' IDENTIFIED BY 'newpassword';
service mysqld stop # 关闭 MySQL-Server
service mysqld --user=mysql --skip-grant-tables # 跳过密码临时开启 MySQL-Server 并挂起
# 另外开一个 MySQL-Client
mysql
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';
$HIVE_HOME/conf/hive-env.sh
cat > $HIVE_HOME/conf/hive-env.sh << EOF # 配置 Hadoop 安装路径 export HADOOP_HOME=$HADOOP_HOME # 配置 Hive 配置文件存放路径 export HIVE_CONF_DIR=$HIVE_HOME/conf # 配置 Hive 运行资源库路径 export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib EOF
master 和 slaves 节点的配置文件不完全相同,这是因为各个节点所承担的角色,完成的任务不同所导致的,
在完全分布式模式中,Hive 分为 Server\Client
任务分工:
配置文件:
Hive-Server(slave2)
cat > $HIVE_HOME/conf/hive-site.xml << EOF <configuration> <!-- Hive产生的元数据存放位置--> <property> <name>hive.metastore.warehouse.dir</name> <value>/root/hive/warehouse</value> </property> <!-- 数据库连接driver,即MySQL驱动--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <!-- 数据库连接JDBC的URL地址--> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://slave1:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value> </property> <!-- MySQL数据库用户名--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- MySQL数据库密码--> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> <!--shemas自动管理配置--> <property> <name>datanucleus.metadata.validate</name> <value>false</value> </property> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <property> <name>datanucleus.schema.autoCreateAll</name> <value>true</value> </property> </configuration> EOF
Hive-Client(slave1, master)
cat > $HIVE_HOME/conf/hive-site.xml << EOF <configuration> <!-- Hive产生的元数据存放位置--> <property> <name>hive.metastore.warehouse.dir</name> <value>/root/hive/warehouse</value> </property> <!--- 使用本地服务连接Hive,默认为true--> <property> <name>hive.metastore.local</name> <value>false</value> </property> <!-- 连接服务器--> <property> <name>hive.metastore.uris</name> <value>thrift://slave2:9083</value> </property> </configuration> EOF
导入 JDBC 驱动到 $HIVE_HOME/lib
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar -P $HIVE_HOME/lib
schematool -initSchema -dbType mysql
http://www.hadooplessons.info/2017/12/log-files-in-hadoop-eco-system.html
查报错、对文档 是最基本的操作,这个少不了
Logs 文件常见类型有:
下面是组件默认日志文件的位置、及日志文件所在的配置文件位置:
Hadoop:
Zookeeper:
Hive:
MySQL:
Hadoop 文档:
http://www.hadoop.org/hadoop-project-dist/hadoop-common/core-default.xml
http://www.hadoop.org/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
http://www.hadoop.org/hadoop-project-dist/hadoop-hdfs-rbf/hdfs-rbf-default.xml
http://www.hadoop.org/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
http://www.hadoop.org/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
For a basic single node configuration here the web interfaces (hadoop1 is my hostname):