Есть ли способ создать таблицу улья, где местом для этой таблицы улья будет http JSON REST API? Я не хочу импортировать данные каждый раз в HDFS.Доступ к данным из REST API в HIVE
ответ
Я столкнулся с аналогичной ситуацией в проекте пару лет назад. Это своего рода сдержанный способ проглатывания данных из Restful to HDFS, а затем вы используете аналитику Hive для реализации бизнес-логики. Надеюсь, вы знакомы с ядром Java, Map Reduce (если вы не можете взглянуть на поток данных Hortonworks, HDF, который является продуктом Hortonworks).
Шаг 1: Рабочий процесс обработки данных не должен быть привязан к рабочему процессу Hive, который содержит бизнес-логику. Это должно выполняться независимо в соответствии с вашим требованием (объем скорость потока данных) и регулярно контролироваться. Я пишу этот код в текстовом редакторе. WARN: Это не скомпилировано или не проверено !!
Код, приведенный ниже, использует Mapper, который принимает URL-адрес или настраивает его, чтобы принять список URL-адресов из FS. Полезная нагрузка или запрошенные данные сохраняются в виде текстового файла в указанном каталоге вывода задания (забудьте структуру данных на этот раз).
Mapper Класс:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class HadoopHttpClientMap extends Mapper<LongWritable, Text, Text, Text> {
private int file = 0;
private String jobOutDir;
private String taskId;
@Override
protected void setup(Context context) throws IOException,InterruptedException {
super.setup(context);
jobOutDir = context.getOutputValueClass().getName();
taskId = context.getJobID().toString();
}
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
Path httpDest = new Path(jobOutDir, taskId + "_http_" + (file++));
InputStream is = null;
OutputStream os = null;
URLConnection connection;
try {
connection = new URL(value.toString()).openConnection();
//implement connection timeout logics
//authenticate.. etc
is = connection.getInputStream();
os = FileSystem.getLocal(context.getConfiguration()).create(httpDest,true);
IOUtils.copyBytes(is, os, context.getConfiguration(), true);
} catch(Throwable t){
t.printStackTrace();
}finally {
IOUtils.closeStream(is);
IOUtils.closeStream(os);
}
context.write(value, null);
//context.write(new Text (httpDest.getName()), new Text (os.toString()));
}
}
Mapper Только Работа:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class HadoopHttpClientJob {
private static final String data_input_directory = “YOUR_INPUT_DIR”;
private static final String data_output_directory = “YOUR_OUTPUT_DIR”;
public HadoopHttpClientJob() {
}
public static void main(String... args) {
try {
Configuration conf = new Configuration();
Path test_data_in = new Path(data_input_directory, "urls.txt");
Path test_data_out = new Path(data_output_directory);
@SuppressWarnings("deprecation")
Job job = new Job(conf, "HadoopHttpClientMap" + System.currentTimeMillis());
job.setJarByClass(HadoopHttpClientJob.class);
FileSystem fs = FileSystem.get(conf);
fs.delete(test_data_out, true);
job.setMapperClass(HadoopHttpClientMap.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setNumReduceTasks(0);
FileInputFormat.addInputPath(job, test_data_in);
FileOutputFormat.setOutputPath(job, test_data_out);
job.waitForCompletion(true);
}catch (Throwable t){
t.printStackTrace();
}
}
}
Шаг 2: Создание внешней таблицы в улье на основе каталога HDFS. Не забудьте использовать Hive SerDe для данных JSON (в вашем случае), тогда вы можете скопировать данные из внешней таблицы в управляемые основные таблицы. Это шаг, на котором вы реализуете свои инкрементные логики, сжатие.
Шаг 3: Поместите ваши запросы на улей (которые вы, возможно, уже создали) на главную таблицу, чтобы реализовать ваши бизнес-потребности.
Примечание. Если вы предположительно ссылаетесь на анализ в реальном времени или потоковое использование api, возможно, вам придется изменить архитектуру вашего приложения. Поскольку вы задали архитектурный вопрос, я использую свое лучшее обоснованное предположение, чтобы поддержать вас. Пожалуйста, пройдите через это один раз. Если вы чувствуете, что можете реализовать это в своем приложении, тогда вы можете задать конкретный вопрос, я постараюсь изо всех сил обратиться к ним.
- 1. Доступ к данным ответа REST
- 2. Доступ к данным Hive с использованием Python
- 3. Доступ к данным Hadoop с использованием службы REST
- 4. Доступ к возвращенным данным из вызова API
- 5. REST API зарегистрированный пользователь может получить доступ к данным (parse.com)
- 6. Pyramid REST API: Как безопасно обрабатывать параллельный доступ к данным?
- 7. Доступ к данным API прогноза
- 8. Доступ к данным JSON из ответа Neo4j REST в Angularjs
- 9. Доступ к REST api из Windows CE
- 10. symfony2: доступ к REST api из команды
- 11. Доступ к методам пользователя из REST API
- 12. Интеграция в Hive и HBase - проблема с доступом к данным
- 13. Доступ к pushbots REST Api из java
- 14. Heroku: инкапсулировать доступ к данным в API
- 15. Безопасный доступ к данным для API RESTful
- 16. Доступ к данным из simpleXMLElementObject
- 17. Доступ к данным необработанного изображения в API
- 18. Доступ к данным из jcr из jsp
- 19. доступ к данным Google Analytics через api
- 20. Доступ к данным из файла
- 21. Доступ к данным из адреса
- 22. Доступ к данным из сервлета
- 23. Доступ к данным из коллекции
- 24. Доступ к данным из Vector3f
- 25. Доступ к данным из NSDictionary
- 26. Доступ к данным из MPI_Irecv()
- 27. Доступ к данным из Apex
- 28. Доступ к данным из websql
- 29. Доступ к данным из XML
- 30. Доступ к данным из RadGridview
Вы спрашиваете, предоставляет ли Hive (или Hadoop) API JSON REST для баз данных Hive? Я думаю, что ответ на этот вопрос - нет. И если у вас нет JSON SerDe над данными, он не выходит как JSON в любом случае. Что мешает вам писать веб-сервис RESTful, который подключается к Hive? –
@ cricket_007 У меня есть много работ по работе с ВИЧ, которые ранее обращались к данным из таблицы ВИЧ. Теперь мне нужно указать все эти задания для чтения данных из некоторого HTTP REST api, который заменяет эти таблицы hive. Не могли бы вы предложить самый простой способ сделать это? – chanchal1987
Извините, я не уверен, что вы спрашиваете. На мой взгляд, API REST не является заменой Hive. В первую очередь потому, что улей несколько медленный для объема данных, которые он предназначен для хранения. Если у вас не так много данных, вы можете задать один и тот же вопрос об REST вокруг базы данных MySQL. –