blob: f0407d5595a8d64f2c202ce487e93c518a43f533 [file] [log] [blame]
#!/usr/bin/env perl
############################################################################
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
###########################################################################
# Class: Util
#
# A collection of helper subroutines.
#
package Util;
##############################################################################
# Sub: localTime
#
# Returns:
# A string with the local time
sub localTime() {
my $retval = time();
my $local_time = gmtime( $retval);
return $local_time;
}
##############################################################################
# Sub: formatedTime
# Returns the time with following format "$mday/$mon/$year $hour:$min:$sec $weekday[$wday]"
#
# Returns:
# formated time
sub formatedTime() {
my @weekday = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
my $retval = time();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year = $year + 1900;
$mon += 1;
return "$mday/$mon/$year $hour:$min:$sec $weekday[$wday]\n";
}
##############################################################################
# Sub: execCmd
# Records the command in the log and prints it to stdout before executing.
#
# Paramaters:
# $log - The log object
# $subName - The name of the subroutine the message originated at
# $lineNo - The line number of the subroutine the message originated at
# $cmd - The command string to execute
# $msg - A string, the message to print
# $level - (optional)The logging level for the message: DEBUG, INFO, WARN, ERROR, FATAL
# defaults to DEBUG.
#
# Returns:
# An array containing the output from the executed command.
#
sub execCmd() {
my ( $log, $subName, $lineNo, $cmd, $level ) = @_ ;
my $count = @_;
my $thisSubName = (caller(0))[3];
#Check for errors in arguments
if ( $count < 4 ){
if ( $log ) {
$log->msg( $level, $thisSubName, __LINE__ , "Invalid number of arguments, got $count=( @_ )" );
} else {
print "ERROR: $0 $thisSubName at ".__LINE__."Invalid number of arguments\n";
}
return 1;
}
#Log command, execute commdand, return results
$level = "DEBUG" if ( !$level );
$log->msg( $level, $subName, $lineNo , "$cmd");
my @result = `$cmd`;
$log->msg( $level, $subName, $lineNo , "@cmd") if ( @cmd );
return @result;
}
sub getHadoopCmd
{
my ( $properties ) = @_;
my $subName = (caller(0))[3];
my @baseCmd;
die "$0.$subName: null properties" if (! $properties );
my $cmd;
$cmd = $properties->{'gridstack.root'} . "/hadoop/current/bin/hadoop";
if ( ! -x "$cmd" ) {
print STDERR "\n$0::$subName WARNING: Can't find hadoop command: $cmd\n";
$cmd = `which hadoop`;
chomp $cmd;
print STDERR "$0::$subName WARNING: Instead using command: $cmd\n";
}
if ( ! -x "$cmd" ) {
die "\n$0::$subName FATAL: Hadoop command does not exist: $cmd\n";
}
push (@baseCmd, $cmd);
push (@baseCmd, '--config', $properties->{'testconfigpath'}) if defined($properties->{'testconfigpath'});
return @baseCmd;
}
sub getHiveCmd
{
my ( $properties ) = @_;
my $subName = (caller(0))[3];
my @baseCmd;
die "$0.$subName: null properties" if (! $properties );
my $cmd;
$cmd = $properties->{'hive_bin_location'} . "/hive";
if ( ! -x "$cmd" ) {
die "\n$0::$subName FATAL: Hive command does not exist: $cmd\n";
}
push (@baseCmd, $cmd);
# push (@baseCmd, '--config', $properties->{'testconfigpath'}) if defined($properties->{'testconfigpath'});
return @baseCmd;
}
sub getHowlCmd
{
my ( $properties ) = @_;
my $subName = (caller(0))[3];
my @baseCmd;
die "$0.$subName: null properties" if (! $properties );
my $cmd;
$cmd = $properties->{'howl_bin_location'} . "/howl";
if ( ! -x "$cmd" ) {
die "\n$0::$subName FATAL: Howl command does not exist: $cmd\n";
}
push (@baseCmd, $cmd);
return @baseCmd;
}
sub getPigCmd
{
my $subName = (caller(0))[3];
my $jarkey = shift;
my ( $properties ) = @_;
my $isPigSqlEnabled= 0;
my @baseCmd;
die "$0.$subName: null properties" if (! $properties );
#UGLY HACK for pig sql support
if ( $jarkey =~ /testsql/ ) {
$isPigSqlEnabled= 1;
$jarkey = "testjar";
}
my $cmd;
if ( $properties->{'use-pig.pl'} ) {
# The directive gives that
# 1) the 'pig' command will be called, as opposed to java
# 2) the conf file has full control over what options and parameters are
# passed to pig.
# I.e. no parameters should be passed automatically by the script here.
#
# This allows for testing of the pig script as installed, and for testin of
# the pig script's options, including error testing.
$pigLoc = "/bin/pig";
if ($properties->{'usePython'} eq "true") {
# print "Using python\n";
$pigLoc = "/bin/pig.py";
push(@baseCmd, "python");
}
$cmd = $properties->{'gridstack.root'} . "/pig/" . $properties->{'pigTestBuildName'} . $pigLoc;
if ( ! -x "$cmd" ) {
print STDERR "\n$0::$subName WARNING: Can't find pig command: $cmd\n";
$cmd = `which pig`;
chomp $cmd;
print STDERR "$0::$subName WARNING: Instead using command: $cmd\n";
}
die "\n$0::$subName FATAL: Pig command does not exist: $cmd\n" if ( ! -x $cmd );
push (@baseCmd, $cmd );
if ( $properties->{'use-pig.pl'} eq 'raw' ) { # add _no_ arguments automatically
# !!!
return @baseCmd;
}
} else {
$cmd="java";
# Set JAVA options
# User can provide only one of
# (-c <cluster>) OR (-testjar <jar> -testconfigpath <path>)
# "-c <cluster>" is allowed only in non local mode
if(defined($properties->{'cluster.name'})) {
# use provided cluster
@baseCmd = ($cmd, '-c', $properties->{'cluster.name'});
} else {
die "\n$0::$subName FATAL: The jar file name must be passed in at the command line or defined in the configuration file\n" if ( !defined( $properties->{$jarkey} ) );
die "\n$0::$subName FATAL: The jar file does not exist.\n" . $properties->{$jarkey}."\n" if ( ! -e $properties->{$jarkey} );
# use user provided jar
my $classpath;
if( $properties->{'exectype'} eq "local") {
# in local mode, we should not use
# any hadoop-site.xml
$classpath= "$classpath:" . $properties->{$jarkey};
$classpath= "$classpath:$properties->{'classpath'}" if ( defined( $properties->{'classpath'} ) );
@baseCmd = ($cmd, '-cp', $classpath, '-Xmx1024m');
} else {
# non local mode, we also need to specify
# location of hadoop-site.xml
die "\n$0::$subName FATAL: The hadoop configuration file name must be passed in at the command line or defined in the configuration file\n"
if ( !defined( $properties->{'testconfigpath'} ) );
die "\n$0::$subName FATAL $! " . $properties->{'testconfigpath'}."\n\n"
if (! -e $properties->{'testconfigpath'} );
$classpath= "$classpath:" . $properties->{$jarkey}.":".$properties->{'testconfigpath'};
$classpath= "$classpath:$properties->{'classpath'}" if ( defined( $properties->{'classpath'} ) );
$classpath= "$classpath:$properties->{'howl.jar'}" if ( defined( $properties->{'howl.jar'} ) );
@baseCmd = ($cmd, '-cp', $classpath );
}
}
# sets the queue, for exampel "grideng"
if(defined($properties->{'queue'})) {
push( @baseCmd,'-Dmapred.job.queue.name='.$properties->{'queue'});
}
if(defined($properties->{'additionaljars'})) {
push( @baseCmd,'-Dpig.additional.jars='.$properties->{'additionaljars'});
}
if( ( $isPigSqlEnabled == 1 ) ){
if(defined($properties->{'metadata.uri'})) {
push( @baseCmd, '-Dmetadata.uri='.$properties->{'metadata.uri'});
}
if(defined($properties->{'metadata.impl'})) {
push( @baseCmd, '-Dmetadata.impl='.$properties->{'metadata.impl'});
}else{
push( @baseCmd, '-Dmetadata.impl=org.apache.hadoop.owl.pig.metainterface.OwlPigMetaTables');
}
}
# Add howl support
if(defined($properties->{'howl.metastore.uri'})) {
push( @baseCmd, '-Dhowl.metastore.uri='.$properties->{'howl.metastore.uri'});
}
# Set local mode property
# if ( defined($properties->{'exectype'}) && $properties->{'exectype'}=~ "local" ) {
# Removed above 'if...' for Pig 8.
my $java=`which java`;
my $version=`file $java`;
if ( $version =~ '32-bit' ){
push(@baseCmd,'-Djava.library.path='.$ENV{HADOOP_HOME}.'/lib/native/Linux-i386-32');
} else {
push(@baseCmd,'-Djava.library.path='.$ENV{HADOOP_HOME}.'/lib/native/Linux-amd64-64');
}
# }
# Add user provided java options if they exist
if (defined($properties->{'java_params'})) {
push(@baseCmd, @{$properties->{'java_params'}});
}
if(defined($properties->{'hod'})) {
push( @baseCmd, '-Dhod.server=');
}
# sets the permissions on the jobtracker for the logs
push( @baseCmd,'-Dmapreduce.job.acl-view-job=*');
# Add Main
push(@baseCmd, 'org.apache.pig.Main');
# Set local mode PIG option
if ( defined($properties->{'exectype'}) && $properties->{'exectype'}=~ "local" ) {
push(@baseCmd, '-x');
push(@baseCmd, 'local');
}
# Set Pig SQL options
if( ( $isPigSqlEnabled == 1 ) && defined($properties->{'metadata.uri'})) {
if ( defined($properties->{'testoutpath'}) ) {
push( @baseCmd, '-u' );
push( @baseCmd, $properties->{'testoutpath'} );
}
push( @baseCmd, '-s' );
push( @baseCmd, '-f' );
}
} # end else of if use-pig.pl
# Add -latest or -useversion
if ( $cmd =~ 'pig$' ) {
# Add -latest, or -useversion if 'current' is not target build
if ( defined($properties->{'pigTestBuildName'})) {
if ($properties->{'pigTestBuildName'} eq 'latest') {
push(@baseCmd, '-latest');
} elsif ($properties->{'pigTestBuildName'} ne 'current') {
push(@baseCmd, '-useversion', "$properties->{'pigTestBuildName'}");
}
}
} elsif ( $cmd =~ 'java' ) {
# is this ever used: ???
# Add latest if it's there
if (defined($properties->{'latest'})) {
push(@baseCmd, '-latest');
}
}
return @baseCmd;
}
sub getBasePigSqlCmd
{
my $subName = (caller(0))[3];
Util::getPigCmd( 'testsql', @_ );
}
sub getBasePigCmd
{
my $subName = (caller(0))[3];
Util::getPigCmd( 'testjar', @_ );
}
sub getLatestBasePigCmd
{
my $subName = (caller(0))[3];
Util::getPigCmd( 'latesttestjar', @_ );
}
sub getBenchmarkBasePigCmd
{
my $subName = (caller(0))[3];
my ( $properties ) = @_;
Util::getPigCmd( 'benchmarkjar', @_ );
}
sub setLocale
{
my $locale= shift;
# $locale = "en_US.UTF-8" if ( !$locale );
$locale = "ja_JP.utf8" if ( !$locale );
$ENV[LC_CTYPE]="$locale";
$ENV[LC_NUMERIC]="$locale";
$ENV[LC_TIME]="$locale";
$ENV[LC_COLLATE]="$locale";
$ENV[LC_MONETARY]="$locale";
$ENV[LC_MESSAGES]="$locale";
$ENV[LC_PAPER]="$locale";
$ENV[LC_NAME]="$locale";
$ENV[LC_ADDRESS]="$locale";
$ENV[LC_TELEPHONE]="$locale";
$ENV[LC_MEASUREMENT]="$locale";
$ENV[LC_IDENTIFICATION]="$locale";
}
sub getLocaleCmd
{
my $locale= shift;
$locale = "en_US.UTF-8" if ( !$locale );
return "export LC_CTYPE=\"$locale\";"
."export LC_NUMERIC=\"$locale\";"
."export LC_TIME=\"$locale\";"
."export LC_COLLATE=\"$locale\";"
."export LC_MONETARY=\"$locale\";"
."export LC_MESSAGES=\"$locale\";"
."export LC_PAPER=\"$locale\";"
."export LC_NAME=\"$locale\";"
."export LC_ADDRESS=\"$locale\";"
."export LC_TELEPHONE=\"$locale\";"
."export LC_MEASUREMENT=\"$locale\";"
."export LC_IDENTIFICATION=\"$locale\"";
}
sub isWindows
{
if($^O =~ /mswin/i) {
return 1;
}
else {
return 0;
}
}
sub isCygwin
{
if($^O =~ /cygwin/i) {
return 1;
}
else {
return 0;
}
}
1;