2.7 Mac上安装Hadoop
在我和Hadoop打交道的十年中,经历了几种安装Hadoop的方法。一种常见的方法是使用Hortonworks或Cloudera的安装包,在多个物理的Linux机器(操作系统是CentOS 6.5)上安装和配置。最近几年我们转向AWS,在AWS上使用脚本安装和部署Hadoop和集群(分别为生产环境、staging环境和开发环境)。还可以在个人Mac机器上安装Hadoop作为个人练习之用。
2.7.1 在Mac上安装Hadoop
本节我们在Mac机器上安装Hadoop。下面是我在MacBook Pro机器上安装的步骤,具体详细信息可参见Hadoop官网:https://hadoop.apache.org/docs/r3.1.1/hadoop-project-dist/hadoop-common/ SingleCluster.html。注意,我安装的是本书成稿时的最新版本3.1.1,模拟分布式环境(Pseudo-Distributed)。模拟分布式环境就是模拟Hadoop集群,不是单机版。安装Hadoop的步骤如下:
步骤01 确保你的Mac机器上安装了Homebrew和Java(推荐Java 1.8)。
步骤02 启动Terminal,配置ssh如下:
(1)运行“ssh-keygen –t rsa”以生成ssh key。
(2)运行“cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys”。
(3)创建或添加以下内容到~/.ssh/config文件中。这个配置文件的作用是自动装载key到ssh代理程序中,并在keychain上保存你在(1)步骤上创建key时所输入的文本信息(passphrases)。
(4)运行“ssh-add –K ~/.ssh/id_rsa”把key添加到ssh代理程序中,并在keychain上保存你在创建key时所输入的文本信息。
(5)启动远程登录。在“System Preferences”→“Sharing”上,针对“Remote Login”,如图2-9所示,在右边选择所有用户“All users”。
(6)运行“ssh localhost”,确保看到“Last login:”等信息,这表明配置SSH成功。
步骤03 开始安装Hadoop。运行“brew install hadoop”来安装最新版的Hadoop。安装完成后,就可以在/usr/local/Cellar/hadoop/下找到刚刚安装的Hadoop软件。
步骤04 在~目录下创建.profile,添加以下内容后,运行“source ~/.profile”。
export HADOOP_HOME=/usr/local/Cellar/hadoop/3.1.1/libexec export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HIVE_HOME=/usr/local/Cellar/hive/3.1.1/libexec export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HIVE_HOME/bin
图2-9 设置远程登录
步骤05 配置Hadoop:
(7)配置hadoop-env.sh:
$ cd /usr/local/Cellar/hadoop/3.1.1/libexec/etc/hadoop $ vi hadoop-env.sh
在这个文件中,设置JAVA_HOME(请根据你的JAVA实际路径做调整)和HADOOP_HOME:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/ Contents/Home export HADOOP_HOME=/usr/local/Cellar/hadoop/3.1.1/libexec
(8)运行“vi $HADOOP_HOME/ etc/hadoop/core-site.xml”,配置core-site.xml:
(9)运行“vi $HADOOP_HOME/ etc/hadoop/hdfs-site.xml”,配置hdfs-site.xml:
请注意,上面是用于设置数据备份的。在实际的生产系统上千万不要设置为1。Hadoop会自动使用备份,如果没有备份,那就麻烦了。
步骤06 运行“$HADOOP_HOME/bin/hdfs namenode –format”格式化文件系统。
步骤07 运行“$HADOOP_HOME/sbin/start-dfs.sh”以启动HDFS。在Mac机器上可以忽略如下警告信息:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
步骤08 简单测试Hadoop:
(1)输入“hadoop version”,应该得到如下类似的输出结果:
(2)在浏览器中输入http://localhost:9870/查看名字节点NameNode(注:老版本的端口号是50070),如图2-10所示。
图2-10 HDFS NameNode
注意
· 检查上图的“Configured Capacity”的大小,如果不是0,则说明DataNode运行基本正常。如果是0,就要检查Hadoop日志文件。
· Hadoop日志文件在$HADOOP_HOME/logs下,找到带有DataNode名字的最新日志文件。这个文件中会说明不成功的原因。例如:
Directory /usr/local/Cellar/hadoop/hdfs/tmp/dfs/data is in an inconsistent state: Can't format the storage directory because the current directory is not empty.
· DataNode是建立在/usr/local/Cellar/hadoop/hdfs/tmp/dfs/data上。根据上面的错误信息,这时可以删除它下面的文件夹和文件来修复。
步骤09 输入如下命令来测试HDFS:
$ hdfs dfs -mkdir /user $ hdfs dfs -mkdir /user/zhenghong $ hdfs dfs -mkdir input $ hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml input $ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar grep input output 'dfs[a-z.]+' $ hdfs dfs -cat output/*
上述命令在HDFS创建了input目录,把本地文件系统上的xml文件复制到HDFS的input目录中,并运行了一些测试程序。在output目录上的内容为:
1 dfsadmin 2 dfs.replication
(1)在mapred-site.xml和yarn-site.xml中配置YARN:
(2)运行“start-yarn.sh”以启动YARN,如图2-11所示。
(3)在浏览器中输入http://localhost:8088/以访问资源管理器。
图2-11 查看集群中的所有应用
2.7.2 安装MySQL和Hive
在MySQL的官网https://dev.mysql.com/doc/refman/8.0/en/osx-installation-pkg.html上,列出了在Mac上安装MySQL的详细步骤。首先下载.dmg文件,然后双击安装文件,按照提示就可以完成软件安装。在安装过程中,会提示你输入root账号的密码。安装后,运行“mysql –u root –p”进入MySQL,然后执行SQL语句(例如show tables来查看表)。
下面我们安装和配置Hive:
步骤01 运行“brew install hive”来安装Hive。
步骤02 在“.profile”上设置HIVE_HOME(如果还没设置的话):
export HIVE_HOME=/usr/local/Cellar/hive/3.1.1/libexec export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$HIVE_HOME/bin
运行“source .profile”。
步骤03 在Hive端设置JDBC驱动程序如下:
(1)从MySQL官网上下载JDBC驱动程序(我选择了Platform Independent版本):
http://dev.mysql.com/downloads/connector/j/
(2)运行以下命令,解压缩驱动程序,复制到Hive端:
tar xvf mysql-connector-java-8.0.13.tar cd mysql-connector-java-8.0.13 cp mysql-connector-java-8.0.13.jar /usr/local/Cellar/hive/3.1.1/ libexec/lib/
步骤04 运行“mysql –u root -p”,在MySQL上配置metastore如下:
mysql> CREATE DATABASE metastore; mysql> USE metastore; mysql> SOURCE $HIVE_HOME/scripts/metastore/upgrade/mysql/hive-schema-3.1.0.mysql.sql; mysql> CREATE USER 'zhenghong'@'%' IDENTIFIED BY '*password*'; mysql> GRANT all on *.* to 'zhenghong'@localhost; mysql> flush privileges;
在$HIVE_HOME/bin下,有一个工具,schematool,也可以执行“schematool –dbType mysql –initSchema”来生成metastore表结构。
步骤05 配置hive-site.xml文件:
$ cd $HIVE_HOME/conf $ cp hive-default.xml.template hive-site.xml
在hive-site.xml文件中,设置连接MySQL的metastore数据库等信息:
步骤06 创建/tmp和/user/hive/warehouse(即:hive.metastore.warehouse.dir)如下:
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
步骤07 测试Hive。使用create语句(例如create table hive2 (char1 char(2));)创建一个表,插入2行数据(insert into hive2 select cast("1b" as char(2));),查看数据(select * from hive2;),如图2-12所示。
图2-12 查看数据
步骤08 如果在浏览器中输入http://localhost:8088/,那么就能看到刚刚运行的应用。
我们看一下上面的配置,这样是不是把连接数据库的信息全泄露了,你可能会说,大家都是同公司的,泄露也无所谓,但我们想一下,在一个大的公司里,大数据平台是几个部门共用的,这样泄露MySQL的信息的风险还是挺大的。Hive的另一个组件MetaStoreServer就能解决这个问题。等于说,我们在Hive CLI与MySQL中间启动一个MetaStoreServer,Hive CLI就不需要连接MySQL,直接连接这个MetaStoreServer了。在hive-site.xml中只需要简单地配置一下:
这样我们就通过metastore数据库取得了元数据的信息。当然如果只是一个MetaStore,则存在单点问题,不过我们可以配置两个或者多个MetaStoreServer,这样就实现了负载均衡与容错的功能了,如下面的配置: