class Hbase < Formula
desc "Hadoop database: a distributed, scalable, big data store"
homepage "https://hbase.apache.org"
url "https://www.apache.org/dyn/closer.cgi?path=hbase/hbase-1.3.4/hbase-1.3.4-bin.tar.gz"
mirror "https://archive.apache.org/dist/hbase/1.3.4/hbase-1.3.4-bin.tar.gz"
sha256 "cb4a90101d77b369e79f5c816b2c04be2e25d77c954560139608ae3cbf0c629f"
bottle do
sha256 "e1327223be7395aeb678ebc1d6984bbe5a5e4dfaefdab2522089458cb8e13204" => :mojave
sha256 "fa047bafe2cb95a57703eea0b15287cf0aefe384a4c07d2f579d75de73769e12" => :high_sierra
sha256 "450dcab9bd5639f0fc516e7ab293d049e4c3c0295986f25a18e9fe5ff7d25ab8" => :sierra
end
depends_on "ant" => :build
# 64 bit is required because of three things:
# the lzo jar has a native extension
# building native extensions requires a version of java that matches the architecture
# there is no 32 bit version of java for macOS since Java 1.7, and 1.8 is required for hbase
depends_on :arch => :x86_64
depends_on :java => "1.8"
depends_on "lzo"
resource "hadoop-lzo" do
url "https://github.com/cloudera/hadoop-lzo/archive/0.4.14.tar.gz"
sha256 "aa8ddbb8b3f9e1c4b8cc3523486acdb7841cd97c002a9f2959c5b320c7bb0e6c"
end
def install
rm_f Dir["bin/*.cmd", "conf/*.cmd"]
libexec.install %w[bin conf docs lib hbase-webapps]
# Some binaries have really generic names (like `test`) and most seem to be
# too special-purpose to be permanently available via PATH.
%w[hbase start-hbase.sh stop-hbase.sh].each do |script|
(bin/script).write_env_script "#{libexec}/bin/#{script}", Language::Java.java_home_env("1.8")
end
resource("hadoop-lzo").stage do
# Fixed upstream: https://github.com/cloudera/hadoop-lzo/blob/master/build.xml#L235
inreplace "build.xml",
%r{()},
"\\1\n"
ENV["CLASSPATH"] = Dir["#{libexec}/lib/hadoop-common-*.jar"].first
ENV["CFLAGS"] = "-m64"
ENV["CXXFLAGS"] = "-m64"
ENV["CPPFLAGS"] = "-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers"
system "ant", "compile-native", "tar"
(libexec/"lib").install Dir["build/hadoop-lzo-*/hadoop-lzo-*.jar"]
(libexec/"lib/native").install Dir["build/hadoop-lzo-*/lib/native/*"]
end
inreplace "#{libexec}/conf/hbase-env.sh" do |s|
# upstream bugs for ipv6 incompatibility:
# https://issues.apache.org/jira/browse/HADOOP-8568
# https://issues.apache.org/jira/browse/HADOOP-3619
s.gsub!("export HBASE_OPTS=\"-XX:+UseConcMarkSweepGC\"",
"export HBASE_OPTS=\"-Djava.net.preferIPv4Stack=true -XX:+UseConcMarkSweepGC\"")
s.gsub!("# export JAVA_HOME=/usr/java/jdk1.6.0/",
"export JAVA_HOME=\"$(/usr/libexec/java_home --version 1.8)\"")
# avoid deprecated-option warning issued by Java 8
s.gsub!(" -XX:PermSize=128m -XX:MaxPermSize=128m", "")
# Default `$HBASE_HOME/logs` is unsuitable as it would cause writes to the
# formula's prefix. Provide a better default but still allow override.
s.gsub!(/^# export HBASE_LOG_DIR=.*$/,
"export HBASE_LOG_DIR=\"${HBASE_LOG_DIR:-#{var}/log/hbase}\"")
end
# makes hbase usable out of the box
# upstream has been provided this patch
# https://issues.apache.org/jira/browse/HBASE-15426
inreplace "#{libexec}/conf/hbase-site.xml",
//,
<<~EOS
hbase.rootdir
file://#{var}/hbase
hbase.zookeeper.property.clientPort
2181
hbase.zookeeper.property.dataDir
#{var}/zookeeper
hbase.zookeeper.dns.interface
lo0
hbase.regionserver.dns.interface
lo0
hbase.master.dns.interface
lo0
EOS
end
def post_install
(var/"log/hbase").mkpath
(var/"run/hbase").mkpath
end
plist_options :manual => "#{HOMEBREW_PREFIX}/opt/hbase/bin/start-hbase.sh"
def plist; <<~EOS
KeepAlive
Label
#{plist_name}
EnvironmentVariables
HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m
HBASE_LOG_DIR#{var}/hbase
HBASE_HOME#{opt_libexec}
HBASE_SECURITY_LOGGERINFO,RFAS
HBASE_PID_DIR#{var}/run/hbase
HBASE_NICENESS0
HBASE_IDENT_STRINGroot
HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m
HBASE_OPTS-XX:+UseConcMarkSweepGC
HBASE_ROOT_LOGGERINFO,RFA
HBASE_LOG_PREFIXhbase-root-master
HBASE_LOGFILEhbase-root-master.log
ProgramArguments
#{opt_bin}/hbase
--config
#{opt_libexec}/conf
master
start
RunAtLoad
WorkingDirectory
#{HOMEBREW_PREFIX}
StandardOutPath
#{var}/hbase/hbase.log
StandardErrorPath
#{var}/hbase/hbase.err
EOS
end
test do
assert_match "HBase #{version}", shell_output("#{bin}/hbase version 2>&1")
cp_r (libexec/"conf"), testpath
inreplace (testpath/"conf/hbase-site.xml") do |s|
s.gsub! /(hbase.rootdir.*)\n.*/, "\\1\nfile://#{testpath}/hbase"
s.gsub! /(hbase.zookeeper.property.dataDir.*)\n.*/, "\\1\n#{testpath}/zookeeper"
end
ENV["HBASE_LOG_DIR"] = testpath/"logs"
ENV["HBASE_CONF_DIR"] = testpath/"conf"
ENV["HBASE_PID_DIR"] = testpath/"pid"
system "#{bin}/start-hbase.sh"
sleep 10
begin
assert_match "Zookeeper", pipe_output("nc 127.0.0.1 2181 2>&1", "stats")
ensure
system "#{bin}/stop-hbase.sh"
end
end
end