使用Homebrew在macOS上安装Apache Hadoop 3和Apache Hive 3
概要
-
- macOS 1台に Homebrew で Apache Hadoop と Apache Hive をインストールし、シングルノードで疑似分散モードのクラスターを構築する
-
- Hadoop の分散ファイルシステム HDFS (Hadoop Distributed File System) を使用する
-
- Apache Hive から HiveQL でテーブル作成・データ追加・データ参照する
- 今回の環境: macOS Catalina + Java 8 (AdoptOpenJDK 1.8.0_265) + Apache Hadoop 3.3.0 + Apache Hive 3.1.2
安装Java 8
如果您尚未安装Java 8,请使用Homebrew或其他方式进行安装,并验证JAVA_HOME所应设定的目录位置。
$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk8
$ /usr/libexec/java_home -v 1.8
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
由于Apache Hive不支持Java 9及更高版本,因此请注意,如果使用Java 9及更高版本,将会出现以下错误。
Exception in thread "main" java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
at org.apache.hadoop.hive.ql.session.SessionState.<init>(SessionState.java:413)
at org.apache.hadoop.hive.ql.session.SessionState.<init>(SessionState.java:389)
at org.apache.hadoop.hive.cli.CliSessionState.<init>(CliSessionState.java:60)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:705)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
安装Apache Hadoop和Apache Hive。
在自家酿造中安装 Apache Hive 会自动安装依赖关系的 Apache Hadoop。
$ brew install hive
确认Hadoop的版本。
$ hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4
This command was run using /usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/common/hadoop-common-3.3.0.jar
检查 Hive 版本。
$ hive --version
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/Cellar/hive/3.1.2_1/libexec/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/Cellar/hadoop/3.3.0/libexec/share/hadoop/common/lib/slf4j-log4j12-1.7.25.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]
Hive 3.1.2
Git git://HW13934/Users/gates/tmp/hive-branch-3.1/hive -r 8190d2be7b7165effa62bd21b7d60ef81fb0e4af
Compiled by gates on Thu Aug 22 15:01:18 PDT 2019
From source with checksum 0492c08f784b188c349f6afb1d8d9847
假设设置为分布式模式
設定檔案位於 /usr/local/Cellar/hadoop/3.3.0/libexec/etc/hadoop 中。
請按照以下方式修改 core-site.xml 和 hdfs-site.xml。
核心配置文件.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
修改hadoop.tmp.dir
在Hadoop中使用的数据存储目录默认为/tmp/hadoop-${user.name},因此在macOS重新启动等情况下,数据会丢失。
根据需要,可以通过在core-site.xml文件中添加以下关于hadoop.tmp.dir的配置来指定存储数据的目录。
<property>
<name>hadoop.tmp.dir</name>
<value>/Users/foo/hadoop</value>
</property>
设置 JAVA_HOME
在 /usr/local/Cellar/hadoop/3.3.0/libexec/etc/hadoop 目录下的 hadoop-env.sh 文件中写入 JAVA_HOME。指定的 JAVA_HOME JVM 还会被 Apache Hive 使用。
以下是指定通过Homebrew安装的AdoptOpenJDK 8的JAVA_HOME的示例。
export JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home"
允许远程登录
在macOS中,需要勾选“系统偏好设置”→“共享”中的“远程登录”选项并允许访问。
如果没有允许远程登录,则在Hadoop启动时会出现以下错误。
$ /usr/local/Cellar/hadoop/3.3.0/sbin/start-dfs.sh
Starting namenodes on [localhost]
localhost: ssh: connect to host localhost port 22: Connection refused
Starting datanodes
localhost: ssh: connect to host localhost port 22: Connection refused
Starting secondary namenodes [mymacos.local]
mymacos.local: ssh: connect to host mymacos.local port 22: Connection refused
没有设置密码的SSH配置
创建没有密码的密钥对,并将其添加到允许SSH连接的列表中。
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
如果已经存在 ~/.ssh/id_rsa 文件并且不想覆盖它,可以选择使用任意文件名创建。
例如,可以指定文件名为 id_rsa_for_my_hadoop。
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa_for_my_hadoop
$ cat ~/.ssh/id_rsa_for_my_hadoop.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
如果使用任意的文件名进行创建,可以在环境变量HADOOP_SSH_OPTS中描述Hadoop在使用ssh时指定的选项,以使用私钥的路径。HADOOP_SSH_OPTS应在hadoop-env.sh中进行设置。
$ export HADOOP_SSH_OPTS="-i ~/.ssh/id_rsa_for_my_hadoop"
如果无法使用本地主机进行无密码访问的SSH连接,则在启动Hadoop时可能会出现以下错误。
$ /usr/local/Cellar/hadoop/3.3.0/sbin/start-dfs.sh
Starting namenodes on [localhost]
localhost: Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
localhost: foo@localhost: Permission denied (publickey,password,keyboard-interactive).
Starting datanodes
localhost: foo@localhost: Permission denied (publickey,password,keyboard-interactive).
Starting secondary namenodes [mymacos.local]
mymacos.local: Warning: Permanently added 'mymacos.local' (ECDSA) to the list of known hosts.
mymacos.local: foo@mymacos.local: Permission denied (publickey,password,keyboard-interactive).
文件系统的格式化
在Hadoop中,使用HDFS(Hadoop分布式文件系统)来格式化环境。
$ hdfs namenode -format
Hadoop 的启动
启动管理HDFS的NameNode(元数据)和DataNode(数据实体)。
$ /usr/local/Cellar/hadoop/3.3.0/sbin/start-dfs.sh
“警告:util.NativeCodeLoader:无法为您的平台加载本地Hadoop库… 在适用的情况下使用内置Java类。” 这个警告会出现,但是由于这个本地库不支持macOS,所以可以忽略。
Apache Hadoop 3.3.0 – 本地库指南
原生hadoop库仅适用于*nix平台。该库无法与Cygwin或Mac OS X平台配合使用。
创建用于Hive的目录
在HDFS上创建用于Hive的目录。
$ hadoop fs -mkdir /tmp
$ hadoop fs -mkdir /user
$ hadoop fs -mkdir /user/hive
$ hadoop fs -mkdir /user/hive/warehouse
$ hadoop fs -chmod g+w /tmp
$ hadoop fs -chmod g+w /user/hive/warehouse
创建MetaStore
创建一个用于管理Hive相关信息的元数据存储。
$ schematool -initSchema -dbType derby
(中略)
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 3.1.0
Initialization script hive-schema-3.1.0.derby.sql
(中略)
Initialization script completed
schemaTool completed
启动Hive CLI
以交互模式启动Hive CLI。
$ hive
创建数据库
创建数据库
hive> create database foo_database;
OK
Time taken: 0.696 seconds
hive> show databases;
OK
default
foo_database
Time taken: 0.159 seconds, Fetched: 2 row(s)
创建表格
用CREATE TABLE命令创建表格。
将数据以逗号分隔的形式指定为列,并以换行分隔的形式指定为行作为数据的格式。
hive> create table foo_database.foo_table(
> id int,
> name string,
> updated_at timestamp)
> row format delimited
> fields terminated by ','
> lines terminated by '\n';
OK
Time taken: 0.887 seconds
hive> show tables from foo_database;
OK
foo_table
Time taken: 0.058 seconds, Fetched: 1 row(s)
在退出Hive CLI时,输入exit;。
hive> exit;
加载数据
准备一个按逗号分隔列,按换行符分隔记录的CSV文件,并将其放置在路径 /Users/foo/data.csv 下。文件内容如下所示。
100,Alice,2020-02-29 00:00:00.000000001
200,ボブ,1999-12-31 23:59:59
使用load data函数,通过指定CSV文件的路径将文件加载到表中。
hive> LOAD DATA LOCAL INPATH 'file:/Users/foo/data.csv' OVERWRITE INTO TABLE foo_database.foo_table;
Loading data to table foo_database.foo_table
OK
Time taken: 1.307 seconds
数据的查询 de
在执行查询时设置输出列名。
hive> set hive.cli.print.header=true;
使用select语句获取记录并进行显示。
hive> select * from foo_database.foo_table;
OK
foo_table.id foo_table.name foo_table.updated_at
100 Alice 2020-02-29 00:00:00.000000001
200 ボブ 1999-12-31 23:59:59
Time taken: 0.131 seconds, Fetched: 2 row(s)
停止 Hadoop
$ /usr/local/Cellar/hadoop/3.3.0/sbin/stop-dfs.sh
参考文献
家酿
-
- hadoop — Homebrew Formulae
- hive — Homebrew Formulae
Apache Hadoop 软件框架
-
- Hadoop – Apache Hadoop 3.3.0
-
- Apache Hadoop 3.3.0 – Hadoop: Setting up a Single Node Cluster.
-
- core-default.xml
- hdfs-default.xml
阿帕奇大蜂巢
-
- Apache Hive TM
-
- GettingStarted – Apache Hive – Apache Software Foundation
-
- Configuration Properties – Apache Hive – Apache Software Foundation
-
- LanguageManual DML – Apache Hive – Apache Software Foundation
-
- LanguageManual Types – Apache Hive – Apache Software Foundation
-
- CSV、TSV、およびカスタム区切りファイルの LazySimpleSerDe – Amazon Athena
- Hadoop+Hive検証環境を構築してみる (1/3):Hive――RDB使いのためのHadoopガイド(前編) – @IT