Linux基础环境配置

hostname更改

配置三台服务器的主机名,便于识别,修改之后重新连接终端即可:

1
2
3
hostnamectl set-hostname master //在master上运行
hostnamectl set-hostname slave1 //在slave1上运行
hostnamectl set-hostname slave2 //在slave2上运行

ssh免密

在master的机器上运行(具体IP需要根据实际情况修改):

1
2
3
4
ssh-keygen #生成SSH公/私匙,默认使用rsa
ssh-copy-id root@192.168.1.1 #均需要输入三台主机的root账户密码
ssh-copy-id root@192.168.1.2
ssh-copy-id root@192.168.1.3

免密登陆测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@master ~]# ssh root@localhost
Last login: Fri Jul 17 11:31:48 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@master ~]# exit
登出
Connection to localhost closed.
[root@master ~]# ssh [email protected]
Last login: Fri Jul 17 11:31:44 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@slave1 ~]# exit
登出
Connection to 172.17.78.177 closed.
[root@master ~]# ssh [email protected]
Last login: Fri Jul 17 11:31:40 2020 from 42.230.242.170
Welcome to Alibaba Cloud Elastic Compute Service !
[root@slave2 ~]# exit
登出
Connection to 172.17.78.178 closed.

hosts更改

在master主机上运行vim /etc/hosts后添加(具体IP需要根据实际情况修改):

1
2
3
192.168.1.1 master
192.168.1.2 slave1
192.168.1.3 slave2

接着将hosts文件传输到slave1和slave2:
1
2
scp -r /etc/hosts root@192.168.1.2:/etc
scp -r /etc/hosts root@192.168.1.1:/etc


现在我们可以使用master,slave1,slave2来代替上述IP了,使用ping masterping slave1ping slave2即可测试

防火墙关闭

在master,slave1,slave2上均运行:

1
2
systemctl stop firewalld.service //停止防火墙
systemctl disable firewalld.service //禁止防火墙开机自启

ntp

  • 在master上安装ntpd服务:使用rpm -qa|grep ntpd检查安装,使用yum -y install ntpd进行在线安装。
  • 修改master的ntp.conf,使用vim /etc/ntp.conf

    • 添加如下内容:
      1
      restrict  master mask 255.255.255.0  nomodify notrap
    • 注释掉:
      1
      2
      3
      4
      #server  0.centos.pool.ntp.org
      #server 1.centos.pool.ntp.org
      #server 2.centos.pool.ntp.org
      #server 3.centos.pool.ntp.org
    • 取消注释:
      1
      2
      server  127.127.1.0  #  local clock
      fudge 127.127.1.0 stratum 10
  • 硬件时间同步,在/etc/sysconfig/ntpd后添加SYNC_HWCLOCK=yes
  • 启动ntpd服务,设置开机自启:
    1
    2
    service ntpd start
    chkconfig ntpd on
  • 在slave1与slave2上使用ntpdata master同步时间
  • 在slave1与slave2上配置定时任务:crontab -e后加入* * * * * /usr/sbin/ntpdate master,每分钟同步一次时间。

注:

  • *:取值范围内的所有数字;
  • /:每过多少数字;
  • -:取值范围;
  • ,:散列数字;
  • 例如:3,15 8-11 /2 * myCommand意为每两天上午8点到11点的第3与15分钟执行。

生态软件配置

注意:

  • 善用Tab补全文件名与路径

  • 所有安装包(Hadoop,JDK,Zookeeper,MySQL,Hive,Python)默认已解压到/root/software,如未下载请执行:wget https://hadoop-software.oss-cn-beijing.aliyuncs.com/software.zip

  • unzip如未安装,请使用 yum install unzip进行在线安装。

JDK

1
2
3
4
5
6
cd /root/software #进入软件目录
tar -zxvf jdk-8u171-linux-x64.tar.gz #解压
mv jdk1.8.0_171/ java #将原目录更名为java
echo -e 'export JAVA_HOME=/root/software/java\nexport PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile #将java加入环境变量
source /etc/profile #生效环境变量
java -version #测试环境变量

Hadoop

HDFS

  • 安装并配置基础环境
    1
    2
    3
    4
    5
    6
    7
    cd /root/software
    tar -zxvf hadoop-2.7.3.tar.gz #解压
    mv hadoop-2.7.3 hadoop #将原目录更名为hadoop
    echo -e 'export HADOOP_HOME=/root/software/hadoop\nexport PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> /etc/profile #将Hadoop路径加入环境变量
    source /etc/profile
    cd /root/software/hadoop/etc/hadoop
    echo "export JAVA_HOME=$JAVA_HOME" >> hadoop-env.sh #将Java路径加入hadoop-env中去
  • 配置集群,使用core-site.xml,在configuration中添加:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- HDFS集群中NameNode的URI(包括协议、主机名称、端口号),默认为 file:/// --> 
    <property>
    <name>fs.defaultFS</name>
    <!-- 用于指定NameNode的地址 -->
    <value>hdfs://master:9000</value>
    </property>
    <!-- Hadoop运行时产生文件的临时存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/root/hadoopData/temp</value>
    </property>
  • 配置文件系统 使用vim hdfs-site.xml,在configuration中添加:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- NameNode在本地文件系统中持久存储命名空间和事务日志的路径 -->
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/root/hadoopData/name</value>
    </property>
    <!-- DataNode在本地文件系统中存放块的路径 -->
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/root/hadoopData/data</value>
    </property>
    <!-- 数据块副本的数量,默认为3 -->
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>

YARN

  • 复制模板
    1
    2
    cd /root/software/hadoop/etc/hadoop
    cp mapred-site.xml.template mapred-site.xml
  • 配置mapred-site.xml,在configuration中添加:
    1
    2
    3
    4
    5
    <!-- 指定使用 YARN 运行 MapReduce 程序,默认为 local -->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
  • 配置yarn-site.xml,在configuration中添加:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- NodeManager上运行的附属服务,也可以理解为 reduce 获取数据的方式 -->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>

    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
    </property>
  • 配置主从机:
    1
    echo -e "slave1\nslave2" >> slaves
  • 复制配置文件:
    1
    2
    3
    cd /root/software/hadoop
    scp hadoop/etc/hadoop/* slave1:/root/software/hadoop/etc/hadoop/
    scp hadoop/etc/hadoop/* slave2:/root/software/hadoop/etc/hadoop
  • 启动与管理:
    • 在master上对HDFS进行格式化:hdfs namenode -format
    • 在master上启动全部dfs节点:start-dfs.sh
    • 在master上启动全部yarn节点:start-yarn.sh
    • 使用jps查看当前运行的Java进程

ZooKeeper

  • 安装并配置环境变量:
    1
    2
    3
    4
    5
    6
    7
    tar -zxvf zookeeper-3.4.10.tar.gz
    mv zookeeper-3.4.10 zoo
    echo -e "export ZOOKEEPER_HOME=/root/software/zoo\nexport PATH=.:$PATH:$ZOOKEEPER_HOME/bin" >> /etc/profile
    source /etc/profile
    cd zoo && mkdir data #新建data目录
    cd conf
    cp zoo_sample.cfg zoo.cfg
  • 在zoo.cfg中配置:
    1
    2
    3
    4
    dataDir=/root/software/zoo/data
    server.0=master:2888:3888
    server.1=slave1:2888:3888
    server.2=slave2:2888:3888
  • 进入data目录配置id:
    • master上:echo 0 >>myid
    • slave1上:echo 1 >>myid
    • slave2上:echo 2 >>myid
  • 启动与管理(需要在每台主机上启动):
    1
    2
    3
    zkServer.sh start #启动zookeeper服务器
    zkServer.sh status #查看服务器状态,follower/leader
    zkCli.sh #启动zookeeper客户端

最终效果

MySQL

MySQL仅安装在master上

  • 安装MySQL:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    rpm -qa|grep mariadb
    rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
    wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
    tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
    rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm
    如遇报错--initialize specified but the data directory has files in it. Aborting.,请清空/etc/my.cnf中datadir对应的目录(/var/lib/mysql),如下:

    如遇报错:
    1
    2
    3
    4
    5
    警告:mysql-community-server-5.7.29-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
    错误:依赖检测失败:
    libaio.so.1()(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要
    libaio.so.1(LIBAIO_0.1)(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要
    libaio.so.1(LIBAIO_0.4)(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要
    请使用yum install libaio安装libaio依赖。
  • 数据库初始化与开启:
    1
    2
    /usr/sbin/mysqld --initialize-insecure --user=mysql
    /usr/sbin/mysqld --user=mysql &
  • 配置MySQL信息,使用mysql -uroot进入MySQL Client:

    1
    2
    3
    4
    5
    mysql> alter user 'root'@'localhost' identified by '123456';
    mysql> use mysql; # 切换成mysql数据库
    mysql> select user,host from user; # 查询用户信息
    mysql> update user set host='%' where host='localhost'; # 设置远程登录权限
    mysql> flush privileges; # 刷新配置信息
  • 退出登录后使用mysql -uroot -p123456进行测试。

Hive

Hive仅安装在master上

  • 解压并配置HIVE环境变量与mysql的jar包:
    1
    2
    3
    4
    5
    6
    7
    cd /root/software
    tar -zxvf apache-hive-2.1.1-bin.tar.gz
    mv apache-hive-2.1.1-bin hive
    echo -e "export HIVE_HOME=/root/software/hive\nexport PATH=$PATH:$HIVE_HOME/bin" >> /etc/profile
    source /etc/profile
    cp mysql-connector-java-5.1.47-bin.jar hive/lib/
    cd hive/conf/
  • 配置hive-env. sh:
    1
    2
    cp hive-env.sh.template hive-env.sh
    vim hive-env.sh
  • 然后在hive-env.sh中配置HADOOP_HOME、HIVE_CONF_DIR 以及HIVE_AUX_JARS_PATH 参数:
    1
    2
    3
    4
    5
    6
    7
    8
    # 配置Hadoop安装路径
    HADOOP_HOME=/root/software/hadoop

    # 配置Hive配置文件存放路径
    export HIVE_CONF_DIR=/root/software/hive/conf

    # 配置Hive运行资源库路径
    export HIVE_AUX_JARS_PATH=/root/software/hive/lib
  • 配置hive-site.xml:
    1
    2
    cp hive-default.xml.template hive-site.xml
    vim hive-site.xml
  • 在hive-site.xml的configuration中添加:
    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
    </property>
    <property>
    <name>system:user.name</name>
    <value>${user.name}</value>
    </property>
  • 在hive-site.xml中修改(注意不是直接添加,否则默认值将覆盖修改值):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!--连接元数据库的链接信息 -->  
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hivedb?createDatabaseIfNotExist=true&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    <description>JDBC connect string for a JDBC metastore</description>
    </property>
    <property>
    <!--连接数据库驱动 -->
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
    </property>
    <!--连接数据库用户名称 -->
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>username to use against metastore database</description>
    </property>
    <!--连接数据库用户密码 -->
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
    </property>
  • 数据库初始化:schematool -initSchema -dbType mysql
  • 连接测试:hive

常见错误

修改后的配置文件需要同步到slave1与slave2上

  • 格式化后无法启动namenode,查看logs/hadoop-root-namenode-master.log:

    1
    2020-07-17 20:05:05,892 WARN org.apache.hadoop.hdfs.server.common.Util: Path /root/hadoopData/name should be specified as a URI in configuration files. Please update hdfs configuration.

    解决方法:
    在hdfs-site.xml中,将/root/hadoopData/name改为file:/root/hadoopData/name即可。

  • hive无法启动,报错:

    1
    Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D

    解决方法:
    在hive-site.xml的configuration中添加:

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>system:java.io.tmpdir</name>
    <value>/tmp/hive/java</value>
    </property>
    <property>
    <name>system:user.name</name>
    <value>${user.name}</value>
    </property>
  • 检查端口占用情况,使用netstat -tpnl
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@master ~]# netstat -tpnl
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 23498/java
    tcp 0 0 172.17.78.176:9000 0.0.0.0:* LISTEN 837/java
    tcp 0 0 0.0.0.0:50090 0.0.0.0:* LISTEN 1208/java
    tcp 0 0 172.17.78.176:3888 0.0.0.0:* LISTEN 23498/java
    tcp 0 0 0.0.0.0:50070 0.0.0.0:* LISTEN 837/java
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1031/sshd
    tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 19456/java
    tcp 0 0 0.0.0.0:40634 0.0.0.0:* LISTEN 23498/java
    tcp 0 0 0.0.0.0:8030 0.0.0.0:* LISTEN 19456/java
    tcp 0 0 0.0.0.0:8031 0.0.0.0:* LISTEN 19456/java
    tcp 0 0 0.0.0.0:8032 0.0.0.0:* LISTEN 19456/java
    tcp 0 0 0.0.0.0:8033 0.0.0.0:* LISTEN 19456/java
    tcp6 0 0 :::3306 :::* LISTEN 13962/mysqld
  • 初始化Hive时,报错schematool -dbType mysql -initSchema

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true
    Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
    Metastore connection User: APP
    Starting metastore schema initialization to 2.1.0
    Initialization script hive-schema-2.1.0.mysql.sql
    Error: Syntax error: Encountered "<EOF>" at line 1, column 64. (state=42X01,code=30000)
    org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
    Underlying cause: java.io.IOException : Schema script failed, errorcode 2
    Use --verbose for detailed stacktrace.
    *** schemaTool failed ***

    解决办法:

    • hive-default.xml.template需要更名为hive-site.xml,请注意hive-default.xml.template头部的警告信息:
    • 在hive-site.xml中修改而非增加数据库连接信息,否则默认值将会覆盖修改值。
    • 删除所有目录下的metastore_db目录,如下:
      1
      2
      3
      /usr/local/apache-hive-2.1.1-bin/bin
      /usr/local/apache-hive-2.1.1-bin/conf
      /usr/local/apache-hive-2.1.1-bin/scripts/metastore/upgrade/mysql`
  • MySQL安装时报错--initialize specified but the data directory has files in it. Aborting.,请清空/etc/my.cnf中datadir对应的目录(/var/lib/mysql),如下:

  • 关于vim的使用:

    • 启动vim后进入一般模式,按i插入,o在当前行后插入
    • 在一般模式下,输入/string便可在文件中查找string,按下n查找下一个
    • 一般模式下,按u撤销操作;dd删除当前行
    • 一般模式下yy复制当前行,p粘贴到当前行
    • 一般模式下,G跳转到文件末尾,gg跳转到文件开头
    • 如需批量注释文件,可以按下Ctrl+V进入可视乎编辑,上下方向键雪中需要注释的行,Shift+I在行首插入,输入#后按esc返回即可

参考文档

Hadoop 完全分布式(Fully Distributed)安装

HADOOP+SPARK+ZOOKEEPER+HBASE+HIVE集群搭建

centos7安装mysql(完整)

Zookeeper分布式安装配置