使用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
bannerAds