| /* |
| * 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. |
| */ |
| package org.apache.hadoop.hive.llap; |
| |
| import java.util.Arrays; |
| import java.util.Properties; |
| |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import org.apache.commons.cli.CommandLine; |
| import org.apache.commons.cli.GnuParser; |
| import org.apache.commons.cli.HelpFormatter; |
| import org.apache.commons.cli.OptionBuilder; |
| import org.apache.commons.cli.Options; |
| |
| import org.apache.hadoop.io.NullWritable; |
| import org.apache.hadoop.mapred.RecordReader; |
| import org.apache.hadoop.mapred.JobConf; |
| import org.apache.hadoop.mapred.InputSplit; |
| |
| /** |
| * Utility to test query and data retrieval via the LLAP input format. |
| * llapdump --hiveconf hive.zookeeper.quorum=localhost --hiveconf hive.zookeeper.client.port=2181 --hiveconf hive.llap.daemon.service.hosts=@llap_MiniLlapCluster 'select * from employee where employee_id < 10' |
| * |
| */ |
| public class LlapDump { |
| |
| private static final Logger LOG = LoggerFactory.getLogger(LlapDump.class); |
| |
| private static String url = "jdbc:hive2://localhost:10000/default"; |
| private static String user = "hive"; |
| private static String pwd = ""; |
| private static String query = null; |
| private static String numSplits = "1"; |
| |
| public static void main(String[] args) throws Exception { |
| Options opts = createOptions(); |
| CommandLine cli = new GnuParser().parse(opts, args); |
| |
| if (cli.hasOption('h')) { |
| HelpFormatter formatter = new HelpFormatter(); |
| formatter.printHelp("llapdump", opts); |
| return; |
| } |
| |
| if (cli.hasOption('l')) { |
| url = cli.getOptionValue("l"); |
| } |
| |
| if (cli.hasOption('u')) { |
| user = cli.getOptionValue("u"); |
| } |
| |
| if (cli.hasOption('p')) { |
| pwd = cli.getOptionValue("p"); |
| } |
| |
| if (cli.hasOption('n')) { |
| numSplits = cli.getOptionValue("n"); |
| } |
| |
| Properties configProps = cli.getOptionProperties("hiveconf"); |
| |
| if (cli.getArgs().length > 0) { |
| query = cli.getArgs()[0]; |
| } |
| |
| if (query == null) { |
| throw new IllegalArgumentException("No query string specified"); |
| } |
| |
| System.out.println("url: "+url); |
| System.out.println("user: "+user); |
| System.out.println("query: "+query); |
| |
| LlapRowInputFormat format = new LlapRowInputFormat(); |
| |
| JobConf job = new JobConf(); |
| job.set(LlapBaseInputFormat.URL_KEY, url); |
| job.set(LlapBaseInputFormat.USER_KEY, user); |
| job.set(LlapBaseInputFormat.PWD_KEY, pwd); |
| job.set(LlapBaseInputFormat.QUERY_KEY, query); |
| |
| // Additional conf settings specified on the command line |
| for (String key: configProps.stringPropertyNames()) { |
| job.set(key, configProps.getProperty(key)); |
| } |
| |
| InputSplit[] splits = format.getSplits(job, Integer.parseInt(numSplits)); |
| |
| if (splits.length == 0) { |
| System.out.println("No splits returned - empty scan"); |
| System.out.println("Results: "); |
| } else { |
| boolean first = true; |
| |
| for (InputSplit s: splits) { |
| LOG.info("Processing input split s from " + Arrays.toString(s.getLocations())); |
| RecordReader<NullWritable, Row> reader = format.getRecordReader(s, job, null); |
| |
| if (reader instanceof LlapRowRecordReader && first) { |
| Schema schema = ((LlapRowRecordReader)reader).getSchema(); |
| System.out.println(""+schema); |
| } |
| |
| if (first) { |
| System.out.println("Results: "); |
| System.out.println(""); |
| first = false; |
| } |
| |
| Row value = reader.createValue(); |
| while (reader.next(NullWritable.get(), value)) { |
| printRow(value); |
| } |
| } |
| System.exit(0); |
| } |
| } |
| |
| private static void printRow(Row row) { |
| Schema schema = row.getSchema(); |
| StringBuilder sb = new StringBuilder(); |
| int length = schema.getColumns().size(); |
| for (int idx = 0; idx < length; ++idx) { |
| sb.append(row.getValue(idx)); |
| if (idx != length - 1) { |
| sb.append(", "); |
| } |
| } |
| System.out.println(sb.toString()); |
| } |
| |
| static Options createOptions() { |
| Options result = new Options(); |
| |
| result.addOption(OptionBuilder |
| .withLongOpt("location") |
| .withDescription("HS2 url") |
| .hasArg() |
| .create('l')); |
| |
| result.addOption(OptionBuilder |
| .withLongOpt("user") |
| .withDescription("user name") |
| .hasArg() |
| .create('u')); |
| |
| result.addOption(OptionBuilder |
| .withLongOpt("pwd") |
| .withDescription("password") |
| .hasArg() |
| .create('p')); |
| |
| result.addOption(OptionBuilder |
| .withLongOpt("num") |
| .withDescription("number of splits") |
| .hasArg() |
| .create('n')); |
| |
| result.addOption(OptionBuilder |
| .withValueSeparator() |
| .hasArgs(2) |
| .withArgName("property=value") |
| .withLongOpt("hiveconf") |
| .withDescription("Use value for given property") |
| .create()); |
| |
| result.addOption(OptionBuilder |
| .withLongOpt("help") |
| .withDescription("help") |
| .hasArg(false) |
| .create('h')); |
| |
| return result; |
| } |
| } |