Running Dynamically Generated Hive Queries From a Shell Script

If you want to write a HQL hive query and run it mulitple times from a shell script, each time passing it different data for the query, here is a quick example that should get you started.

The first thing to know is that by specifying n number of -hivevar key value pairs when invoking hive on the command line will allow you to pass that data into the hive process.

For example, if you do the following

$ hive -e 'SELECT * FROM some_table' -hivevar FOO=blah

You will have passed in a key of FOO with the value of ‘blah’ to the hive process.

A more practical example would be wanting to run the same hive query over multiple data partitions.

In this example, I’ve got a hive database that has a ‘packets’ table partitioned by hours which looks like 2014032601.

The hive query file (dest_ip_hive.sql) would look like:

SELECT packets.sourceip FROM packets
WHERE packets.destip = "${hivevar:DEST_IP}"
AND packets.hour = ${hivevar:HOUR}
GROUP BY packets.sourceip

And a shell script that would dynamically set those values for each invocation of hive would look like:

#!/bin/bash

#
# Destination IP that we are using to determine which
# packets we will examine.
#
DEST_IP="10.0.1.10"

for HOUR in 2014032209 2014032210 2014032211 2014032212
do

   echo "Running hive query for HOUR $HOUR"

   # Run a hive query from the command line setting variables that will be
   # expaned in the .sql file.
   hive -hivevar HOUR=$HOUR -hivevar DEST_IP=$DEST_IP \
   -f dest_ip_hive.sql > ${DEST_IP}-{$HOUR}.out

done

For each hour defined in the for loop, we will execute a hive command telling it to run the query contained in the file dest_ip_hive.sql.  The DEST_IP and HOUR variables that will be expanded in the query are passed to hive via the

-hivevar HOUR=$HOUR -hivevar DEST_IP=$DEST_IP

part of the hive command.  And the output for each query will be written to a different file for each query.

Eclipse Android Development Error executing aapt: Cannot run program “/path/to/aapt”: error=2, No such file or directory: error=2, No such file or directory

Even though the ADT bundle provides a 64 bit version, the system requirements indicate that “64-bit distributions must be capable of running 32-bit applications.”  I failed to see that when installing it under Fedora Core 20 and was getting the following error from Eclipse:

Error executing aapt: Cannot run program "/home/rchapin/sdks/adt-bundle-linux-x86_64-20131030/sdk/build-tools/android-4.4/aapt": error=2, No such file or directory: error=2, No such file or directory  android_sdk    line 1   Android ADT Problem

I checked to see if the file was there.  Yep.  I checked to see if was executable.  Yep.

It was only after finding a blog post about it and doing a file command on it that I noticed that it was a 32 bit executable:

file adt-bundle-linux-x86_64-20131030/sdk/build-tools/android-4.4/aapt 
adt-bundle-linux-x86_64-20131030/sdk/build-tools/android-4.4/aapt: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

All I had to do was install the 32 bit libraries that the binaries are linked against:

yum install glibc.i686 zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

Once installed, the error should disappear from Eclipse as it tries to invoke the binaries and do a regular build and/or restarting or cleaning the project should clear the errors.

Setting up Android in Eclipse, Unable to resolve target ‘android-18’

When setting up Eclipse for Android development, after you have installed the Develeper Tools and NDK Plugins and linked to the ADT-bundle and then imported your project (see othere posts related by searching for ‘android’) I got the following error:

[2014-03-24 14:14:53 - android_sdk] Unable to resolve target 'android-18'

I went and checked to make sure that the Platform.MinPlatformToolsRev property in the ~/path/to/adt-bundle-linux-x86_64-20131030/sdk/tools/source.properties matched that of my project.properties file.

They were both 18.  Eh?  Why the error?

So, in Eclipse, I went to the Window > Android SDK Manager and looked at the version of the Android SDK Platform that was installed.  It was:

Android 4.4.2 (API 19) and the checkbox next to SDK Platform under that sub-heading was checked.

So, I went back to my project.properties and updated the target property to:

target=android-19

which eliminated that error.

Invalid Project Description, project path overlaps the location of another project with the same name When Importing Existing Android Project in Eclipse

I’ve got a new install of Eclipse and am setting up to do some Android development.

After getting the Develeper Tools and NDK Plugins installed and linking to the ADT-bundle that I downloaded, I was getting an error when attempting to import the existing project by going to File > Import > Android > Existing Android Code Into Workspace.

The error was:

Invalid project description /some/path/to/project/dir_name overlaps the location of another project: dir_name

After a few searches and a couple of tries, using the File > Import > General > Existing Projects into Workspace seemed to work just fine.

Restarting XServer in Fedora 20

I was having problems logging in this morning to my laptop.  When I entered my password, it just hung.   I pressed Ctrl-f2 to switch to an alternate tty, logged in as root and checked for errors in /var/log/messages.

Not seeing anything, I figured, I’d try and restart the Xserver.  Still not being completely familiar with the sysctl paradigm it wasn’t obvious how to restart it.

So, as root, I simply switched the runlevel to 3, and then back to 5 via the following commands, restarting the Xserver and was then able to login.

# telinit 3

…. wait for a bit ….

# telinit 5

Login, get to work.

s3cmd ‘ERROR: Test failed: 403 (AccessDenied): Access Denied’ and ‘ERROR: Config: verbosity level ’20’ is not valid’ [SOLVED]

I’m working on a project that includes sending data via Amazon Simple Storage Service (S3) and was having some problems configuring and using the s3cmd client.

The first thing I discovered about s3cmd is not to trust what it tells you when invoking s3cmd –configure to get things set up to use the bucket.

$ s3cmd -v --configure s3://some-bucket/some-prefix/

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: thisisanaccesskey
Secret Key: thisisasecretkey

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 
Path to GPG program:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: Y

New settings:
  Access Key: thisisanaccesskey
  Secret Key: thisisasecretkey
  Encryption password: 
  Path to GPG program: None
  Use HTTPS protocol: True
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] y
Please wait, attempting to list bucket: s3://some-bucket/some-prefix/
ERROR: Test failed: 403 (AccessDenied): Access Denied

Retry configuration? [Y/n] n

Save settings? [y/N] y
Configuration saved to '/home/rchapin/.s3cfg'

As you can see, when I ran configure and opted to test the configs, I got a 403 error.  At that point, I assumed that I didn’t have acces to the bucket and went back to the client to try and figure out if I had the right key, if they set up the bucket with the right permissions, blah, blah, blah.

It turns out, that s3cmd simply gave me incorrect information, or the command that it was using to test it wasn’t valid, or it was trying to do something with the bucket that I didn’t have permission to do.

After running the config above, I tried:

$ s3cmd put test.txt s3://some-bucket/some-prefix/
ERROR: Config: verbosity level '20' is not valid
test.txt -> s3://some-bucket/some-prefix/test.txt  [1 of 1]
 15 of 15   100% in    0s    67.58 B/s  done

Turns out that I have access after all.

$ s3cmd ls s3://some-bucket/some-prefix/
ERROR: Config: verbosity level '20' is not valid
2014-03-01 00:25         0   s3://some-bucket/some-prefix/
2014-03-19 14:06        15   s3://some-bucket/some-prefix/test.txt

It also turns out that appending the ‘-v’ arg when configuring s3cmd causes it to throw the ‘ERROR: Config: verbosity level ’20’ is not valid’ error.

If you delete the .s3cfg file in your home dir, and re-run s3cmd –configure without the -v command it should work as expected.

Just don’t trust the s3cmd –configure test . . . test it yourself and you might find that you have access already.

Clone and Backup a Bootable USB Drive

We recently got a new ASUS laptop for the boys to use (I’ll use it too, it’s pretty sweet) which came with Windows 8.

It did not come with the install CD or license key, but included a recovery partition and the key in the BIOS.  Now that we’ve had it for a few weeks and verified that all of the hardware works, we are going to put Ubuntu on it, but I wanted to make sure that I would still be able to use the Windows 8 license on it if I wanted.

So, using the Win8 recovery program, I createad a bootable recovery disk onto a USB stick and I wanted to back it up, as well as be able to make a clone of it if need be.

Following are the dd commands to make that happen:

First, do a tail of /var/log/messages before you plug in the usb drive.  You should see it be recognized by the machine as sd[something].  Or, you can do an fdisk -l and should see the usb stick (as well as the other drives on your machine)

Be warned, make sure that you have the devices correct before you run these commands or you may destroy data on your machine.

Assuming that the usb stick is sdg, clone the disk to a file on another computer

dd if=/dev/sdg of=./windows_8_rcvry_usb_asus.dd conv=notrunc

Copy the file to another USB stick (assuming that /dev/sdg is the USB drive because all data on /dev/sdg will be destroyed during this operation):

dd if=./windows_8_rcvry_usb_asus.dd of=/dev/sdg conv=notrunc

Just make sure that the usb drive to which you are copying is the same size or larger than the original one that you copied from.